compair-core 0.3.4__tar.gz → 0.3.6__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.
Potentially problematic release.
This version of compair-core might be problematic. Click here for more details.
- {compair_core-0.3.4/compair_core.egg-info → compair_core-0.3.6}/PKG-INFO +1 -1
- {compair_core-0.3.4 → compair_core-0.3.6}/compair/models.py +63 -35
- compair_core-0.3.6/compair/utils.py +42 -0
- {compair_core-0.3.4 → compair_core-0.3.6/compair_core.egg-info}/PKG-INFO +1 -1
- {compair_core-0.3.4 → compair_core-0.3.6}/pyproject.toml +1 -1
- compair_core-0.3.4/compair/utils.py +0 -61
- {compair_core-0.3.4 → compair_core-0.3.6}/LICENSE +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/README.md +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair/__init__.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair/celery_app.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair/default_groups.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair/embeddings.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair/feedback.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair/logger.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair/main.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair/schema.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair/tasks.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair_core.egg-info/SOURCES.txt +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair_core.egg-info/dependency_links.txt +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair_core.egg-info/requires.txt +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair_core.egg-info/top_level.txt +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair_email/__init__.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair_email/email.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair_email/email_core.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair_email/templates.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/compair_email/templates_core.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/__init__.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/app.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/deps.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/local_model/__init__.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/local_model/app.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/providers/__init__.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/providers/console_mailer.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/providers/contracts.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/providers/local_storage.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/providers/noop_analytics.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/providers/noop_billing.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/providers/noop_ocr.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/routers/__init__.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/routers/capabilities.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/server/settings.py +0 -0
- {compair_core-0.3.4 → compair_core-0.3.6}/setup.cfg +0 -0
|
@@ -38,7 +38,7 @@ class BaseObject(Base):
|
|
|
38
38
|
|
|
39
39
|
class User(Base):
|
|
40
40
|
__tablename__ = "user"
|
|
41
|
-
|
|
41
|
+
|
|
42
42
|
|
|
43
43
|
user_id: Mapped[str] = mapped_column(String(36), primary_key=True, init=False, default=lambda: str(uuid4()))
|
|
44
44
|
username: Mapped[str] = mapped_column(String(128))
|
|
@@ -73,6 +73,12 @@ class User(Base):
|
|
|
73
73
|
passive_deletes=True,
|
|
74
74
|
)
|
|
75
75
|
|
|
76
|
+
activities = relationship(
|
|
77
|
+
"Activity",
|
|
78
|
+
back_populates="user",
|
|
79
|
+
cascade="all, delete-orphan"
|
|
80
|
+
)
|
|
81
|
+
|
|
76
82
|
def __init__(
|
|
77
83
|
self,
|
|
78
84
|
username: str,
|
|
@@ -108,17 +114,17 @@ class User(Base):
|
|
|
108
114
|
|
|
109
115
|
class Session(Base):
|
|
110
116
|
__tablename__ = "session"
|
|
111
|
-
|
|
117
|
+
|
|
112
118
|
|
|
113
119
|
id: Mapped[str] = mapped_column(String(128), primary_key=True, init=True)
|
|
114
|
-
user_id: Mapped[str] = mapped_column(ForeignKey("
|
|
120
|
+
user_id: Mapped[str] = mapped_column(ForeignKey("user.user_id", ondelete="CASCADE"), index=True)
|
|
115
121
|
datetime_created: Mapped[datetime]
|
|
116
122
|
datetime_valid_until: Mapped[datetime]
|
|
117
123
|
|
|
118
124
|
|
|
119
125
|
class Group(BaseObject):
|
|
120
126
|
__tablename__ = "group"
|
|
121
|
-
|
|
127
|
+
|
|
122
128
|
|
|
123
129
|
group_id: Mapped[str] = mapped_column(String(36), primary_key=True, init=False, default=lambda: str(uuid4()))
|
|
124
130
|
name: Mapped[str] = mapped_column(String(256))
|
|
@@ -133,6 +139,12 @@ class Group(BaseObject):
|
|
|
133
139
|
documents = relationship("Document", secondary="document_to_group", back_populates="groups")
|
|
134
140
|
notes = relationship("Note", secondary="note_to_group", back_populates="groups")
|
|
135
141
|
|
|
142
|
+
activities = relationship(
|
|
143
|
+
"Activity",
|
|
144
|
+
back_populates="group",
|
|
145
|
+
cascade="all, delete-orphan"
|
|
146
|
+
)
|
|
147
|
+
|
|
136
148
|
__mapper_args__ = {"primary_key": [group_id]}
|
|
137
149
|
|
|
138
150
|
@property
|
|
@@ -150,10 +162,10 @@ class Group(BaseObject):
|
|
|
150
162
|
|
|
151
163
|
class Administrator(Base):
|
|
152
164
|
__tablename__ = "administrator"
|
|
153
|
-
|
|
165
|
+
|
|
154
166
|
|
|
155
167
|
admin_id: Mapped[str] = mapped_column(String(36), primary_key=True, init=False, default=lambda: str(uuid4()))
|
|
156
|
-
user_id: Mapped[str] = mapped_column(ForeignKey("
|
|
168
|
+
user_id: Mapped[str] = mapped_column(ForeignKey("user.user_id", ondelete="CASCADE"), index=True)
|
|
157
169
|
|
|
158
170
|
user = relationship("User")
|
|
159
171
|
groups = relationship("Group", secondary="admin_to_group", back_populates="admins")
|
|
@@ -161,11 +173,11 @@ class Administrator(Base):
|
|
|
161
173
|
|
|
162
174
|
class JoinRequest(Base):
|
|
163
175
|
__tablename__ = "join_request"
|
|
164
|
-
|
|
176
|
+
|
|
165
177
|
|
|
166
178
|
request_id: Mapped[int] = mapped_column(Identity(), primary_key=True, autoincrement=True, init=False)
|
|
167
|
-
user_id: Mapped[str] = mapped_column(ForeignKey("
|
|
168
|
-
group_id: Mapped[str] = mapped_column(ForeignKey("
|
|
179
|
+
user_id: Mapped[str] = mapped_column(ForeignKey("user.user_id", ondelete="CASCADE"))
|
|
180
|
+
group_id: Mapped[str] = mapped_column(ForeignKey("group.group_id", ondelete="CASCADE"))
|
|
169
181
|
datetime_requested: Mapped[datetime] = mapped_column(default=datetime.now(timezone.utc), init=False)
|
|
170
182
|
|
|
171
183
|
user = relationship("User")
|
|
@@ -174,11 +186,11 @@ class JoinRequest(Base):
|
|
|
174
186
|
|
|
175
187
|
class GroupInvitation(Base):
|
|
176
188
|
__tablename__ = "group_invitation"
|
|
177
|
-
|
|
189
|
+
|
|
178
190
|
|
|
179
191
|
invitation_id: Mapped[int] = mapped_column(Integer, Identity(), primary_key=True, autoincrement=True, init=False)
|
|
180
|
-
group_id: Mapped[str] = mapped_column(ForeignKey("
|
|
181
|
-
inviter_id: Mapped[str] = mapped_column(ForeignKey("
|
|
192
|
+
group_id: Mapped[str] = mapped_column(ForeignKey("group.group_id", ondelete="CASCADE"))
|
|
193
|
+
inviter_id: Mapped[str] = mapped_column(ForeignKey("user.user_id", ondelete="CASCADE"))
|
|
182
194
|
token: Mapped[str] = mapped_column(String(64), unique=True, nullable=False)
|
|
183
195
|
email: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
|
184
196
|
datetime_expiration: Mapped[datetime]
|
|
@@ -191,10 +203,10 @@ class GroupInvitation(Base):
|
|
|
191
203
|
|
|
192
204
|
class Document(BaseObject):
|
|
193
205
|
__tablename__ = "document"
|
|
194
|
-
|
|
206
|
+
|
|
195
207
|
|
|
196
208
|
document_id: Mapped[str] = mapped_column(String(36), primary_key=True, init=False, default=lambda: str(uuid4()))
|
|
197
|
-
user_id: Mapped[str] = mapped_column(ForeignKey("
|
|
209
|
+
user_id: Mapped[str] = mapped_column(ForeignKey("user.user_id", ondelete="CASCADE"), index=True)
|
|
198
210
|
author_id: Mapped[str]
|
|
199
211
|
title: Mapped[str]
|
|
200
212
|
content: Mapped[str] = mapped_column(Text)
|
|
@@ -230,12 +242,12 @@ class Document(BaseObject):
|
|
|
230
242
|
|
|
231
243
|
class Note(Base):
|
|
232
244
|
__tablename__ = "note"
|
|
233
|
-
|
|
245
|
+
|
|
234
246
|
|
|
235
247
|
note_id: Mapped[str] = mapped_column(String(36), primary_key=True, init=False, default=lambda: str(uuid4()))
|
|
236
|
-
document_id: Mapped[str] = mapped_column(ForeignKey("
|
|
237
|
-
author_id: Mapped[str] = mapped_column(ForeignKey("
|
|
238
|
-
group_id: Mapped[str | None] = mapped_column(ForeignKey("
|
|
248
|
+
document_id: Mapped[str] = mapped_column(ForeignKey("document.document_id", ondelete="CASCADE"), index=True)
|
|
249
|
+
author_id: Mapped[str] = mapped_column(ForeignKey("user.user_id", ondelete="CASCADE"), index=True)
|
|
250
|
+
group_id: Mapped[str | None] = mapped_column(ForeignKey("group.group_id", ondelete="CASCADE"), index=True, nullable=True)
|
|
239
251
|
content: Mapped[str] = mapped_column(Text)
|
|
240
252
|
datetime_created: Mapped[datetime] = mapped_column(default=datetime.now(timezone.utc))
|
|
241
253
|
embedding = mapped_column(Vector(1536))
|
|
@@ -259,13 +271,13 @@ class Note(Base):
|
|
|
259
271
|
|
|
260
272
|
class Chunk(Base):
|
|
261
273
|
__tablename__ = "chunk"
|
|
262
|
-
|
|
274
|
+
|
|
263
275
|
|
|
264
276
|
chunk_id: Mapped[str] = mapped_column(String(36), primary_key=True, init=False, default=lambda: str(uuid4()))
|
|
265
277
|
hash: Mapped[str] = mapped_column(String(32))
|
|
266
278
|
content: Mapped[str] = mapped_column(Text)
|
|
267
|
-
document_id: Mapped[str | None] = mapped_column(ForeignKey("
|
|
268
|
-
note_id: Mapped[str | None] = mapped_column(ForeignKey("
|
|
279
|
+
document_id: Mapped[str | None] = mapped_column(ForeignKey("document.document_id", ondelete="CASCADE"), index=True, nullable=True)
|
|
280
|
+
note_id: Mapped[str | None] = mapped_column(ForeignKey("note.note_id", ondelete="CASCADE"), index=True, nullable=True)
|
|
269
281
|
chunk_type: Mapped[str] = mapped_column(String(16), default="document")
|
|
270
282
|
embedding = mapped_column(Vector(1536))
|
|
271
283
|
|
|
@@ -287,12 +299,12 @@ class Chunk(Base):
|
|
|
287
299
|
|
|
288
300
|
class Reference(Base):
|
|
289
301
|
__tablename__ = "reference"
|
|
290
|
-
|
|
302
|
+
|
|
291
303
|
|
|
292
304
|
reference_id: Mapped[str] = mapped_column(String(36), primary_key=True, init=False, default=lambda: str(uuid4()))
|
|
293
|
-
source_chunk_id: Mapped[str] = mapped_column(ForeignKey("
|
|
294
|
-
reference_document_id: Mapped[str | None] = mapped_column(ForeignKey("
|
|
295
|
-
reference_note_id: Mapped[str | None] = mapped_column(ForeignKey("
|
|
305
|
+
source_chunk_id: Mapped[str] = mapped_column(ForeignKey("chunk.chunk_id", ondelete="CASCADE"), index=True)
|
|
306
|
+
reference_document_id: Mapped[str | None] = mapped_column(ForeignKey("document.document_id", ondelete="CASCADE"), index=True, nullable=True)
|
|
307
|
+
reference_note_id: Mapped[str | None] = mapped_column(ForeignKey("note.note_id", ondelete="CASCADE"), index=True, nullable=True)
|
|
296
308
|
reference_type: Mapped[str] = mapped_column(String(16), default="document")
|
|
297
309
|
|
|
298
310
|
chunk = relationship("Chunk", back_populates="references")
|
|
@@ -302,10 +314,10 @@ class Reference(Base):
|
|
|
302
314
|
|
|
303
315
|
class Feedback(Base):
|
|
304
316
|
__tablename__ = "feedback"
|
|
305
|
-
|
|
317
|
+
|
|
306
318
|
|
|
307
319
|
feedback_id: Mapped[str] = mapped_column(String(36), primary_key=True, init=False, default=lambda: str(uuid4()))
|
|
308
|
-
source_chunk_id: Mapped[str] = mapped_column(ForeignKey("
|
|
320
|
+
source_chunk_id: Mapped[str] = mapped_column(ForeignKey("chunk.chunk_id", ondelete="CASCADE"), index=True)
|
|
309
321
|
feedback: Mapped[str] = mapped_column(Text)
|
|
310
322
|
model: Mapped[str] = mapped_column(Text)
|
|
311
323
|
timestamp: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=datetime.now(timezone.utc))
|
|
@@ -315,34 +327,50 @@ class Feedback(Base):
|
|
|
315
327
|
chunk = relationship("Chunk", back_populates="feedbacks")
|
|
316
328
|
|
|
317
329
|
|
|
330
|
+
class Activity(Base):
|
|
331
|
+
__tablename__ = "activity"
|
|
332
|
+
|
|
333
|
+
activity_id: Mapped[int] = mapped_column(Identity(), primary_key=True, init=False, autoincrement=True)
|
|
334
|
+
user_id: Mapped[str] = mapped_column(ForeignKey("user.user_id", ondelete="CASCADE"), nullable=False)
|
|
335
|
+
group_id: Mapped[str] = mapped_column(ForeignKey("group.group_id", ondelete="CASCADE"), nullable=False)
|
|
336
|
+
action: Mapped[str] = mapped_column(String(32))
|
|
337
|
+
object_id: Mapped[str] = mapped_column(String(36))
|
|
338
|
+
object_name: Mapped[str] = mapped_column(Text)
|
|
339
|
+
object_type: Mapped[str] = mapped_column(String(32))
|
|
340
|
+
timestamp: Mapped[datetime] = mapped_column(default=datetime.now(timezone.utc))
|
|
341
|
+
|
|
342
|
+
user = relationship("User", back_populates="activities", lazy="joined")
|
|
343
|
+
group = relationship("Group", back_populates="activities")
|
|
344
|
+
|
|
345
|
+
|
|
318
346
|
user_to_group_table = Table(
|
|
319
347
|
"user_to_group",
|
|
320
348
|
Base.metadata,
|
|
321
|
-
Column("user_id", ForeignKey("
|
|
322
|
-
Column("group_id", ForeignKey("
|
|
349
|
+
Column("user_id", ForeignKey("user.user_id", ondelete="CASCADE"), primary_key=True),
|
|
350
|
+
Column("group_id", ForeignKey("group.group_id", ondelete="CASCADE"), primary_key=True),
|
|
323
351
|
)
|
|
324
352
|
|
|
325
353
|
|
|
326
354
|
admin_to_group_table = Table(
|
|
327
355
|
"admin_to_group",
|
|
328
356
|
Base.metadata,
|
|
329
|
-
Column("admin_id", ForeignKey("
|
|
330
|
-
Column("group_id", ForeignKey("
|
|
357
|
+
Column("admin_id", ForeignKey("administrator.admin_id", ondelete="CASCADE"), primary_key=True),
|
|
358
|
+
Column("group_id", ForeignKey("group.group_id", ondelete="CASCADE"), primary_key=True),
|
|
331
359
|
)
|
|
332
360
|
|
|
333
361
|
|
|
334
362
|
document_to_group_table = Table(
|
|
335
363
|
"document_to_group",
|
|
336
364
|
Base.metadata,
|
|
337
|
-
Column("document_id", ForeignKey("
|
|
338
|
-
Column("group_id", ForeignKey("
|
|
365
|
+
Column("document_id", ForeignKey("document.document_id", ondelete="CASCADE"), primary_key=True),
|
|
366
|
+
Column("group_id", ForeignKey("group.group_id", ondelete="CASCADE"), primary_key=True),
|
|
339
367
|
)
|
|
340
368
|
|
|
341
369
|
note_to_group_table = Table(
|
|
342
370
|
"note_to_group",
|
|
343
371
|
Base.metadata,
|
|
344
|
-
Column("note_id", ForeignKey("
|
|
345
|
-
Column("group_id", ForeignKey("
|
|
372
|
+
Column("note_id", ForeignKey("note.note_id", ondelete="CASCADE"), primary_key=True),
|
|
373
|
+
Column("group_id", ForeignKey("group.group_id", ondelete="CASCADE"), primary_key=True),
|
|
346
374
|
)
|
|
347
375
|
|
|
348
376
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import secrets
|
|
4
|
+
from datetime import datetime, timedelta, timezone
|
|
5
|
+
|
|
6
|
+
from sqlalchemy.orm import Session
|
|
7
|
+
|
|
8
|
+
from compair.models import Activity
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def chunk_text(text: str) -> list[str]:
|
|
12
|
+
chunks = text.split("\n\n")
|
|
13
|
+
chunks = [c.strip() for c in chunks]
|
|
14
|
+
return [c for c in chunks if c]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def generate_verification_token() -> tuple[str, datetime]:
|
|
18
|
+
token = secrets.token_urlsafe(32)
|
|
19
|
+
expiration = datetime.now(timezone.utc) + timedelta(hours=24)
|
|
20
|
+
return token, expiration
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def log_activity(
|
|
24
|
+
session: Session,
|
|
25
|
+
user_id: str,
|
|
26
|
+
group_id: str,
|
|
27
|
+
action: str,
|
|
28
|
+
object_id: str,
|
|
29
|
+
object_name: str,
|
|
30
|
+
object_type: str,
|
|
31
|
+
) -> None:
|
|
32
|
+
activity = Activity(
|
|
33
|
+
user_id=user_id,
|
|
34
|
+
group_id=group_id,
|
|
35
|
+
action=action,
|
|
36
|
+
object_id=object_id,
|
|
37
|
+
object_name=object_name,
|
|
38
|
+
object_type=object_type,
|
|
39
|
+
timestamp=datetime.now(timezone.utc),
|
|
40
|
+
)
|
|
41
|
+
session.add(activity)
|
|
42
|
+
session.commit()
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import secrets
|
|
4
|
-
from datetime import datetime, timedelta, timezone
|
|
5
|
-
from typing import Any
|
|
6
|
-
|
|
7
|
-
from sqlalchemy.orm import Session
|
|
8
|
-
|
|
9
|
-
try:
|
|
10
|
-
from compair_cloud.utils import log_activity as cloud_log_activity # type: ignore
|
|
11
|
-
except (ImportError, ModuleNotFoundError):
|
|
12
|
-
cloud_log_activity = None
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def chunk_text(text: str) -> list[str]:
|
|
16
|
-
chunks = text.split("\n\n")
|
|
17
|
-
chunks = [c.strip() for c in chunks]
|
|
18
|
-
return [c for c in chunks if c]
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def generate_verification_token() -> tuple[str, datetime]:
|
|
22
|
-
token = secrets.token_urlsafe(32)
|
|
23
|
-
expiration = datetime.now(timezone.utc) + timedelta(hours=24)
|
|
24
|
-
return token, expiration
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def log_activity(
|
|
28
|
-
session: Session,
|
|
29
|
-
user_id: str,
|
|
30
|
-
group_id: str,
|
|
31
|
-
action: str,
|
|
32
|
-
object_id: str,
|
|
33
|
-
object_name: str,
|
|
34
|
-
object_type: str,
|
|
35
|
-
) -> None:
|
|
36
|
-
if cloud_log_activity:
|
|
37
|
-
cloud_log_activity(
|
|
38
|
-
session=session,
|
|
39
|
-
user_id=user_id,
|
|
40
|
-
group_id=group_id,
|
|
41
|
-
action=action,
|
|
42
|
-
object_id=object_id,
|
|
43
|
-
object_name=object_name,
|
|
44
|
-
object_type=object_type,
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def aggregate_usage_by_user() -> dict[str, Any]:
|
|
49
|
-
if cloud_log_activity:
|
|
50
|
-
from compair_cloud.utils import aggregate_usage_by_user as cloud_usage # type: ignore
|
|
51
|
-
|
|
52
|
-
return cloud_usage()
|
|
53
|
-
return {}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def aggregate_service_resources() -> dict[str, Any]:
|
|
57
|
-
if cloud_log_activity:
|
|
58
|
-
from compair_cloud.utils import aggregate_service_resources as cloud_resources # type: ignore
|
|
59
|
-
|
|
60
|
-
return cloud_resources()
|
|
61
|
-
return {}
|
|
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
|