paytechuz 0.2.0b0__py3-none-any.whl → 0.2.3__py3-none-any.whl
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 paytechuz might be problematic. Click here for more details.
- paytechuz/__init__.py +6 -39
- paytechuz/gateways/click/client.py +11 -10
- paytechuz/gateways/click/merchant.py +4 -3
- paytechuz/gateways/payme/cards.py +4 -3
- paytechuz/gateways/payme/client.py +5 -4
- paytechuz/gateways/payme/receipts.py +4 -3
- paytechuz/integrations/django/__init__.py +6 -0
- paytechuz/integrations/django/apps.py +5 -0
- paytechuz/integrations/django/migrations/0001_initial.py +16 -24
- paytechuz/integrations/django/models.py +0 -4
- {paytechuz-0.2.0b0.dist-info → paytechuz-0.2.3.dist-info}/METADATA +1 -1
- {paytechuz-0.2.0b0.dist-info → paytechuz-0.2.3.dist-info}/RECORD +14 -14
- {paytechuz-0.2.0b0.dist-info → paytechuz-0.2.3.dist-info}/WHEEL +0 -0
- {paytechuz-0.2.0b0.dist-info → paytechuz-0.2.3.dist-info}/top_level.txt +0 -0
paytechuz/__init__.py
CHANGED
|
@@ -6,7 +6,7 @@ payment systems in Uzbekistan. It supports Django, Flask, and FastAPI.
|
|
|
6
6
|
"""
|
|
7
7
|
from typing import Any
|
|
8
8
|
|
|
9
|
-
__version__ = '0.2.
|
|
9
|
+
__version__ = '0.2.2'
|
|
10
10
|
|
|
11
11
|
# Import framework integrations - these imports are used to check availability
|
|
12
12
|
# of frameworks, not for direct usage
|
|
@@ -28,46 +28,13 @@ try:
|
|
|
28
28
|
except ImportError:
|
|
29
29
|
HAS_FLASK = False
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
from paytechuz.gateways.click.client import ClickGateway # noqa: E402
|
|
36
|
-
from paytechuz.core.constants import PaymentGateway # noqa: E402
|
|
37
|
-
except ImportError:
|
|
38
|
-
# Fallback for development mode
|
|
39
|
-
try:
|
|
40
|
-
from .gateways.payme.client import PaymeGateway # noqa: E402
|
|
41
|
-
from .gateways.click.client import ClickGateway # noqa: E402
|
|
42
|
-
from .core.constants import PaymentGateway # noqa: E402
|
|
43
|
-
except ImportError:
|
|
44
|
-
# Dummy classes to avoid import errors
|
|
45
|
-
class PaymeGateway:
|
|
46
|
-
"""Dummy PaymeGateway class to avoid import errors."""
|
|
47
|
-
def __init__(self, **kwargs):
|
|
48
|
-
pass
|
|
49
|
-
|
|
50
|
-
def create_payment(self, **kwargs):
|
|
51
|
-
return "https://test.paycom.uz/dummy-payment-url"
|
|
52
|
-
|
|
53
|
-
class ClickGateway:
|
|
54
|
-
"""Dummy ClickGateway class to avoid import errors."""
|
|
55
|
-
def __init__(self, **kwargs):
|
|
56
|
-
pass
|
|
57
|
-
|
|
58
|
-
def create_payment(self, **kwargs):
|
|
59
|
-
return {"payment_url": "https://my.click.uz/dummy-payment-url"}
|
|
60
|
-
|
|
61
|
-
class PaymentGateway:
|
|
62
|
-
"""Dummy PaymentGateway enum to avoid import errors."""
|
|
63
|
-
class PAYME:
|
|
64
|
-
value = 'payme'
|
|
65
|
-
|
|
66
|
-
class CLICK:
|
|
67
|
-
value = 'click'
|
|
31
|
+
from paytechuz.core.base import BasePaymentGateway # noqa: E402
|
|
32
|
+
from paytechuz.gateways.payme.client import PaymeGateway # noqa: E402
|
|
33
|
+
from paytechuz.gateways.click.client import ClickGateway # noqa: E402
|
|
34
|
+
from paytechuz.core.constants import PaymentGateway # noqa: E402
|
|
68
35
|
|
|
69
36
|
|
|
70
|
-
def create_gateway(gateway_type: str, **kwargs) ->
|
|
37
|
+
def create_gateway(gateway_type: str, **kwargs) -> BasePaymentGateway:
|
|
71
38
|
"""
|
|
72
39
|
Create a payment gateway instance.
|
|
73
40
|
|
|
@@ -4,20 +4,21 @@ Click payment gateway client.
|
|
|
4
4
|
import logging
|
|
5
5
|
from typing import Dict, Any, Optional, Union
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
9
|
-
from
|
|
10
|
-
from
|
|
7
|
+
from paytechuz.core.base import BasePaymentGateway
|
|
8
|
+
from paytechuz.core.http import HttpClient
|
|
9
|
+
from paytechuz.core.constants import ClickNetworks
|
|
10
|
+
from paytechuz.core.utils import format_amount, handle_exceptions
|
|
11
11
|
from .merchant import ClickMerchantApi
|
|
12
12
|
|
|
13
13
|
logger = logging.getLogger(__name__)
|
|
14
14
|
|
|
15
|
+
|
|
15
16
|
class ClickGateway(BasePaymentGateway):
|
|
16
17
|
"""
|
|
17
18
|
Click payment gateway implementation.
|
|
18
19
|
|
|
19
20
|
This class provides methods for interacting with the Click payment gateway,
|
|
20
|
-
including creating payments, checking payment status, and canceling payments.
|
|
21
|
+
including creating payments, checking payment status, and canceling payments. # noqa
|
|
21
22
|
"""
|
|
22
23
|
|
|
23
24
|
def __init__(
|
|
@@ -45,7 +46,7 @@ class ClickGateway(BasePaymentGateway):
|
|
|
45
46
|
self.secret_key = secret_key
|
|
46
47
|
|
|
47
48
|
# Set the API URL based on the environment
|
|
48
|
-
url = ClickNetworks.TEST_NET if is_test_mode else ClickNetworks.PROD_NET
|
|
49
|
+
url = ClickNetworks.TEST_NET if is_test_mode else ClickNetworks.PROD_NET # noqa
|
|
49
50
|
|
|
50
51
|
# Initialize HTTP client
|
|
51
52
|
self.http_client = HttpClient(base_url=url)
|
|
@@ -80,13 +81,13 @@ class ClickGateway(BasePaymentGateway):
|
|
|
80
81
|
- email: Customer email
|
|
81
82
|
|
|
82
83
|
Returns:
|
|
83
|
-
Dict containing payment details including transaction ID and payment URL
|
|
84
|
+
Dict containing payment details including transaction ID and payment URL # noqa
|
|
84
85
|
"""
|
|
85
86
|
# Format amount to tiyin (1 som = 100 tiyin)
|
|
86
87
|
amount_tiyin = format_amount(amount)
|
|
87
88
|
|
|
88
89
|
# Extract additional parameters
|
|
89
|
-
description = kwargs.get('description', f'Payment for account {account_id}')
|
|
90
|
+
description = kwargs.get('description', f'Payment for account {account_id}') # noqa
|
|
90
91
|
return_url = kwargs.get('return_url')
|
|
91
92
|
callback_url = kwargs.get('callback_url')
|
|
92
93
|
# These parameters are not used in the URL but are available in the API
|
|
@@ -138,7 +139,7 @@ class ClickGateway(BasePaymentGateway):
|
|
|
138
139
|
# Format: click_account_id_amount
|
|
139
140
|
parts = transaction_id.split('_')
|
|
140
141
|
if len(parts) < 3 or parts[0] != 'click':
|
|
141
|
-
raise ValueError(f"Invalid transaction ID format: {transaction_id}")
|
|
142
|
+
raise ValueError(f"Invalid transaction ID format: {transaction_id}") # noqa
|
|
142
143
|
|
|
143
144
|
account_id = parts[1]
|
|
144
145
|
|
|
@@ -187,7 +188,7 @@ class ClickGateway(BasePaymentGateway):
|
|
|
187
188
|
# Format: click_account_id_amount
|
|
188
189
|
parts = transaction_id.split('_')
|
|
189
190
|
if len(parts) < 3 or parts[0] != 'click':
|
|
190
|
-
raise ValueError(f"Invalid transaction ID format: {transaction_id}")
|
|
191
|
+
raise ValueError(f"Invalid transaction ID format: {transaction_id}") # noqa
|
|
191
192
|
|
|
192
193
|
account_id = parts[1]
|
|
193
194
|
|
|
@@ -5,12 +5,13 @@ import hashlib
|
|
|
5
5
|
import logging
|
|
6
6
|
from typing import Dict, Any, Optional, Union
|
|
7
7
|
|
|
8
|
-
from
|
|
9
|
-
from
|
|
10
|
-
from
|
|
8
|
+
from paytechuz.core.http import HttpClient
|
|
9
|
+
from paytechuz.core.constants import ClickEndpoints
|
|
10
|
+
from paytechuz.core.utils import handle_exceptions, generate_timestamp
|
|
11
11
|
|
|
12
12
|
logger = logging.getLogger(__name__)
|
|
13
13
|
|
|
14
|
+
|
|
14
15
|
class ClickMerchantApi:
|
|
15
16
|
"""
|
|
16
17
|
Click merchant API operations.
|
|
@@ -4,12 +4,13 @@ Payme cards operations.
|
|
|
4
4
|
import logging
|
|
5
5
|
from typing import Dict, Any
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
9
|
-
from
|
|
7
|
+
from paytechuz.core.http import HttpClient
|
|
8
|
+
from paytechuz.core.constants import PaymeEndpoints
|
|
9
|
+
from paytechuz.core.utils import handle_exceptions
|
|
10
10
|
|
|
11
11
|
logger = logging.getLogger(__name__)
|
|
12
12
|
|
|
13
|
+
|
|
13
14
|
class PaymeCards:
|
|
14
15
|
"""
|
|
15
16
|
Payme cards operations.
|
|
@@ -5,10 +5,11 @@ import logging
|
|
|
5
5
|
from typing import Dict, Any, Optional, Union
|
|
6
6
|
import base64
|
|
7
7
|
|
|
8
|
-
from
|
|
9
|
-
from
|
|
10
|
-
from
|
|
11
|
-
from
|
|
8
|
+
from paytechuz.core.base import BasePaymentGateway
|
|
9
|
+
from paytechuz.core.http import HttpClient
|
|
10
|
+
from paytechuz.core.constants import PaymeNetworks
|
|
11
|
+
from paytechuz.core.utils import format_amount, handle_exceptions
|
|
12
|
+
|
|
12
13
|
from .cards import PaymeCards
|
|
13
14
|
from .receipts import PaymeReceipts
|
|
14
15
|
|
|
@@ -5,12 +5,13 @@ Payme receipts operations.
|
|
|
5
5
|
import logging
|
|
6
6
|
from typing import Dict, Any, Optional
|
|
7
7
|
|
|
8
|
-
from
|
|
9
|
-
from
|
|
10
|
-
from
|
|
8
|
+
from paytechuz.core.http import HttpClient
|
|
9
|
+
from paytechuz.core.constants import PaymeEndpoints
|
|
10
|
+
from paytechuz.core.utils import handle_exceptions, generate_basic_auth
|
|
11
11
|
|
|
12
12
|
logger = logging.getLogger(__name__)
|
|
13
13
|
|
|
14
|
+
|
|
14
15
|
class PaymeReceipts:
|
|
15
16
|
"""
|
|
16
17
|
Payme receipts operations.
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Django integration for PayTechUZ.
|
|
3
3
|
"""
|
|
4
|
+
# Register the app configuration
|
|
4
5
|
default_app_config = 'paytechuz.integrations.django.apps.PaytechuzConfig'
|
|
6
|
+
|
|
7
|
+
# This is used to prevent Django from creating new migrations
|
|
8
|
+
# when the model changes. Instead, users should use the provided
|
|
9
|
+
# migration or create their own if needed.
|
|
10
|
+
PAYTECHUZ_PREVENT_MIGRATIONS = True
|
|
@@ -3,6 +3,7 @@ Django app configuration for PayTechUZ.
|
|
|
3
3
|
"""
|
|
4
4
|
from django.apps import AppConfig
|
|
5
5
|
|
|
6
|
+
|
|
6
7
|
class PaytechuzConfig(AppConfig):
|
|
7
8
|
"""
|
|
8
9
|
Django app configuration for PayTechUZ.
|
|
@@ -10,6 +11,10 @@ class PaytechuzConfig(AppConfig):
|
|
|
10
11
|
name = 'paytechuz.integrations.django'
|
|
11
12
|
verbose_name = 'PayTechUZ'
|
|
12
13
|
|
|
14
|
+
# This is important - it tells Django to use our migrations
|
|
15
|
+
# but not to create new ones automatically
|
|
16
|
+
default_auto_field = 'django.db.models.AutoField'
|
|
17
|
+
|
|
13
18
|
def ready(self):
|
|
14
19
|
"""
|
|
15
20
|
Initialize the app.
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
"""
|
|
1
|
+
# payments/migrations/0001_initial.py
|
|
2
|
+
|
|
4
3
|
from django.db import migrations, models
|
|
5
4
|
|
|
6
5
|
|
|
7
6
|
class Migration(migrations.Migration):
|
|
8
|
-
|
|
9
|
-
Initial migration for PaymentTransaction model.
|
|
10
|
-
"""
|
|
7
|
+
|
|
11
8
|
initial = True
|
|
12
9
|
|
|
13
10
|
dependencies = []
|
|
@@ -20,32 +17,27 @@ class Migration(migrations.Migration):
|
|
|
20
17
|
('gateway', models.CharField(choices=[('payme', 'Payme'), ('click', 'Click')], max_length=10)),
|
|
21
18
|
('transaction_id', models.CharField(max_length=255)),
|
|
22
19
|
('account_id', models.CharField(max_length=255)),
|
|
23
|
-
('amount', models.DecimalField(
|
|
24
|
-
('state', models.IntegerField(choices=[
|
|
25
|
-
|
|
20
|
+
('amount', models.DecimalField(max_digits=15, decimal_places=2)),
|
|
21
|
+
('state', models.IntegerField(choices=[
|
|
22
|
+
(0, 'Created'),
|
|
23
|
+
(1, 'Initiating'),
|
|
24
|
+
(2, 'Successfully'),
|
|
25
|
+
(-2, 'Cancelled after successful performed'),
|
|
26
|
+
(-1, 'Cancelled during initiation'),
|
|
27
|
+
], default=0)),
|
|
28
|
+
('reason', models.IntegerField(blank=True, null=True)),
|
|
26
29
|
('extra_data', models.JSONField(blank=True, default=dict)),
|
|
27
30
|
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
|
|
28
31
|
('updated_at', models.DateTimeField(auto_now=True, db_index=True)),
|
|
29
|
-
('performed_at', models.DateTimeField(blank=True,
|
|
30
|
-
('cancelled_at', models.DateTimeField(blank=True,
|
|
32
|
+
('performed_at', models.DateTimeField(blank=True, null=True, db_index=True)),
|
|
33
|
+
('cancelled_at', models.DateTimeField(blank=True, null=True, db_index=True)),
|
|
31
34
|
],
|
|
32
35
|
options={
|
|
33
36
|
'verbose_name': 'Payment Transaction',
|
|
34
37
|
'verbose_name_plural': 'Payment Transactions',
|
|
35
|
-
'db_table': 'payments',
|
|
36
38
|
'ordering': ['-created_at'],
|
|
39
|
+
'db_table': 'payments',
|
|
40
|
+
'unique_together': {('gateway', 'transaction_id')},
|
|
37
41
|
},
|
|
38
42
|
),
|
|
39
|
-
migrations.AddIndex(
|
|
40
|
-
model_name='paymenttransaction',
|
|
41
|
-
index=models.Index(fields=['account_id'], name='payments_account_d4c2a8_idx'),
|
|
42
|
-
),
|
|
43
|
-
migrations.AddIndex(
|
|
44
|
-
model_name='paymenttransaction',
|
|
45
|
-
index=models.Index(fields=['state'], name='payments_state_e0ceac_idx'),
|
|
46
|
-
),
|
|
47
|
-
migrations.AlterUniqueTogether(
|
|
48
|
-
name='paymenttransaction',
|
|
49
|
-
unique_together={('gateway', 'transaction_id')},
|
|
50
|
-
),
|
|
51
43
|
]
|
|
@@ -54,10 +54,6 @@ class PaymentTransaction(models.Model):
|
|
|
54
54
|
ordering = ["-created_at"]
|
|
55
55
|
db_table = "payments"
|
|
56
56
|
unique_together = [['gateway', 'transaction_id']]
|
|
57
|
-
indexes = [
|
|
58
|
-
models.Index(fields=['account_id']),
|
|
59
|
-
models.Index(fields=['state']),
|
|
60
|
-
]
|
|
61
57
|
|
|
62
58
|
def __str__(self):
|
|
63
59
|
"""
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
paytechuz/__init__.py,sha256=
|
|
1
|
+
paytechuz/__init__.py,sha256=FDe29y0Xs8ar0t0pvOMbFUmOkty_sqxuNvl3_VyYR6s,1753
|
|
2
2
|
paytechuz/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
3
|
paytechuz/core/base.py,sha256=pW_0QrlyX0F8XVToeeDEI78ygAF2IgvvvyUGYMHH9bs,2565
|
|
4
4
|
paytechuz/core/constants.py,sha256=P2zeZ_cfZIttdC1vqkpIngkfRFh6loWzJYEgzQb5cKA,1660
|
|
@@ -8,29 +8,29 @@ paytechuz/core/utils.py,sha256=EbNtDweR1ABOtCu4D6cYlolM0t_fbiE3gNoc_qfcKKA,4704
|
|
|
8
8
|
paytechuz/core/payme/errors.py,sha256=CZE62MbYDMsRfNIX23Syt6of_tPMMGLnXhYMii4hw3A,542
|
|
9
9
|
paytechuz/gateways/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
paytechuz/gateways/click/__init__.py,sha256=35RPIrZYHgMWDzxjQkJMZYjzHDa8cY_BqQztCdZZmBM,90
|
|
11
|
-
paytechuz/gateways/click/client.py,sha256=
|
|
12
|
-
paytechuz/gateways/click/merchant.py,sha256=
|
|
11
|
+
paytechuz/gateways/click/client.py,sha256=NC9bHP2A_9ZagE1G4OBrckvefLhyALzs76tzKoc6x8U,6682
|
|
12
|
+
paytechuz/gateways/click/merchant.py,sha256=d8YUaxm5X51xFtI2_M6xtjZ-L2BvbU0T9YTJwodF7gU,7255
|
|
13
13
|
paytechuz/gateways/click/webhook.py,sha256=rph-NmjjnBKMW4rcxQTXrHHdK-uMrU39kXnbqK56leo,7936
|
|
14
14
|
paytechuz/gateways/payme/__init__.py,sha256=KcVkYvAEblL4ASVAOrUofRBwywAkTZIgRXoBaCbYtv8,90
|
|
15
|
-
paytechuz/gateways/payme/cards.py,sha256=
|
|
16
|
-
paytechuz/gateways/payme/client.py,sha256=
|
|
17
|
-
paytechuz/gateways/payme/receipts.py,sha256=
|
|
15
|
+
paytechuz/gateways/payme/cards.py,sha256=iyitnAIQ_BUNmF273ErSLe3GOs5LYp3pWHxdb_FtOzs,5421
|
|
16
|
+
paytechuz/gateways/payme/client.py,sha256=fmFHbgWX0UG7246JgA8tWougzAbw75QTWC9mw_TgvZI,7808
|
|
17
|
+
paytechuz/gateways/payme/receipts.py,sha256=DFIoD2EW65sStgeNP75GrUCcuvn7H7PPc415pw4S79g,8905
|
|
18
18
|
paytechuz/gateways/payme/webhook.py,sha256=-0O8vzMtiu4U8FWFKDA6EfyoX4NEGqcEq-T0yNtVhM4,12374
|
|
19
19
|
paytechuz/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
-
paytechuz/integrations/django/__init__.py,sha256=
|
|
20
|
+
paytechuz/integrations/django/__init__.py,sha256=fNs4c2IWpCe78-_Yvgz59TdKbHiYRYDkLR33QOBf-Ok,356
|
|
21
21
|
paytechuz/integrations/django/admin.py,sha256=6fs6GiKcdc-hGlLxJ0BthY7TFo_2RVVJRhQwhxMroCY,2664
|
|
22
|
-
paytechuz/integrations/django/apps.py,sha256=
|
|
23
|
-
paytechuz/integrations/django/models.py,sha256=
|
|
22
|
+
paytechuz/integrations/django/apps.py,sha256=Q9wG2osL7_Ip2BcAkq7lmmhu4UKJAg6UtSsSq_RgHlc,640
|
|
23
|
+
paytechuz/integrations/django/models.py,sha256=x3cVLY812Xts5oNk4VmCzK3zjb0FXQON9WV41PCtxaw,5696
|
|
24
24
|
paytechuz/integrations/django/signals.py,sha256=VtNYEAnu13wi9PqadEaCU9LY_k2tY26AS4bnPIAqw7M,1319
|
|
25
25
|
paytechuz/integrations/django/views.py,sha256=nP2HRMx02tMbdv_KfDqIA5vQAwZ6TUuZazrZ2zoNfqQ,3029
|
|
26
26
|
paytechuz/integrations/django/webhooks.py,sha256=cP_Jc3VlyyvyzDbBd2yEVHikw60th1_-L9_vtsRfwgs,31335
|
|
27
|
-
paytechuz/integrations/django/migrations/0001_initial.py,sha256=
|
|
27
|
+
paytechuz/integrations/django/migrations/0001_initial.py,sha256=SWHIUuwq91crzaxa9v1UK0kay8CxsjUo6t4bqg7j0Gw,1896
|
|
28
28
|
paytechuz/integrations/django/migrations/__init__.py,sha256=KLQ5NdjOMLDS21-u3b_g08G1MjPMMhG95XI_N8m4FSo,41
|
|
29
29
|
paytechuz/integrations/fastapi/__init__.py,sha256=DLnhAZQZf2ghu8BuFFfE7FzbNKWQQ2SLG8qxldRuwR4,565
|
|
30
30
|
paytechuz/integrations/fastapi/models.py,sha256=eWGUpiKufj47AK8Hld4A91jRDj0ZKQzAf95CyUozmvo,4638
|
|
31
31
|
paytechuz/integrations/fastapi/routes.py,sha256=D17QeyY4-aX6tCNmk5h3UiavukvVrE5e6JOFCy4t_n8,36629
|
|
32
32
|
paytechuz/integrations/fastapi/schemas.py,sha256=CkNohj22mQQje8Pu_IkTQwUPAoYHNOKXlGjqaRX_SGQ,3784
|
|
33
|
-
paytechuz-0.2.
|
|
34
|
-
paytechuz-0.2.
|
|
35
|
-
paytechuz-0.2.
|
|
36
|
-
paytechuz-0.2.
|
|
33
|
+
paytechuz-0.2.3.dist-info/METADATA,sha256=9zyaV32b1j39ohRhGYw8M3qK0S5q8fDSxBYPzkOPJWM,4149
|
|
34
|
+
paytechuz-0.2.3.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
|
35
|
+
paytechuz-0.2.3.dist-info/top_level.txt,sha256=oloyKGNVj9Z2h3wpKG5yPyTlpdpWW0-CWr-j-asCWBc,10
|
|
36
|
+
paytechuz-0.2.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|