prediction-market-agent-tooling 0.23.0__tar.gz → 0.25.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/PKG-INFO +1 -3
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/deploy/agent.py +54 -44
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/deploy/agent_example.py +3 -3
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/pyproject.toml +1 -3
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/LICENSE +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/README.md +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/abis/erc20.abi.json +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/abis/omen_dxdao.abi.json +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/abis/omen_fpmm.abi.json +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/abis/omen_fpmm_conditionaltokens.abi.json +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/abis/omen_fpmm_factory.abi.json +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/abis/omen_kleros.abi.json +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/abis/omen_oracle.abi.json +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/abis/omen_realitio.abi.json +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/abis/wxdai.abi.json +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/benchmark/__init__.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/benchmark/agents.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/benchmark/benchmark.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/benchmark/utils.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/config.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/deploy/constants.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/deploy/gcp/deploy.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/deploy/gcp/kubernetes_models.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/deploy/gcp/utils.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/gtypes.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/loggers.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/agent_market.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/categorize.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/data_models.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/manifold/__init__.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/manifold/api.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/manifold/data_models.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/manifold/manifold.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/manifold/utils.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/markets.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/omen/__init__.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/omen/data_models.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/omen/omen.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/omen/omen_contracts.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/omen/omen_resolving.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/polymarket/api.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/polymarket/data_models.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/polymarket/data_models_web.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/polymarket/polymarket.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/markets/polymarket/utils.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/monitor/langfuse/langfuse_wrapper.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/monitor/markets/manifold.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/monitor/markets/omen.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/monitor/markets/polymarket.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/monitor/monitor.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/monitor/monitor_app.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/monitor/monitor_settings.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/py.typed +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/balances.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/betting_strategies/kelly_criterion.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/betting_strategies/market_moving.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/betting_strategies/minimum_bet_to_win.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/betting_strategies/stretch_bet_between.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/cache.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/contract.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/costs.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/gnosis_rpc.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/google.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/hexbytes_custom.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/is_predictable.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/parallelism.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/safe.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/singleton.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/utils.py +0 -0
- {prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/prediction_market_agent_tooling/tools/web3_utils.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: prediction-market-agent-tooling
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.25.0
|
4
4
|
Summary: Tools to benchmark, deploy and monitor prediction market agents.
|
5
5
|
Author: Gnosis
|
6
6
|
Requires-Python: >=3.10,<3.12
|
@@ -9,7 +9,6 @@ Classifier: Programming Language :: Python :: 3.10
|
|
9
9
|
Classifier: Programming Language :: Python :: 3.11
|
10
10
|
Provides-Extra: google
|
11
11
|
Provides-Extra: langchain
|
12
|
-
Provides-Extra: mech-client
|
13
12
|
Requires-Dist: autoflake (>=2.2.1,<3.0.0)
|
14
13
|
Requires-Dist: cron-validator (>=1.0.8,<2.0.0)
|
15
14
|
Requires-Dist: eth-account (>=0.8.0,<0.9.0)
|
@@ -25,7 +24,6 @@ Requires-Dist: langchain-community (>=0.0.19)
|
|
25
24
|
Requires-Dist: langchain-openai (>=0.0.5,<0.0.6) ; extra == "langchain"
|
26
25
|
Requires-Dist: langfuse (>=2.27.1,<3.0.0)
|
27
26
|
Requires-Dist: loguru (>=0.7.2,<0.8.0)
|
28
|
-
Requires-Dist: mech-client (>=0.2.13,<0.3.0) ; extra == "mech-client"
|
29
27
|
Requires-Dist: numpy (>=1.26.4,<2.0.0)
|
30
28
|
Requires-Dist: prompt-toolkit (>=3.0.43,<4.0.0)
|
31
29
|
Requires-Dist: pydantic (>=2.6.1,<3.0.0)
|
@@ -84,62 +84,30 @@ class Answer(BaseModel):
|
|
84
84
|
|
85
85
|
|
86
86
|
class DeployableAgent:
|
87
|
-
bet_on_n_markets_per_run: int = 1
|
88
|
-
|
89
87
|
def __init__(self) -> None:
|
90
88
|
self.langfuse_wrapper = LangfuseWrapper(agent_name=self.__class__.__name__)
|
91
89
|
self.load()
|
92
90
|
|
93
91
|
def __init_subclass__(cls, **kwargs: t.Any) -> None:
|
94
|
-
if
|
92
|
+
if "DeployableAgent" not in str(
|
93
|
+
cls.__init__
|
94
|
+
) and "DeployableTraderAgent" not in str(cls.__init__):
|
95
95
|
raise TypeError(
|
96
|
-
"Cannot override __init__ method of
|
96
|
+
"Cannot override __init__ method of deployable agent class, please override the `load` method to set up the agent."
|
97
97
|
)
|
98
98
|
|
99
99
|
def load(self) -> None:
|
100
100
|
pass
|
101
101
|
|
102
|
-
def have_bet_on_market_since(self, market: AgentMarket, since: timedelta) -> bool:
|
103
|
-
return have_bet_on_market_since(keys=APIKeys(), market=market, since=since)
|
104
|
-
|
105
|
-
def pick_markets(self, markets: t.Sequence[AgentMarket]) -> t.Sequence[AgentMarket]:
|
106
|
-
"""
|
107
|
-
Subclasses can implement their own logic instead of this one, or on top of this one.
|
108
|
-
By default, it picks only the first {n_markets_per_run} markets where user didn't bet recently and it's a reasonable question.
|
109
|
-
"""
|
110
|
-
picked: list[AgentMarket] = []
|
111
|
-
|
112
|
-
for market in markets:
|
113
|
-
if len(picked) >= self.bet_on_n_markets_per_run:
|
114
|
-
break
|
115
|
-
|
116
|
-
if self.have_bet_on_market_since(market, since=timedelta(hours=24)):
|
117
|
-
continue
|
118
|
-
|
119
|
-
# Do as a last check, as it uses paid OpenAI API.
|
120
|
-
if not is_predictable_binary(market.question):
|
121
|
-
continue
|
122
|
-
|
123
|
-
picked.append(market)
|
124
|
-
|
125
|
-
return picked
|
126
|
-
|
127
|
-
def answer_binary_market(self, market: AgentMarket) -> Answer | None:
|
128
|
-
"""
|
129
|
-
Answer the binary market. This method must be implemented by the subclass.
|
130
|
-
"""
|
131
|
-
raise NotImplementedError("This method must be implemented by the subclass")
|
132
|
-
|
133
102
|
def deploy_local(
|
134
103
|
self,
|
135
104
|
market_type: MarketType,
|
136
105
|
sleep_time: float,
|
137
106
|
timeout: float,
|
138
|
-
place_bet: bool,
|
139
107
|
) -> None:
|
140
108
|
start_time = time.time()
|
141
109
|
while True:
|
142
|
-
self.run(market_type=market_type
|
110
|
+
self.run(market_type=market_type)
|
143
111
|
time.sleep(sleep_time)
|
144
112
|
if time.time() - start_time > timeout:
|
145
113
|
break
|
@@ -223,6 +191,51 @@ def {entrypoint_function_name}(request) -> str:
|
|
223
191
|
if cron_schedule:
|
224
192
|
schedule_deployed_gcp_function(fname, cron_schedule=cron_schedule)
|
225
193
|
|
194
|
+
def run(self, market_type: MarketType) -> None:
|
195
|
+
raise NotImplementedError("This method must be implemented by the subclass.")
|
196
|
+
|
197
|
+
def get_gcloud_fname(self, market_type: MarketType) -> str:
|
198
|
+
return f"{self.__class__.__name__.lower()}-{market_type}-{datetime.now().strftime('%Y-%m-%d--%H-%M-%S')}"
|
199
|
+
|
200
|
+
|
201
|
+
class DeployableTraderAgent(DeployableAgent):
|
202
|
+
bet_on_n_markets_per_run: int = 1
|
203
|
+
|
204
|
+
def __init__(self, place_bet: bool = True) -> None:
|
205
|
+
super().__init__()
|
206
|
+
self.place_bet = place_bet
|
207
|
+
|
208
|
+
def have_bet_on_market_since(self, market: AgentMarket, since: timedelta) -> bool:
|
209
|
+
return have_bet_on_market_since(keys=APIKeys(), market=market, since=since)
|
210
|
+
|
211
|
+
def pick_markets(self, markets: t.Sequence[AgentMarket]) -> t.Sequence[AgentMarket]:
|
212
|
+
"""
|
213
|
+
Subclasses can implement their own logic instead of this one, or on top of this one.
|
214
|
+
By default, it picks only the first {n_markets_per_run} markets where user didn't bet recently and it's a reasonable question.
|
215
|
+
"""
|
216
|
+
picked: list[AgentMarket] = []
|
217
|
+
|
218
|
+
for market in markets:
|
219
|
+
if len(picked) >= self.bet_on_n_markets_per_run:
|
220
|
+
break
|
221
|
+
|
222
|
+
if self.have_bet_on_market_since(market, since=timedelta(hours=24)):
|
223
|
+
continue
|
224
|
+
|
225
|
+
# Do as a last check, as it uses paid OpenAI API.
|
226
|
+
if not is_predictable_binary(market.question):
|
227
|
+
continue
|
228
|
+
|
229
|
+
picked.append(market)
|
230
|
+
|
231
|
+
return picked
|
232
|
+
|
233
|
+
def answer_binary_market(self, market: AgentMarket) -> Answer | None:
|
234
|
+
"""
|
235
|
+
Answer the binary market. This method must be implemented by the subclass.
|
236
|
+
"""
|
237
|
+
raise NotImplementedError("This method must be implemented by the subclass")
|
238
|
+
|
226
239
|
def calculate_bet_amount(self, answer: Answer, market: AgentMarket) -> BetAmount:
|
227
240
|
"""
|
228
241
|
Calculate the bet amount. By default, it returns the minimum bet amount.
|
@@ -253,7 +266,7 @@ def {entrypoint_function_name}(request) -> str:
|
|
253
266
|
# Omen is specific, because the user (agent) needs to manually withdraw winnings from the market.
|
254
267
|
redeem_from_all_user_positions(private_credentials)
|
255
268
|
|
256
|
-
def process_bets(self, market_type: MarketType
|
269
|
+
def process_bets(self, market_type: MarketType) -> None:
|
257
270
|
"""
|
258
271
|
Processes bets placed by agents on a given market.
|
259
272
|
"""
|
@@ -264,7 +277,7 @@ def {entrypoint_function_name}(request) -> str:
|
|
264
277
|
if result is None:
|
265
278
|
logger.debug(f"Skipping market {market} as no answer was provided")
|
266
279
|
continue
|
267
|
-
if
|
280
|
+
if self.place_bet:
|
268
281
|
amount = self.calculate_bet_amount(result, market)
|
269
282
|
logger.debug(
|
270
283
|
f"Placing bet on {market} with result {result} and amount {amount}"
|
@@ -277,10 +290,7 @@ def {entrypoint_function_name}(request) -> str:
|
|
277
290
|
def after(self, market_type: MarketType) -> None:
|
278
291
|
pass
|
279
292
|
|
280
|
-
def run(self, market_type: MarketType
|
293
|
+
def run(self, market_type: MarketType) -> None:
|
281
294
|
self.before(market_type)
|
282
|
-
self.process_bets(market_type
|
295
|
+
self.process_bets(market_type)
|
283
296
|
self.after(market_type)
|
284
|
-
|
285
|
-
def get_gcloud_fname(self, market_type: MarketType) -> str:
|
286
|
-
return f"{self.__class__.__name__.lower()}-{market_type}-{datetime.now().strftime('%Y-%m-%d--%H-%M-%S')}"
|
@@ -3,13 +3,13 @@ import typing as t
|
|
3
3
|
|
4
4
|
from prediction_market_agent_tooling.deploy.agent import (
|
5
5
|
Answer,
|
6
|
-
|
6
|
+
DeployableTraderAgent,
|
7
7
|
Probability,
|
8
8
|
)
|
9
9
|
from prediction_market_agent_tooling.markets.agent_market import AgentMarket
|
10
10
|
|
11
11
|
|
12
|
-
class DeployableCoinFlipAgent(
|
12
|
+
class DeployableCoinFlipAgent(DeployableTraderAgent):
|
13
13
|
def pick_markets(self, markets: t.Sequence[AgentMarket]) -> t.Sequence[AgentMarket]:
|
14
14
|
return random.sample(markets, 1)
|
15
15
|
|
@@ -23,6 +23,6 @@ class DeployableCoinFlipAgent(DeployableAgent):
|
|
23
23
|
)
|
24
24
|
|
25
25
|
|
26
|
-
class DeployableAlwaysRaiseAgent(
|
26
|
+
class DeployableAlwaysRaiseAgent(DeployableTraderAgent):
|
27
27
|
def answer_binary_market(self, market: AgentMarket) -> Answer | None:
|
28
28
|
raise RuntimeError("I always raise!")
|
{prediction_market_agent_tooling-0.23.0 → prediction_market_agent_tooling-0.25.0}/pyproject.toml
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "prediction-market-agent-tooling"
|
3
|
-
version = "0.
|
3
|
+
version = "0.25.0"
|
4
4
|
description = "Tools to benchmark, deploy and monitor prediction market agents."
|
5
5
|
authors = ["Gnosis"]
|
6
6
|
readme = "README.md"
|
@@ -40,13 +40,11 @@ safe-eth-py = "^6.0.0b14"
|
|
40
40
|
eth-account = "^0.8.0"
|
41
41
|
prompt-toolkit = "^3.0.43"
|
42
42
|
safe-cli = "^1.0.0"
|
43
|
-
mech-client = { version = "^0.2.13", optional = true }
|
44
43
|
langfuse = "^2.27.1"
|
45
44
|
|
46
45
|
[tool.poetry.extras]
|
47
46
|
langchain = ["langchain", "langchain-openai"]
|
48
47
|
google = ["google-api-python-client"]
|
49
|
-
mech-client = ["mech-client"]
|
50
48
|
|
51
49
|
[tool.poetry.group.dev.dependencies]
|
52
50
|
pytest = "*"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|