makea-cli 0.2.5__tar.gz → 0.2.7__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.
- {makea_cli-0.2.5 → makea_cli-0.2.7}/CHANGELOG.md +15 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/PKG-INFO +2 -1
- {makea_cli-0.2.5 → makea_cli-0.2.7}/README.md +1 -0
- makea_cli-0.2.7/makea_cli/__init__.py +1 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/orders/cmd.py +70 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/pyproject.toml +1 -1
- {makea_cli-0.2.5 → makea_cli-0.2.7}/tests/golden_manifest.json +130 -0
- makea_cli-0.2.5/makea_cli/__init__.py +0 -1
- {makea_cli-0.2.5 → makea_cli-0.2.7}/.claude/skills/create-supplier-profile/SKILL.md +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/.claude/skills/lark-cli-setup/SKILL.md +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/.claude/skills/link-supplier-user/SKILL.md +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/.claude/skills/makea-cli-setup/SKILL.md +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/.claude/skills/payment-revenue-report/SKILL.md +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/.claude/skills/supplier-user-id-migration/SKILL.md +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/.gitignore +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea-collection-upload/SKILL.md +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea-collection-upload/scripts/create_products.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/__main__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/api_client.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/auth_pkce.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/broker.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/_util.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/analytics/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/analytics/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/auth/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/auth/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/brand/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/brand/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/designer/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/designer/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/directory/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/directory/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/document/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/document/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/email/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/email/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/factory/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/factory/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/library/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/library/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/metrics/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/metrics/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/orders/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/product/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/product/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/production/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/production/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/production/pricing_spec.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/supplier/__init__.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/commands/supplier/cmd.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/config.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/errors.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/identity.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/main.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/output.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/posthog_client.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/makea_cli/registry.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/npm/makea-cli/README.md +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/npm/makea-cli/makea-cli.mjs +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/npm/makea-cli/package.json +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/tests/test_broker.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/tests/test_output_contract.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/tests/test_persona_commands.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/tests/test_registry.py +0 -0
- {makea_cli-0.2.5 → makea_cli-0.2.7}/uv.lock +0 -0
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.7
|
|
4
|
+
|
|
5
|
+
- `admin update tracking-status ... --silent`: move the orders without
|
|
6
|
+
telling anyone (no email, WhatsApp or WeChat). For parcels that landed long
|
|
7
|
+
before anyone noticed, where a "your order has arrived" email would confuse.
|
|
8
|
+
|
|
9
|
+
## 0.2.6
|
|
10
|
+
|
|
11
|
+
- `admin update tracking-status <kind> <order_id> <tracking_number> --status Delivered`
|
|
12
|
+
(`ask`): tell Makea what the carrier says about one parcel. The 17track API
|
|
13
|
+
is off, so the daily tracking-sweep skill reads the public 17track page and
|
|
14
|
+
posts each delivered parcel here. The backend runs the same path the 17track
|
|
15
|
+
webhook did: status, fan-out to every order sharing the number, and the
|
|
16
|
+
delivered emails. Repeating a Delivered update is a no-op.
|
|
17
|
+
|
|
3
18
|
## 0.2.5
|
|
4
19
|
|
|
5
20
|
The production journey, for the Claude agent on the product channel.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: makea-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7
|
|
4
4
|
Summary: Makea admin CLI (browser login + Makea admin HTTP API)
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Requires-Dist: click<9,>=8.1
|
|
@@ -131,6 +131,7 @@ exit code:`0` 成功 · `2` 用法错 · `3` 未登录或身份与 persona 不
|
|
|
131
131
|
| `makea-cli admin update quote-request` | write(ask) | `PATCH /admin/quote_requests/{quote_request_id}/update` | set a quote request's stage, status and/or due date. Only what you pass is changed. This is the door that unblocks a … | `update-quote-request` |
|
|
132
132
|
| `makea-cli admin update supplier` | write(ask) | `PUT /admin/supplier/update_supplier` | update an existing supplier from a JSON file (admin). Run `makea-cli get-supplier-profile-schema` FIRST to get the fi… | `update-supplier` |
|
|
133
133
|
| `makea-cli admin update tech-spec` | write(ask) | `POST /admin/products/{id}/technical-specifications` | persist specs from a JSON file. | `save-product-tech-spec` |
|
|
134
|
+
| `makea-cli admin update tracking-status` | write(ask) | `POST /admin/tracking/carrier_status` | apply a carrier status looked up by hand (tracking-sweep skill) to one order. Runs the 17track webhook path: status, fan-out, delivered emails (--silent: state only). | — |
|
|
134
135
|
| `makea-cli admin update user` | write(ask) | `PUT /admin/user-profiles/{user_id}/update` | admin updates DynamoDB user profile fields and/or Cognito custom:userType. Allowed --user-type values: "Fashion brand… | `update-user-profile` |
|
|
135
136
|
| `makea-cli admin upload financial-document` | write(auto) | `POST /admin/products/{product_id}/financial_documents` | upload one or more files to AWS S3 and return financial document metadata. | `upload-financial-documents` |
|
|
136
137
|
| `makea-cli admin upload link-document` | write(auto) | `POST /admin/upload_link_document` | upload a file to AWS S3 and return document domain metadata for reuse as input in other commands. | `upload-link-document` |
|
|
@@ -119,6 +119,7 @@ exit code:`0` 成功 · `2` 用法错 · `3` 未登录或身份与 persona 不
|
|
|
119
119
|
| `makea-cli admin update quote-request` | write(ask) | `PATCH /admin/quote_requests/{quote_request_id}/update` | set a quote request's stage, status and/or due date. Only what you pass is changed. This is the door that unblocks a … | `update-quote-request` |
|
|
120
120
|
| `makea-cli admin update supplier` | write(ask) | `PUT /admin/supplier/update_supplier` | update an existing supplier from a JSON file (admin). Run `makea-cli get-supplier-profile-schema` FIRST to get the fi… | `update-supplier` |
|
|
121
121
|
| `makea-cli admin update tech-spec` | write(ask) | `POST /admin/products/{id}/technical-specifications` | persist specs from a JSON file. | `save-product-tech-spec` |
|
|
122
|
+
| `makea-cli admin update tracking-status` | write(ask) | `POST /admin/tracking/carrier_status` | apply a carrier status looked up by hand (tracking-sweep skill) to one order. Runs the 17track webhook path: status, fan-out, delivered emails (--silent: state only). | — |
|
|
122
123
|
| `makea-cli admin update user` | write(ask) | `PUT /admin/user-profiles/{user_id}/update` | admin updates DynamoDB user profile fields and/or Cognito custom:userType. Allowed --user-type values: "Fashion brand… | `update-user-profile` |
|
|
123
124
|
| `makea-cli admin upload financial-document` | write(auto) | `POST /admin/products/{product_id}/financial_documents` | upload one or more files to AWS S3 and return financial document metadata. | `upload-financial-documents` |
|
|
124
125
|
| `makea-cli admin upload link-document` | write(auto) | `POST /admin/upload_link_document` | upload a file to AWS S3 and return document domain metadata for reuse as input in other commands. | `upload-link-document` |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.2.7"
|
|
@@ -314,3 +314,73 @@ def register(app: typer.Typer) -> None:
|
|
|
314
314
|
offset=offset,
|
|
315
315
|
),
|
|
316
316
|
)
|
|
317
|
+
|
|
318
|
+
@command(
|
|
319
|
+
app,
|
|
320
|
+
"admin",
|
|
321
|
+
"update",
|
|
322
|
+
"tracking-status",
|
|
323
|
+
api="POST /admin/tracking/carrier_status",
|
|
324
|
+
side_effects=[
|
|
325
|
+
"moves the order to delivered when the status says so",
|
|
326
|
+
"emails and messages the designer, supplier and admins as the 17track webhook did (none with --silent)",
|
|
327
|
+
],
|
|
328
|
+
approval="ask",
|
|
329
|
+
idempotent=True,
|
|
330
|
+
help=(
|
|
331
|
+
"POST /admin/tracking/carrier_status — apply a carrier status looked up by hand "
|
|
332
|
+
"(the tracking-sweep skill) to one order. Runs the 17track webhook path: status, "
|
|
333
|
+
"fan-out to every order sharing the number, and the delivered emails."
|
|
334
|
+
),
|
|
335
|
+
)
|
|
336
|
+
def update_tracking_status(
|
|
337
|
+
kind: str = typer.Argument(
|
|
338
|
+
...,
|
|
339
|
+
help="sampling | production | restock | shipping | material | reference_sample",
|
|
340
|
+
),
|
|
341
|
+
order_id: str = typer.Argument(..., help="Order id (product id for reference_sample)."),
|
|
342
|
+
tracking_number: str = typer.Argument(..., help="The parcel's tracking number."),
|
|
343
|
+
status: str = typer.Option(
|
|
344
|
+
..., "--status", help="17track status, e.g. Delivered, InTransit."
|
|
345
|
+
),
|
|
346
|
+
sub_status: str | None = typer.Option(None, "--sub-status"),
|
|
347
|
+
event: str | None = typer.Option(None, "--event", help="Latest carrier event text."),
|
|
348
|
+
location: str | None = typer.Option(None, "--location"),
|
|
349
|
+
time_utc: str | None = typer.Option(
|
|
350
|
+
None, "--time", help="Latest event time, ISO 8601 UTC."
|
|
351
|
+
),
|
|
352
|
+
silent: bool = typer.Option(
|
|
353
|
+
False,
|
|
354
|
+
"--silent",
|
|
355
|
+
help="Change state only: no email, WhatsApp or WeChat to anyone. For parcels that landed long ago.",
|
|
356
|
+
),
|
|
357
|
+
) -> None:
|
|
358
|
+
"""
|
|
359
|
+
Tell Makea what the carrier says about one parcel.
|
|
360
|
+
|
|
361
|
+
Output: JSON from the webhook path: success, status, and one entry per
|
|
362
|
+
order the number was fanned out to. Repeating a Delivered update is a
|
|
363
|
+
no-op (no second email). --silent moves the orders without telling
|
|
364
|
+
anyone.
|
|
365
|
+
"""
|
|
366
|
+
track_info = {
|
|
367
|
+
"latest_status": {"status": status, "sub_status": sub_status},
|
|
368
|
+
"latest_event": {
|
|
369
|
+
"description": event,
|
|
370
|
+
"location": location,
|
|
371
|
+
"time_utc": time_utc,
|
|
372
|
+
},
|
|
373
|
+
}
|
|
374
|
+
print_json_or_exit(
|
|
375
|
+
console,
|
|
376
|
+
lambda: api_client.post_json(
|
|
377
|
+
"/admin/tracking/carrier_status",
|
|
378
|
+
{
|
|
379
|
+
"kind": kind,
|
|
380
|
+
"order_id": order_id,
|
|
381
|
+
"tracking_number": tracking_number,
|
|
382
|
+
"track_info": track_info,
|
|
383
|
+
"notify": not silent,
|
|
384
|
+
},
|
|
385
|
+
),
|
|
386
|
+
)
|
|
@@ -3564,6 +3564,136 @@
|
|
|
3564
3564
|
}
|
|
3565
3565
|
]
|
|
3566
3566
|
},
|
|
3567
|
+
{
|
|
3568
|
+
"name": "admin update tracking-status",
|
|
3569
|
+
"persona": "admin",
|
|
3570
|
+
"verb": "update",
|
|
3571
|
+
"noun": "tracking-status",
|
|
3572
|
+
"access": "write",
|
|
3573
|
+
"api": "POST /admin/tracking/carrier_status",
|
|
3574
|
+
"external": null,
|
|
3575
|
+
"side_effects": [
|
|
3576
|
+
"moves the order to delivered when the status says so",
|
|
3577
|
+
"emails and messages the designer, supplier and admins as the 17track webhook did (none with --silent)"
|
|
3578
|
+
],
|
|
3579
|
+
"approval": "ask",
|
|
3580
|
+
"reversible": null,
|
|
3581
|
+
"idempotent": true,
|
|
3582
|
+
"limit": null,
|
|
3583
|
+
"legacy": [],
|
|
3584
|
+
"help": "POST /admin/tracking/carrier_status — apply a carrier status looked up by hand (the tracking-sweep skill) to one order. Runs the 17track webhook path: status, fan-out to every order sharing the number, and the delivered emails.",
|
|
3585
|
+
"function": "makea_cli.commands.orders.cmd.register.<locals>.update_tracking_status",
|
|
3586
|
+
"flags": [
|
|
3587
|
+
{
|
|
3588
|
+
"name": "kind",
|
|
3589
|
+
"kind": "argument",
|
|
3590
|
+
"opts": [
|
|
3591
|
+
"kind"
|
|
3592
|
+
],
|
|
3593
|
+
"type": "text",
|
|
3594
|
+
"required": true,
|
|
3595
|
+
"multiple": false,
|
|
3596
|
+
"default": null,
|
|
3597
|
+
"help": "sampling | production | restock | shipping | material | reference_sample"
|
|
3598
|
+
},
|
|
3599
|
+
{
|
|
3600
|
+
"name": "order_id",
|
|
3601
|
+
"kind": "argument",
|
|
3602
|
+
"opts": [
|
|
3603
|
+
"order_id"
|
|
3604
|
+
],
|
|
3605
|
+
"type": "text",
|
|
3606
|
+
"required": true,
|
|
3607
|
+
"multiple": false,
|
|
3608
|
+
"default": null,
|
|
3609
|
+
"help": "Order id (product id for reference_sample)."
|
|
3610
|
+
},
|
|
3611
|
+
{
|
|
3612
|
+
"name": "tracking_number",
|
|
3613
|
+
"kind": "argument",
|
|
3614
|
+
"opts": [
|
|
3615
|
+
"tracking_number"
|
|
3616
|
+
],
|
|
3617
|
+
"type": "text",
|
|
3618
|
+
"required": true,
|
|
3619
|
+
"multiple": false,
|
|
3620
|
+
"default": null,
|
|
3621
|
+
"help": "The parcel's tracking number."
|
|
3622
|
+
},
|
|
3623
|
+
{
|
|
3624
|
+
"name": "status",
|
|
3625
|
+
"kind": "option",
|
|
3626
|
+
"opts": [
|
|
3627
|
+
"--status"
|
|
3628
|
+
],
|
|
3629
|
+
"type": "text",
|
|
3630
|
+
"required": true,
|
|
3631
|
+
"multiple": false,
|
|
3632
|
+
"default": null,
|
|
3633
|
+
"help": "17track status, e.g. Delivered, InTransit."
|
|
3634
|
+
},
|
|
3635
|
+
{
|
|
3636
|
+
"name": "sub_status",
|
|
3637
|
+
"kind": "option",
|
|
3638
|
+
"opts": [
|
|
3639
|
+
"--sub-status"
|
|
3640
|
+
],
|
|
3641
|
+
"type": "text",
|
|
3642
|
+
"required": false,
|
|
3643
|
+
"multiple": false,
|
|
3644
|
+
"default": null,
|
|
3645
|
+
"help": null
|
|
3646
|
+
},
|
|
3647
|
+
{
|
|
3648
|
+
"name": "event",
|
|
3649
|
+
"kind": "option",
|
|
3650
|
+
"opts": [
|
|
3651
|
+
"--event"
|
|
3652
|
+
],
|
|
3653
|
+
"type": "text",
|
|
3654
|
+
"required": false,
|
|
3655
|
+
"multiple": false,
|
|
3656
|
+
"default": null,
|
|
3657
|
+
"help": "Latest carrier event text."
|
|
3658
|
+
},
|
|
3659
|
+
{
|
|
3660
|
+
"name": "location",
|
|
3661
|
+
"kind": "option",
|
|
3662
|
+
"opts": [
|
|
3663
|
+
"--location"
|
|
3664
|
+
],
|
|
3665
|
+
"type": "text",
|
|
3666
|
+
"required": false,
|
|
3667
|
+
"multiple": false,
|
|
3668
|
+
"default": null,
|
|
3669
|
+
"help": null
|
|
3670
|
+
},
|
|
3671
|
+
{
|
|
3672
|
+
"name": "time_utc",
|
|
3673
|
+
"kind": "option",
|
|
3674
|
+
"opts": [
|
|
3675
|
+
"--time"
|
|
3676
|
+
],
|
|
3677
|
+
"type": "text",
|
|
3678
|
+
"required": false,
|
|
3679
|
+
"multiple": false,
|
|
3680
|
+
"default": null,
|
|
3681
|
+
"help": "Latest event time, ISO 8601 UTC."
|
|
3682
|
+
},
|
|
3683
|
+
{
|
|
3684
|
+
"name": "silent",
|
|
3685
|
+
"kind": "option",
|
|
3686
|
+
"opts": [
|
|
3687
|
+
"--silent"
|
|
3688
|
+
],
|
|
3689
|
+
"type": "flag",
|
|
3690
|
+
"required": false,
|
|
3691
|
+
"multiple": false,
|
|
3692
|
+
"default": false,
|
|
3693
|
+
"help": "Change state only: no email, WhatsApp or WeChat to anyone. For parcels that landed long ago."
|
|
3694
|
+
}
|
|
3695
|
+
]
|
|
3696
|
+
},
|
|
3567
3697
|
{
|
|
3568
3698
|
"name": "admin update user",
|
|
3569
3699
|
"persona": "admin",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.2.5"
|
|
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
|