+------------------------------------------------------------------------------ | Program Name: step_batch.py | Program Version: 2026-09-10 18:41:38 | Date: 2026-09-11 | Time: 08:50:50 | Input 1 - Raw CSV: indpensim_process.csv (100 batches, 23 tags) | Input 2 - Glossary: indpensim_schema.csv | Input 3 - Time stamp: aligned onto 100 points of batch progress +------------------------------------------------------------------------------
Three steps, so any number in this report can be traced back to the file it was downloaded from. The links open the file or its folder on this machine.
| What | File | |
|---|---|---|
| 1. Raw data, as downloaded | 100_Batches_IndPenSim_V3.csv /Volumes/YN-4T/WIP/CTRL-Designer/B-CDL-Data-Analysis/A-Raw-Data/IndPenSim | open the folder |
| 2. Program that converted it | make_indpensim.py /Users/yahyanazer/Dropbox/__C_2026_Work/CTRL-Designer/B-CDL-Data-Analysis/B-Engines | open the folder |
| 3. Data used for this analysis | indpensim_process.csv /Users/yahyanazer/Dropbox/__C_2026_Work/CTRL-Designer/B-CDL-Data-Analysis/A-Raw-Data/IndPenSim | open the folder |
| Batch list | indpensim_batches.csv /Users/yahyanazer/Dropbox/__C_2026_Work/CTRL-Designer/B-CDL-Data-Analysis/A-Raw-Data/IndPenSim | open the folder |
| Glossary | indpensim_schema.csv /Users/yahyanazer/Dropbox/__C_2026_Work/CTRL-Designer/B-CDL-Data-Analysis/A-Raw-Data/IndPenSim | open the folder |
| Data sheet | data-source.md /Users/yahyanazer/Dropbox/__C_2026_Work/CTRL-Designer/B-CDL-Data-Analysis/A-Raw-Data/IndPenSim | open the folder |
| Batches | 100 |
|---|---|
| Tags used | 23 |
| Batch length | 167 to 290 h (median 230 h) |
| Alignment | every batch stretched onto 100 points of 0–100% progress, because they run to different lengths |
| Corridor | mean ± 3 sigma of the reference batches |
| Strategy | Batches | Mean length | Mean yield |
|---|---|---|---|
| APC with Raman | 30 | 225 h | 3,484,283 kg |
| faulty | 10 | 230 h | 2,600,203 kg |
| operator controlled | 30 | 229 h | 2,833,113 kg |
| recipe driven | 30 | 229 h | 2,912,750 kg |
The corridor for every tag is drawn in section 6. Here is what the whole set looks like measured against it:

Each batch is placed by its worst single point — how far from the golden batch it ever got, in sigma. That is the plain reading of "stays within ± so many sigma". The sustained figure beside it is the 99.9th percentile, which ignores one bad sample and says where the batch really lived.
| Band | Batches | How far | Which | |
|---|---|---|---|---|
| 1 | Near the golden batch — within 2 sigma | 0 | none | |
| 2 | Similar — 2 to 5 sigma | 27 | worst point 2–5 sigma sustained 3 sigma (median) | Batch 2 - recipe driven, Batch 4 - recipe driven, Batch 8 - recipe driven, Batch 10 - recipe driven, Batch 11 - recipe driven, Batch 12 - recipe driven, Batch 14 - recipe driven, Batch 16 - recipe driven, Batch 22 - recipe driven, Batch 24 - recipe driven, Batch 26 - recipe driven, Batch 36 - operator controlled, Batch 38 - operator controlled, Batch 40 - operator controlled, Batch 46 - operator controlled, Batch 52 - operator controlled, Batch 56 - operator controlled, Batch 63 - APC with Raman, Batch 64 - APC with Raman, Batch 72 - APC with Raman, Batch 74 - APC with Raman, Batch 78 - APC with Raman … |
| 3 | Outside — 5 to 10 sigma | 63 | worst point 5–9 sigma sustained 6 sigma (median) | Batch 1 - recipe driven, Batch 3 - recipe driven, Batch 5 - recipe driven, Batch 6 - recipe driven, Batch 7 - recipe driven, Batch 9 - recipe driven, Batch 13 - recipe driven, Batch 15 - recipe driven, Batch 17 - recipe driven, Batch 18 - recipe driven, Batch 19 - recipe driven, Batch 20 - recipe driven, Batch 21 - recipe driven, Batch 23 - recipe driven, Batch 25 - recipe driven, Batch 27 - recipe driven, Batch 28 - recipe driven, Batch 29 - recipe driven, Batch 30 - recipe driven, Batch 31 - operator controlled, Batch 32 - operator controlled, Batch 33 - operator controlled … |
| 4 | Far from it — over 10 sigma | 10 | worst point 14–260 sigma sustained 39 sigma (median) | Batch 91 - faulty, Batch 92 - faulty, Batch 93 - faulty, Batch 94 - faulty, Batch 95 - faulty, Batch 96 - faulty, Batch 97 - faulty, Batch 98 - faulty, Batch 99 - faulty, Batch 100 - faulty |
The 10 batches beyond 10 sigma, worst first. "Worst tag" is the single tag furthest from the golden batch, and "at" is where in the batch that happened.
| Batch | Fault recorded | Worst point | Worst tag | at | first left | time outside | |
|---|---|---|---|---|---|---|---|
| 91 | faulty | yes | 260 sigma | acid_flow_rate | 52% | 2% | 22.6% |
| 94 | faulty | yes | 238 sigma | acid_flow_rate | 44% | 9% | 10.6% |
| 100 | faulty | yes | 238 sigma | acid_flow_rate | 44% | 6% | 5.9% |
| 95 | faulty | yes | 179 sigma | acid_flow_rate | 48% | 10% | 13.3% |
| 99 | faulty | yes | 128 sigma | substrate_conc | 46% | 2% | 15.5% |
| 92 | faulty | yes | 76 sigma | ph | 69% | 7% | 1.1% |
| 98 | faulty | yes | 67 sigma | ph | 69% | 13% | 0.7% |
| 93 | faulty | yes | 40 sigma | temperature | 42% | 1% | 2.0% |
| 96 | faulty | yes | 26 sigma | temperature | 36% | 33% | 1.3% |
| 97 | faulty | yes | 14 sigma | sugar_feed_rate | 40% | 9% | 2.6% |
Each chart holds every tag of that batch on one axis, measured in sigma from the golden batch. The green line at zero is the golden trajectory, the dashed red lines are the ±3 sigma corridor. The tags driving the batch are bold, the rest are faint behind them so you can still see whether the whole batch moved or only a few tags.

What the chart shows. substrate_conc carries most of it, running 249 sigma above the golden batch at 45% of the way through; 20 of 23 tags leave the corridor at some point; the first departure is at 2%, almost from the start; a large share of the batch sits outside, so this batch did not recover.
The numbers. SPE 311632 against a limit of 337 (925.4x); T² 435 against a limit of 87 (5.0x); 22.6% of the batch sits outside the golden corridor.
Driven by: substrate_conc (66%), acid_flow_rate (30%), dumped_broth_flow (1%), sugar_feed_rate (1%), temperature (0%)

What the chart shows. acid_flow_rate carries most of it, running 238 sigma above the golden batch at 44% of the way through; 13 of 23 tags leave the corridor at some point; the first departure is at 9%, almost from the start.
The numbers. SPE 77354 against a limit of 337 (229.7x); T² 237 against a limit of 87 (2.7x); 10.6% of the batch sits outside the golden corridor.
Driven by: acid_flow_rate (74%), temperature (7%), co2_offgas (6%), cool_water_flow (4%), substrate_conc (3%)

What the chart shows. acid_flow_rate carries most of it, running 238 sigma above the golden batch at 44% of the way through; 15 of 23 tags leave the corridor at some point; the first departure is at 6%, almost from the start.
The numbers. SPE 75142 against a limit of 337 (223.1x); T² 93 against a limit of 87 (1.1x); 5.9% of the batch sits outside the golden corridor.
Driven by: acid_flow_rate (76%), co2_offgas (9%), substrate_conc (7%), o2_offgas (3%), aeration_rate (1%)

What the chart shows. acid_flow_rate carries most of it, running 179 sigma above the golden batch at 48% of the way through; 16 of 23 tags leave the corridor at some point; the first departure is at 10%, early in the batch.
The numbers. SPE 60438 against a limit of 337 (179.5x); T² 190 against a limit of 87 (2.2x); 13.3% of the batch sits outside the golden corridor.
Driven by: acid_flow_rate (92%), sugar_feed_rate (3%), ph (1%), temperature (1%), cool_water_flow (1%)

What the chart shows. substrate_conc carries most of it, running 128 sigma above the golden batch at 45% of the way through; 21 of 23 tags leave the corridor at some point; the first departure is at 2%, almost from the start; a large share of the batch sits outside, so this batch did not recover.
The numbers. SPE 59809 against a limit of 337 (177.6x); T² 260 against a limit of 87 (3.0x); 15.5% of the batch sits outside the golden corridor.
Driven by: substrate_conc (72%), co2_offgas (7%), cool_water_flow (4%), heat_water_flow (4%), temperature (3%)

What the chart shows. ph carries most of it, running 76 sigma below the golden batch at 69% of the way through; 6 of 23 tags leave the corridor at some point; the first departure is at 7%, almost from the start; only a small part of the batch is outside, so this is a short, sharp deviation rather than a batch that ran wrong throughout.
The numbers. SPE 12162 against a limit of 337 (36.1x); 1.1% of the batch sits outside the golden corridor.
Driven by: ph (91%), base_flow_rate (2%), temperature (1%), heat_water_flow (1%), acid_flow_rate (1%)

What the chart shows. ph carries most of it, running 67 sigma below the golden batch at 69% of the way through; 4 of 23 tags leave the corridor at some point; the first departure is at 13%, early in the batch; only a small part of the batch is outside, so this is a short, sharp deviation rather than a batch that ran wrong throughout.
The numbers. SPE 8936 against a limit of 337 (26.5x); 0.7% of the batch sits outside the golden corridor.
Driven by: ph (91%), heat_water_flow (2%), base_flow_rate (1%), temperature (1%), cool_water_flow (1%)

What the chart shows. temperature carries most of it, running 40 sigma above the golden batch at 42% of the way through; 10 of 23 tags leave the corridor at some point; the first departure is at 1%, almost from the start; only a small part of the batch is outside, so this is a short, sharp deviation rather than a batch that ran wrong throughout.
The numbers. SPE 6152 against a limit of 337 (18.3x); 2.0% of the batch sits outside the golden corridor.
Driven by: temperature (74%), generated_heat (6%), cool_water_flow (5%), dumped_broth_flow (2%), base_flow_rate (2%)

What the chart shows. temperature carries most of it, running 26 sigma above the golden batch at 36% of the way through; 4 of 23 tags leave the corridor at some point; the first departure is at 33%, around the middle; only a small part of the batch is outside, so this is a short, sharp deviation rather than a batch that ran wrong throughout.
The numbers. SPE 2986 against a limit of 337 (8.9x); 1.3% of the batch sits outside the golden corridor.
Driven by: temperature (65%), cool_water_flow (13%), generated_heat (8%), heat_water_flow (4%), ph (1%)

What the chart shows. sugar_feed_rate carries most of it, running 14 sigma below the golden batch at 40% of the way through; 12 of 23 tags leave the corridor at some point; the first departure is at 9%, almost from the start; only a small part of the batch is outside, so this is a short, sharp deviation rather than a batch that ran wrong throughout.
The numbers. SPE 2467 against a limit of 337 (7.3x); 2.6% of the batch sits outside the golden corridor.
Driven by: sugar_feed_rate (40%), cool_water_flow (11%), base_flow_rate (8%), temperature (7%), acid_flow_rate (6%)
Each curve is one batch: how far it sits from the golden batch at that point of its progress, taken across all 23 tags at once. The bold line is the middle batch of the group. All four charts share the same scale, so they can be read against each other.
| Way of running it | Batches | Typical distance from golden | Worst batch | Mean yield | Beyond 10 sigma |
|---|---|---|---|---|---|
| recipe driven | 30 | 0.71 sigma | 9 sigma | 2,912,750 kg | 0 of 30 |
| operator controlled | 30 | 0.74 sigma | 9 sigma | 2,833,113 kg | 0 of 30 |
| APC with Raman | 30 | 0.63 sigma | 9 sigma | 3,484,283 kg | 0 of 30 |
| faulty | 10 | 1.12 sigma | 260 sigma | 2,600,203 kg | 10 of 10 |
Only the middle batch of each group, so the four are directly comparable.





| label | batch | strategy | band | max_z | sustained_z | worst_tag | worst_at_pct | outside_pct | first_outside_pct | T2 | SPE | yield_total_kg |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Batch 91 - faulty | 91 | faulty | far from it (over 10 sigma) | 260.2 | 214.1 | acid_flow_rate | 51.5 | 22.57 | 2 | 435.4 | 3.116e+05 | 2.597e+06 |
| Batch 99 - faulty | 99 | faulty | far from it (over 10 sigma) | 128.3 | 84.2 | substrate_conc | 45.5 | 15.52 | 2 | 259.7 | 5.981e+04 | 8.908e+05 |
| Batch 45 - operator controlled | 45 | operator controlled | outside (5-10 sigma) | 9.4 | 9.4 | sugar_feed_rate | 48.5 | 13.52 | 2 | 86.52 | 7.6 | 2.828e+06 |
| Batch 95 - faulty | 95 | faulty | far from it (over 10 sigma) | 179.3 | 40.5 | acid_flow_rate | 48.5 | 13.35 | 10.1 | 190.4 | 6.044e+04 | 1.954e+06 |
| Batch 67 - APC with Raman | 67 | APC with Raman | outside (5-10 sigma) | 9.4 | 9.4 | head_pressure | 7.1 | 13.17 | 2 | 87.64 | 2.188 | 3.413e+06 |
| Batch 94 - faulty | 94 | faulty | far from it (over 10 sigma) | 237.8 | 44.6 | acid_flow_rate | 44.4 | 10.57 | 9.1 | 237.1 | 7.735e+04 | 3.584e+06 |
| Batch 29 - recipe driven | 29 | recipe driven | outside (5-10 sigma) | 9.4 | 9.4 | aeration_rate | 14.1 | 9.13 | 1 | 86.66 | 8.515 | 1.842e+06 |
| Batch 3 - recipe driven | 3 | recipe driven | outside (5-10 sigma) | 9.4 | 9.2 | acid_flow_rate | 9.1 | 8.87 | 1 | 86.8 | 5.971 | 2.675e+06 |
| Batch 9 - recipe driven | 9 | recipe driven | outside (5-10 sigma) | 9.4 | 9.4 | acid_flow_rate | 47.5 | 7.43 | 2 | 80.8 | 45.04 | 4.083e+06 |
| Batch 73 - APC with Raman | 73 | APC with Raman | outside (5-10 sigma) | 9.4 | 8.9 | acid_flow_rate | 34.3 | 6.61 | 5.1 | 78.66 | 55.14 | 3.549e+06 |
| Batch 100 - faulty | 100 | faulty | far from it (over 10 sigma) | 237.8 | 42.5 | acid_flow_rate | 44.4 | 5.87 | 6.1 | 93.1 | 7.514e+04 | 1.555e+06 |
| Batch 15 - recipe driven | 15 | recipe driven | outside (5-10 sigma) | 9.4 | 7.3 | substrate_conc | 8.1 | 4.3 | 2 | 53.92 | 237.9 | 2.853e+06 |
| Batch 5 - recipe driven | 5 | recipe driven | outside (5-10 sigma) | 9.4 | 6.6 | sugar_feed_rate | 44.4 | 3.57 | 2 | 48.82 | 275.8 | 3.563e+06 |
| Batch 75 - APC with Raman | 75 | APC with Raman | outside (5-10 sigma) | 9.4 | 9.1 | acid_flow_rate | 8.1 | 3.39 | 4 | 82.58 | 30.17 | 3.1e+06 |
| Batch 44 - operator controlled | 44 | operator controlled | outside (5-10 sigma) | 7.9 | 5.5 | heat_water_flow | 39.4 | 3.35 | 5.1 | 47.68 | 205.5 | 1.474e+06 |
| Batch 61 - APC with Raman | 61 | APC with Raman | outside (5-10 sigma) | 9 | 7.1 | ph | 34.3 | 3.13 | 4 | 56.8 | 184.5 | 3.063e+06 |
| Batch 35 - operator controlled | 35 | operator controlled | outside (5-10 sigma) | 9.4 | 8.2 | dumped_broth_flow | 51.5 | 2.91 | 1 | 79.92 | 48.45 | 3.538e+06 |
| Batch 17 - recipe driven | 17 | recipe driven | outside (5-10 sigma) | 9.4 | 6.8 | acid_flow_rate | 53.5 | 2.91 | 2 | 81.51 | 33.23 | 3.852e+06 |
| Batch 25 - recipe driven | 25 | recipe driven | outside (5-10 sigma) | 7.9 | 6.2 | acid_flow_rate | 97 | 2.74 | 2 | 48.54 | 215.9 | 3.717e+06 |
| Batch 97 - faulty | 97 | faulty | far from it (over 10 sigma) | 14.4 | 11.6 | sugar_feed_rate | 40.4 | 2.61 | 9.1 | 34.29 | 2467 | 3.894e+06 |
| Batch 33 - operator controlled | 33 | operator controlled | outside (5-10 sigma) | 9.4 | 8.6 | acid_flow_rate | 81.8 | 2.48 | 2 | 74.36 | 81.72 | 3.294e+06 |
| Batch 23 - recipe driven | 23 | recipe driven | outside (5-10 sigma) | 7.4 | 5.3 | acid_flow_rate | 49.5 | 2.35 | 2 | 60.57 | 167.1 | 2.855e+06 |
| Batch 7 - recipe driven | 7 | recipe driven | outside (5-10 sigma) | 9.3 | 9.2 | ph | 77.8 | 2.13 | 43.4 | 83.26 | 31.42 | 3.455e+06 |
| Batch 93 - faulty | 93 | faulty | far from it (over 10 sigma) | 39.9 | 32 | temperature | 42.4 | 2.04 | 1 | 61.7 | 6152 | 4.448e+06 |
| Batch 39 - operator controlled | 39 | operator controlled | outside (5-10 sigma) | 9.4 | 9.4 | acid_flow_rate | 99 | 2 | 18.2 | 83.1 | 26.98 | 2.682e+06 |
| Batch 32 - operator controlled | 32 | operator controlled | outside (5-10 sigma) | 7.6 | 6.1 | temperature | 37.4 | 1.96 | 20.2 | 41.17 | 228 | 4.196e+06 |
| Batch 53 - operator controlled | 53 | operator controlled | outside (5-10 sigma) | 5.7 | 5.4 | heat_water_flow | 13.1 | 1.61 | 1 | 43.01 | 246.6 | 2.858e+06 |
| Batch 31 - operator controlled | 31 | operator controlled | outside (5-10 sigma) | 7.5 | 6.4 | heat_water_flow | 33.3 | 1.52 | 2 | 67.55 | 139.8 | 1.89e+06 |
| Batch 69 - APC with Raman | 69 | APC with Raman | outside (5-10 sigma) | 5 | 4.8 | dumped_broth_flow | 58.6 | 1.48 | 35.4 | 57.29 | 144 | 3.751e+06 |
| Batch 30 - recipe driven | 30 | recipe driven | outside (5-10 sigma) | 9.3 | 4.9 | acid_flow_rate | 57.6 | 1.39 | 55.6 | 37.82 | 298.9 | 3.539e+06 |
| Batch 96 - faulty | 96 | faulty | far from it (over 10 sigma) | 26.4 | 19.1 | temperature | 36.4 | 1.3 | 33.3 | 39.52 | 2986 | 3.595e+06 |
| Batch 59 - operator controlled | 59 | operator controlled | outside (5-10 sigma) | 9.3 | 6.6 | acid_flow_rate | 84.8 | 1.3 | 7.1 | 52.07 | 202.6 | 2.91e+06 |
| Batch 27 - recipe driven | 27 | recipe driven | outside (5-10 sigma) | 9.4 | 6.6 | substrate_conc | 42.4 | 1.22 | 23.2 | 63.25 | 142.4 | 2.176e+06 |
| Batch 41 - operator controlled | 41 | operator controlled | outside (5-10 sigma) | 9.4 | 8.5 | acid_flow_rate | 94.9 | 1.09 | 10.1 | 82.72 | 27.41 | 2.922e+06 |
| Batch 92 - faulty | 92 | faulty | far from it (over 10 sigma) | 76.2 | 37.7 | ph | 68.7 | 1.09 | 7.1 | 57.81 | 1.216e+04 | 1.753e+06 |
| Batch 71 - APC with Raman | 71 | APC with Raman | outside (5-10 sigma) | 9.4 | 6.3 | acid_flow_rate | 79.8 | 1.04 | 6.1 | 59.89 | 167.1 | 2.831e+06 |
| Batch 83 - APC with Raman | 83 | APC with Raman | outside (5-10 sigma) | 9.4 | 6 | acid_flow_rate | 62.6 | 1 | 10.1 | 48.17 | 222.3 | 3.837e+06 |
| Batch 37 - operator controlled | 37 | operator controlled | outside (5-10 sigma) | 9.4 | 7 | acid_flow_rate | 71.7 | 1 | 12.1 | 51.15 | 209.5 | 2.632e+06 |
| Batch 21 - recipe driven | 21 | recipe driven | outside (5-10 sigma) | 6.3 | 5.3 | heat_water_flow | 18.2 | 0.96 | 5.1 | 52.74 | 195.6 | 2.568e+06 |
| Batch 20 - recipe driven | 20 | recipe driven | outside (5-10 sigma) | 8.1 | 6.2 | heat_water_flow | 46.5 | 0.96 | 36.4 | 48.35 | 197.7 | 2.234e+06 |
The green band is where a good batch is expected to be at each point of its progress. The worst batches are drawn over it in red, and one reference batch in green for comparison. Drag to zoom, double-click to reset, click a name in the legend to hide it.























| Way of running it | Batches | Mean yield (kg) | Spread (CV) | Worst batch | Best batch | Mean hours | kg per hour |
|---|---|---|---|---|---|---|---|
| recipe driven | 30 | 2,912,750 | 26.4% | 1,842,400 | 4,083,100 | 228.8 | 12,917 |
| operator controlled | 30 | 2,833,113 | 24.0% | 1,474,100 | 4,196,000 | 229.2 | 12,431 |
| APC with Raman | 30 | 3,484,283 | 8.8% | 2,830,800 | 4,044,300 | 224.7 | 15,587 |
| Comparison | Difference | Welch p | Mann-Whitney p | Cohen d | Significant | |
|---|---|---|---|---|---|---|
| recipe driven vs operator controlled | +79,637 kg | +2.8% | 6.7e-01 | 8.9e-01 | +0.11 | no |
| recipe driven vs APC with Raman | -571,533 kg | -16.4% | 5.3e-04 | 1.1e-02 | -0.98 | yes |
| operator controlled vs APC with Raman | -651,170 kg | -18.7% | 2.3e-05 | 4.4e-05 | -1.23 | yes |
One real batch per strategy, chosen on two criteria at once: high yield and close to that group's own mean trajectory. The highest-yielding batch is often a lucky outlier that ran unlike anything else, and the most typical batch is often mediocre. These are both.
| Way of running it | Golden batch | Yield | Yield rank | Closeness rank |
|---|---|---|---|---|
| recipe driven | Batch 26 - recipe driven | 3,886,800 kg | 4 of 30 | 2 of 30 |
| operator controlled | Batch 60 - operator controlled | 3,802,300 kg | 3 of 30 | 5 of 30 |
| APC with Raman | Batch 79 - APC with Raman | 3,825,600 kg | 5 of 30 | 2 of 30 |
A golden batch is built from one strategy, holding back some of its own batches, and every group is then scored against it. The figure is the median batch's typical distance, in sigma. The shaded cell on the diagonal is that strategy's own held-back batches — the fair self-comparison, and it should be the lowest number in its row.
| Golden built from | recipe driven | operator controlled | APC with Raman | faulty |
|---|---|---|---|---|
| recipe driven | 0.77 | 1.07 | 1.08 | 1.11 |
| operator controlled | 0.82 | 0.74 | 0.95 | 1.20 |
| APC with Raman | 1.05 | 1.35 | 0.66 | 12.51 |
| Golden built from | Its own held-back batches | The other strategies | How much further | Fault detection power |
|---|---|---|---|---|
| recipe driven | 0.77 | 1.07 | 1.40x | 1.4x |
| operator controlled | 0.74 | 0.89 | 1.20x | 1.6x |
| APC with Raman | 0.66 | 1.20 | 1.82x | 19.0x |
Folder: /Volumes/YN-4T/WIP/CTRL-Designer/B-CDL-Data-Analysis/E-Batch/IndPenSim-100
© 2026 CTRL Designer LLC. All rights reserved.
Yahya Nazer · info@ctrlDesigner.com