From 47f475d2ad78e46b36bf58ee855c7c082e897f04 Mon Sep 17 00:00:00 2001 From: Manu Varkey Date: Wed, 4 Oct 2023 15:57:28 +0530 Subject: [PATCH] Add L&T MCCB with microprocessor trip --- gelectrical/database/cb.csv | 25 ++ gelectrical/database/mccb_lnt/mtx_1_2_g.json | 78 ++++++ gelectrical/database/mccb_lnt/mtx_1_2_l.json | 264 ++++++++++++++++++ .../database/mccb_schneider/micrologic_l.json | 2 +- source/CB/LnT MCCB/MTX/uP_ground.ipynb | 115 ++++++++ source/CB/LnT MCCB/MTX/uP_line.ipynb | 162 +++++++++++ source/CB/Schneider ACB/uP_line.ipynb | 6 +- source/cb.ods | Bin 30473 -> 31948 bytes 8 files changed, 648 insertions(+), 4 deletions(-) create mode 100644 gelectrical/database/mccb_lnt/mtx_1_2_g.json create mode 100644 gelectrical/database/mccb_lnt/mtx_1_2_l.json create mode 100644 source/CB/LnT MCCB/MTX/uP_ground.ipynb create mode 100644 source/CB/LnT MCCB/MTX/uP_line.ipynb diff --git a/gelectrical/database/cb.csv b/gelectrical/database/cb.csv index 5c0a6d6..2edd252 100644 --- a/gelectrical/database/cb.csv +++ b/gelectrical/database/cb.csv @@ -120,6 +120,20 @@ item_name;item_category;custom;type;subtype;prot_curve_type;prot_0_curve_type;In 400A, DN3-TM, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN3-TM;;400;400;36;('mccb_lnt', '', 'lnt_mccb_d3.json'); 500A, DN3-TM, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN3-TM;;500;500;36;('mccb_lnt', '', 'lnt_mccb_d3.json'); 630A, DN3-TM, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN3-TM;;630;630;36;('mccb_lnt', '', 'lnt_mccb_d3.json'); +40A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;40;40;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +63A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;63;63;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +80A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;80;80;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +100A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;100;100;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +125A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;125;125;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +160A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;160;160;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +200A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;200;200;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +250A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;250;250;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +320A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;320;320;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +400A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;400;400;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +320A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;320;320;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +400A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;400;400;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +500A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;500;500;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') +630A, DN2-MP, DSINE;MCCB - L&T DSINE;True;L&T DSINE;MCCB;DN2-MP;;630;630;36;('mccb_lnt', '', 'mtx_1_2_l.json');('mccb_lnt', '', 'mtx_1_2_g.json') 16A, TM, DPX3 160;MCCB - Legrand DPX3;True;Legrand DPX3;MCCB;TM;;16;16;16;('mccb_legrand', '', 'legrand_dpx3_160_16.json'); 25A, TM, DPX3 160;MCCB - Legrand DPX3;True;Legrand DPX3;MCCB;TM;;25;25;16;('mccb_legrand', '', 'legrand_dpx3_160_25.json'); 40A, TM, DPX3 160;MCCB - Legrand DPX3;True;Legrand DPX3;MCCB;TM;;40;40;16;('mccb_legrand', '', 'legrand_dpx3_160.json'); @@ -192,3 +206,14 @@ item_name;item_category;custom;type;subtype;prot_curve_type;prot_0_curve_type;In 100A, TM-D, Compact NSXm;MCCB - Schneider Compact NSXm;True;Schneider Compact NSXm;MCCB;TM-D;;100;100;16;('mccb_schneider', '', 'params_NSXm_TMD_100.json'); 125A, TM-D, Compact NSXm;MCCB - Schneider Compact NSXm;True;Schneider Compact NSXm;MCCB;TM-D;;125;125;16;('mccb_schneider', '', 'params_NSXm_TMD_125.json'); 160A, TM-D, Compact NSXm;MCCB - Schneider Compact NSXm;True;Schneider Compact NSXm;MCCB;TM-D;;160;160;16;('mccb_schneider', '', 'params_NSXm_TMD_160.json'); +630A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;630;630;42;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') +800A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;800;800;42;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') +1000A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;1000;1000;42;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') +1250A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;1250;1250;42;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') +1600A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;1600;1600;42;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') +2000A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;2000;2000;42;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') +2500A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;2500;2500;65;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') +3200A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;3200;3200;65;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') +4000A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;4000;4000;100;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') +5000A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;5000;5000;100;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') +6300A, Micrologic, MasterPact;ACB - Schneider MasterPact;True;Schneider MasterPact;ACB;Micrologic;Micrologic;6300;6300;100;('mccb_schneider', '', 'micrologic_l.json');('mccb_schneider', '', 'micrologic_g.json') diff --git a/gelectrical/database/mccb_lnt/mtx_1_2_g.json b/gelectrical/database/mccb_lnt/mtx_1_2_g.json new file mode 100644 index 0000000..ef22ec0 --- /dev/null +++ b/gelectrical/database/mccb_lnt/mtx_1_2_g.json @@ -0,0 +1,78 @@ +{ + "type": "protection", + "parameters": { + "trip_on": [ + "Trip unit enabled ?", + "", + false, + null, + "Whether trip unit is enabled", + "bool" + ], + "i_m": [ + "Ig", + "xI0", + 0.2, + [ + 0.2, + 0.3, + 0.4, + 0.5 + ], + "Ground fault pickup current" + ], + "t_m": [ + "tg", + "s", + 0.1, + [ + 0.1, + 0.2 + ], + "Short-time tripping delay" + ] + }, + "data": { + "select_expr_list": [ + "d.trip_on is True", + "d.trip_on is False" + ], + "curve_u1": [ + [ + "point", + "d.i_m*f.I0*1.1", + "3600 if f.In <= 63 else 2*3600" + ], + [ + "point", + "d.i_m*f.I0*1.1", + "d.t_m*1.1" + ], + [ + "point", + "1000*f.Isc", + "d.t_m*1.1" + ] + ], + "curve_l1": [ + [ + "point", + "d.i_m*f.I0*0.9", + "3600 if f.In <= 63 else 2*3600" + ], + [ + "point", + "d.i_m*f.I0*0.9", + "d.t_m*0.9" + ], + [ + "point", + "1000*f.Isc", + "d.t_m*0.9" + ] + ], + "curve_u2": [], + "curve_l2": [] + }, + "graph_model": [] +} \ No newline at end of file diff --git a/gelectrical/database/mccb_lnt/mtx_1_2_l.json b/gelectrical/database/mccb_lnt/mtx_1_2_l.json new file mode 100644 index 0000000..a4502ad --- /dev/null +++ b/gelectrical/database/mccb_lnt/mtx_1_2_l.json @@ -0,0 +1,264 @@ +{ + "type": "protection", + "parameters": { + "head_l": [ + "Long time protection", + "", + "", + null, + "", + "heading" + ], + "lt_on": [ + "Enable long time protection", + "", + true, + null, + "", + "bool" + ], + "i_r": [ + "Ir", + "xIn", + 1, + [ + 0.4, + 0.45, + 0.5, + 0.55, + 0.6, + 0.65, + 0.7, + 0.75, + 0.8, + 0.85, + 0.9, + 0.95, + 1 + ], + "Long-time pickup current" + ], + "ir_i2t": [ + "@6xIr/@7.2xIr", + "xIr", + 6, + [ + 6, + 7.2 + ], + "Current at which tripping delay occurs" + ], + "t_r": [ + "tr", + "s", + 10, + [ + 3, + 10 + ], + "Long-time tripping delay @ 6xIr/7.2xIr" + ], + "head_s": [ + "Short time protection", + "", + "", + null, + "", + "heading" + ], + "st_on": [ + "Enable short time protection", + "", + true, + null, + "", + "bool" + ], + "i_m": [ + "Isd", + "xIr", + 8, + [ + 1.5, + 2.5, + 4, + 5.5, + 6.5, + 8 + ], + "Short-time pickup current" + ], + "t_m": [ + "tsd", + "s", + 0, + [ + 0, + 0.1 + ], + "Short-time tripping delay (@ 10xIsd for I2T=ON)" + ], + "head_i": [ + "Instantaneous protection", + "", + "", + null, + "", + "heading" + ], + "i_i": [ + "Ii", + "xIn", + 10, + [ + 10 + ], + "Instantaneous pickup current" + ] + }, + "data": { + "select_expr_list": [ + "d.lt_on is True", + "d.lt_on is False" + ], + "curve_u1": [ + [ + "point", + "1.2*f.In*d.i_r", + "3600 if f.In <= 63 else 2*3600" + ], + [ + "I2T", + { + "tms": 1, + "i_n": "d.i_r*f.In", + "i1": "1.2*f.In*d.i_r", + "i2": "d.i_m*d.i_r*f.In*1.1 if d.st_on else d.i_i*f.In*1.15", + "t_min": "max(0.01, d.t_m*1.2) if d.st_on else 0.01", + "n": 100, + "i_tol": "1.2*f.In*d.i_r*100-100", + "t_tol": 20, + "curve_type": 1, + "k_i2t": "d.ir_i2t**2*d.t_r" + } + ], + [ + "point", + "d.i_m*d.i_r*f.In*1.1 if d.st_on else d.i_i*f.In*1.15", + "max(0.01, d.t_m*1.2) if d.st_on else 0.01" + ], + [ + "point", + "d.i_i*f.In*1.15", + "max(0.01, d.t_m*1.2) if d.st_on else 0.01" + ], + [ + "point", + "d.i_i*f.In*1.15", + 0.01 + ], + [ + "point", + "1000*f.Isc", + 0.01 + ] + ], + "curve_l1": [ + [ + "point", + "1.05*f.In*d.i_r", + "3600 if f.In <= 63 else 2*3600" + ], + [ + "I2T", + { + "tms": 1, + "i_n": "d.i_r*f.In", + "i1": "1.05*f.In*d.i_r", + "i2": "d.i_m*d.i_r*f.In*0.9 if d.st_on else d.i_i*f.In*0.85", + "t_min": "max(0.001, d.t_m*0.8) if d.st_on else 0.001", + "n": 100, + "i_tol": "1.05*f.In*d.i_r*100-100", + "t_tol": -20, + "curve_type": -1, + "k_i2t": "d.ir_i2t**2*d.t_r" + } + ], + [ + "point", + "d.i_m*d.i_r*f.In*0.9 if d.st_on else d.i_i*f.In*0.85", + "max(0.001, d.t_m*0.8) if d.st_on else 0.001" + ], + [ + "point", + "d.i_i*f.In*0.85", + "max(0.001, d.t_m*0.8) if d.st_on else 0.001" + ], + [ + "point", + "d.i_i*f.In*0.85", + 0.001 + ], + [ + "point", + "1000*f.Isc", + 0.001 + ] + ], + "curve_u2": [ + [ + "point", + "d.i_m*d.i_r*f.In*1.1 if d.st_on else d.i_i*f.In*1.15", + "3600 if f.In <= 63 else 2*3600" + ], + [ + "point", + "d.i_m*d.i_r*f.In*1.1 if d.st_on else d.i_i*f.In*1.15", + "max(0.01, d.t_m*1.2) if d.st_on else 0.01" + ], + [ + "point", + "d.i_i*f.In*1.15", + "max(0.01, d.t_m*1.2) if d.st_on else 0.01" + ], + [ + "point", + "d.i_i*f.In*1.15", + 0.01 + ], + [ + "point", + "1000*f.Isc", + 0.01 + ] + ], + "curve_l2": [ + [ + "point", + "d.i_m*d.i_r*f.In*0.9 if d.st_on else d.i_i*f.In*0.85", + "3600 if f.In <= 63 else 2*3600" + ], + [ + "point", + "d.i_m*d.i_r*f.In*0.9 if d.st_on else d.i_i*f.In*0.85", + "max(0.001, d.t_m*0.8) if d.st_on else 0.001" + ], + [ + "point", + "d.i_i*f.In*0.85", + "max(0.001, d.t_m*0.8) if d.st_on else 0.001" + ], + [ + "point", + "d.i_i*f.In*0.85", + 0.001 + ], + [ + "point", + "1000*f.Isc", + 0.001 + ] + ] + }, + "graph_model": [] +} \ No newline at end of file diff --git a/gelectrical/database/mccb_schneider/micrologic_l.json b/gelectrical/database/mccb_schneider/micrologic_l.json index 7c910e9..1150505 100644 --- a/gelectrical/database/mccb_schneider/micrologic_l.json +++ b/gelectrical/database/mccb_schneider/micrologic_l.json @@ -23,7 +23,7 @@ ], "t_r": [ "tr", - "", + "s", 16, [ 0.5, diff --git a/source/CB/LnT MCCB/MTX/uP_ground.ipynb b/source/CB/LnT MCCB/MTX/uP_ground.ipynb new file mode 100644 index 0000000..dae9a12 --- /dev/null +++ b/source/CB/LnT MCCB/MTX/uP_ground.ipynb @@ -0,0 +1,115 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 15, + "id": "ace6f8f9-c095-4795-8e26-c2d169b636ca", + "metadata": {}, + "outputs": [], + "source": [ + "curve_u = []\n", + "curve_l = []\n", + "curves = {}\n", + "parameters = dict()\n", + "\n", + "In = 'f.I0'\n", + "Isc = '1000*f.Isc'\n", + "\n", + "tol_im_p = 10\n", + "tol_im_m = 10\n", + "\n", + "tol_tm_p = 10\n", + "tol_tm_m = 10\n", + "\n", + "select_expr_list = ['d.trip_on is True', 'd.trip_on is False']\n", + "\n", + "def get_curves(Ir, I1, T_conv, Im, Tm):\n", + " k_I2T = str(i_i2t**2) + '*d.t_m'\n", + " # M\n", + " curve = [('point', I1, T_conv),\n", + " ('point', I1, Tm),\n", + " ('point', Isc, Tm)]\n", + " return curve\n", + "\n", + "# Upper curves\n", + "Ir = In\n", + "T_conv = '3600 if f.In <= 63 else 2*3600'\n", + "Im = 'd.i_m*' + Ir + '*' + str((100+tol_im_p)/100)\n", + "I1 = Im\n", + "Tm = 'd.t_m*' + str((100+tol_tm_p)/100)\n", + "curve_u1 = get_curves(Ir, I1, T_conv, Im, Tm)\n", + "# Lower curves\n", + "Ir = In\n", + "T_conv = '3600 if f.In <= 63 else 2*3600'\n", + "Im = 'd.i_m*' + Ir + '*' + str((100-tol_im_m)/100)\n", + "I1 = Im\n", + "Tm = 'd.t_m*' + str((100-tol_tm_m)/100)\n", + "curve_l1 = get_curves(Ir, I1, T_conv, Im, Tm)\n", + "\n", + "parameters = { \"trip_on\" : [\"Trip unit enabled ?\", \"\", False, None, \"Whether trip unit is enabled\", \"bool\"],\n", + " 'i_m' : ['Ig', 'xI0', 0.2, [0.2,0.3,0.4,0.5], 'Ground fault pickup current'],\n", + " 't_m' : ['tg', 's', 0.1, [0.1,0.2], 'Short-time tripping delay'],\n", + " }\n", + "\n", + "curves = {'select_expr_list': select_expr_list,\n", + " 'curve_u1': curve_u1, 'curve_l1': curve_l1,\n", + " 'curve_u2': [], 'curve_l2': []}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b60d8618-58a9-424b-97e5-f05548cdc38c", + "metadata": {}, + "outputs": [], + "source": [ + "import json, re\n", + "\n", + "data = {'type' : 'protection',\n", + " 'parameters' : parameters,\n", + " 'data' : curves,\n", + " 'graph_model' : []}\n", + "\n", + "with open('mtx_1_2_g.json', 'w') as fp:\n", + " json.dump(data, fp, indent=2)\n", + "\n", + "# output = json.dumps(data, indent=2)\n", + "# output2 = re.sub(r'\": \\[\\s+', '\": [', output)\n", + "# output3 = re.sub(r'\",\\s+', '\", ', output2)\n", + "# output4 = re.sub(r'\"\\s+\\]', '\"]', output3)\n", + "\n", + "# with open('legrand_uP.json', 'w') as fp:\n", + "# fp.write(output4)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "482a6df0", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/source/CB/LnT MCCB/MTX/uP_line.ipynb b/source/CB/LnT MCCB/MTX/uP_line.ipynb new file mode 100644 index 0000000..522769d --- /dev/null +++ b/source/CB/LnT MCCB/MTX/uP_line.ipynb @@ -0,0 +1,162 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 33, + "id": "ace6f8f9-c095-4795-8e26-c2d169b636ca", + "metadata": {}, + "outputs": [], + "source": [ + "PROT_LOWER = -1\n", + "PROT_UPPER = 1\n", + "\n", + "curve_u = []\n", + "curve_l = []\n", + "curves = {}\n", + "parameters = dict()\n", + "\n", + "In = 'f.In'\n", + "Isc = '1000*f.Isc'\n", + "i_nf = '1.05*f.In*d.i_r'\n", + "i_f = '1.2*f.In*d.i_r'\n", + "tol_im_p = 10\n", + "tol_im_m = 10\n", + "tol_ii_p = 15\n", + "tol_ii_m = 15\n", + "\n", + "tol_tm_p = 20\n", + "tol_tm_m = 20\n", + "t_i_p = 0.01\n", + "t_i_m = 0.001\n", + "\n", + "tol_tr_p = 20\n", + "tol_tr_m = 20\n", + "# ir_i2t = str({'BYPASS': 0, '3s @ 6Ir':6, '10s @ 6Ir':6, '3s @ 7.2Ir':7.2, '10s @ 7.2Ir':7.2}) + '[d.curve]'\n", + "# Tr = str({'BYPASS': 0, '3s @ 6Ir':3, '10s @ 6Ir':10, '3s @ 7.2Ir':3, '10s @ 7.2Ir':10}) + '[d.curve]'\n", + "ir_i2t = 'd.ir_i2t'\n", + "Tr = 'd.t_r'\n", + "\n", + "select_expr_list = ['d.lt_on is True', 'd.lt_on is False']\n", + "\n", + "def get_curves(Ir, I1, Tr, T_conv, Im, Tm, Ii, Ti, i_tol, t_tol, curve_type):\n", + " kr_I2t = '{0}**2*{1}'.format(ir_i2t, Tr)\n", + " curve_vars = {'tms' : 1, \n", + " 'i_n' : Ir, \n", + " 'i1' : I1,\n", + " 'i2' : Im,\n", + " 't_min' : Tm, \n", + " 'n' : 100,\n", + " 'i_tol' : i_tol,\n", + " 't_tol' : t_tol,\n", + " 'curve_type' : curve_type,\n", + " 'k_i2t' : kr_I2t,\n", + " }\n", + " # M, I\n", + " curve1 = [('point', I1, T_conv),\n", + " ('I2T', curve_vars),\n", + " ('point', Im, Tm),\n", + " ('point', Ii, Tm),\n", + " ('point', Ii, Ti),\n", + " ('point', Isc, Ti),]\n", + " # M, I\n", + " curve2 = [('point', Im, T_conv),\n", + " ('point', Im, Tm),\n", + " ('point', Ii, Tm),\n", + " ('point', Ii, Ti),\n", + " ('point', Isc, Ti),]\n", + " return curve1, curve2\n", + "\n", + "# Upper curves\n", + "Ir = 'd.i_r*' + In\n", + "I1 = i_f\n", + "# Tr = 'd.t_r'\n", + "T_conv = '3600 if f.In <= 63 else 2*3600'\n", + "Ii = 'd.i_i*' + In + '*' + str((100+tol_ii_p)/100)\n", + "Ti = t_i_p\n", + "Im = 'd.i_m*{0}*{1} if d.st_on else {2}'.format(Ir, (100+tol_im_p)/100, Ii)\n", + "Tm = 'max({0}, d.t_m*{1}) if d.st_on else {0}'.format(Ti, (100+tol_tm_p)/100)\n", + "i_tol = i_f + '*100-100'\n", + "t_tol = tol_tr_p\n", + "curve_type = PROT_UPPER\n", + "curve_u1, curve_u2 = get_curves(Ir, I1, Tr, T_conv, Im, Tm, Ii, Ti, i_tol, t_tol, curve_type)\n", + "# Lower curves\n", + "Ir = 'd.i_r*' + In\n", + "I1 = i_nf\n", + "# Tr = 'd.t_r'\n", + "T_conv = '3600 if f.In <= 63 else 2*3600'\n", + "Ii = 'd.i_i*' + In + '*' + str((100-tol_ii_m)/100)\n", + "Ti = t_i_m\n", + "Im = 'd.i_m*{0}*{1} if d.st_on else {2}'.format(Ir, (100-tol_im_m)/100, Ii)\n", + "Tm = 'max({0}, d.t_m*{1}) if d.st_on else {0}'.format(Ti, (100-tol_tm_m)/100)\n", + "i_tol = i_nf + '*100-100'\n", + "t_tol = -tol_tr_m\n", + "curve_type = PROT_LOWER\n", + "curve_l1, curve_l2 = get_curves(Ir, I1, Tr, T_conv, Im, Tm, Ii, Ti, i_tol, t_tol, curve_type)\n", + "\n", + "parameters = { 'head_l' : ['Long time protection', '', '', None, '', 'heading'],\n", + " 'lt_on' : ['Enable long time protection', '', True, None, '', 'bool'],\n", + " 'i_r' : ['Ir', 'xIn', 1, [0.40,0.45,0.50,0.55,0.60,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1], 'Long-time pickup current'],\n", + " 'ir_i2t' : ['@6xIr/@7.2xIr', 'xIr', 6, [6,7.2], 'Current at which tripping delay occurs'],\n", + " 't_r' : ['tr', 's', 10, [3,10], 'Long-time tripping delay @ 6xIr/7.2xIr'],\n", + " 'head_s' : ['Short time protection', '', '', None, '', 'heading'],\n", + " 'st_on' : ['Enable short time protection', '', True, None, '', 'bool'],\n", + " 'i_m' : ['Isd', 'xIr', 8, [1.5,2.5,4,5.5,6.5,8], 'Short-time pickup current'],\n", + " 't_m' : ['tsd', 's', 0, [0,0.1], 'Short-time tripping delay (@ 10xIsd for I2T=ON)'],\n", + " 'head_i' : ['Instantaneous protection', '', '', None, '', 'heading'],\n", + " 'i_i' : ['Ii', 'xIn', 10, [10], 'Instantaneous pickup current'],\n", + " }\n", + "\n", + "curves = {'select_expr_list': select_expr_list,\n", + " 'curve_u1': curve_u1, 'curve_l1': curve_l1,\n", + " 'curve_u2': curve_u2, 'curve_l2': curve_l2,}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "b60d8618-58a9-424b-97e5-f05548cdc38c", + "metadata": {}, + "outputs": [], + "source": [ + "import json, re\n", + "\n", + "data = {'type' : 'protection',\n", + " 'parameters' : parameters,\n", + " 'data' : curves,\n", + " 'graph_model' : []}\n", + "\n", + "with open('mtx_1_2_l.json', 'w') as fp:\n", + " json.dump(data, fp, indent=2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "482a6df0", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/source/CB/Schneider ACB/uP_line.ipynb b/source/CB/Schneider ACB/uP_line.ipynb index aebfb4d..31ca0bd 100644 --- a/source/CB/Schneider ACB/uP_line.ipynb +++ b/source/CB/Schneider ACB/uP_line.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "ace6f8f9-c095-4795-8e26-c2d169b636ca", "metadata": {}, "outputs": [], @@ -120,7 +120,7 @@ "\n", "parameters = { 'head_l' : ['Long time protection', '', '', None, '', 'heading'],\n", " 'i_r' : ['Ir', 'xIn', 1, None, 'Long-time pickup current', [2,0.4,1]],\n", - " 't_r' : ['tr', '', 16, [0.5,1,2,4,8,12,16,20,24], 'Long-time tripping delay @ 6xIr'],\n", + " 't_r' : ['tr', 's', 16, [0.5,1,2,4,8,12,16,20,24], 'Long-time tripping delay @ 6xIr'],\n", " 'head_s' : ['Short time protection', '', '', None, '', 'heading'],\n", " 'i_m' : ['Isd', 'xIr', 8, [1.5,2,2.5,3,4,5,6,8,10], 'Short-time pickup current'],\n", " 't_m' : ['tsd', 's', 0, [0,0.1,0.2,0.3,0.4], 'Short-time tripping delay (@ 10xIsd for I2T=ON)'],\n", @@ -139,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "b60d8618-58a9-424b-97e5-f05548cdc38c", "metadata": {}, "outputs": [], diff --git a/source/cb.ods b/source/cb.ods index d829a8a24709de5bf3eae08aa42fad046f965f7f..fa4a7a3996bd115fd4c39416dd55c897bdc47d44 100644 GIT binary patch delta 16098 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 JHE+ak{|{OM@MHi0 delta 14465 zcmZ{L1yoht7A{CjiGXxB2uL@Gba!`4r!;J&mFCbb-5^LFDJkic?vRoeX?Pp;-uvJC z-aBKQvCmk0&NaXJ&2P=M&mMaZUc$aRfJIl9gM-I`fkB3WG0+x{Lsx-&IGAw!IZ!}Q zy&j|f)4+rx?%?UeNyru~1%w(F=lAal@b|J8#y>58pJ(t!`>(MISf0PWT)&TGkN6*s zwfc_)VSf*#!x00H3*=8i4{vdw4ShpgH>isGEWZ0;mqLZ8Z&JWM^lWjzwFja3dp6_sQ4ahIYY7kd z^>wNXe!~1hiztYy2654v}Aw*cN-1Y?xbtigKUDY}rfN*QY$s~FF?9K2Cy@pbY zLg7~fpN)UPTUvMAeS99t)vcrHNFJ1A_Rx^hYr)}#hAIZP7<#=-lVP% zY%c?CTSOFY)*32F?tR^hLza}35!Po}6s>k1Kl{s88e!ooe@z_|y>U7cg7Jiy_tAdP z;^}wWy7h}YJOwm{Z5u_IStP*e*N*veqw(6_5B3z-VxMVZ=$Gd37&Pvt?MPjNEyo zrhO%TEAc_QME&vcw;=k0pBgW|Ea^N$9f)@`m?3GC?Uf?qvJ)AYslGkrsbtu+K@uS@ zG=k2LSez$H5jV#kofPvm)&KeU@A)wlldXXCPiZekAnp_U$soch98aAUH=raH$J_(rr}3`ADcn4e1M&2*=NBiuyCyUtEu}RRD2< zwZNMR)c6gbjai0`HGA1mdTv09Rr&PA8Y4NX=Z{O8GX!7Rqo6)Kj5N6Nw61LqXV!E< zjN&)_d~cMNKA&v4jk?Mj7_4NpS~KiNy;KMYGMmgSanWTBK!`NGHu&ix>trv}SsxQU z5h}qD8n9urfN9)+L|*Si>*m(@UCGqIr-$=LCqgxkOmh~jB}%_yhHpAR2w~~v`;iw% zY}F9_(^_vQWAuaYoaz_YDZ6Y_J6I9tk5Aui|H4cip>fU6VR^Ry?Q7UrZgQXdk zaMZq4a!dv?Anm0&Ivea0JeQMlRkWkZ(s!b8`KW;luE-4rI|+$J#d_v#I~JEGt?Vb7 zV14scv{C2}h85H0M|DxQfXX1J=jUc4ahbu3=wcElb&>GF8ETbr`TPk2(J2c;*epej zc3wf+Z!|bR0=hHYL;NiX)xW|wJw=_*r7jqB?>#Cio99@qYj+t%HGTKp2>IsIv2{sp zkk(YVHIYi_MM91}yWIUe*Ra2omu`UQ-Em>Zf%r;LxI){wkaBg(IUubr`&p_2k(|4W z;9~CdsKJpFt0VQ)&dH>|wL8X_uT0?R$T@#e3*($zX&(RuWUEYu8he z9K|ndda@`AZ}Z-V=TJ^t8GGp)iURZ)Pfuu6H;FE3S(g*?KaT;b&_!P(5xHq(&r!$A zN!;?s(bvs*851&|?Z%hQ(a2Bs#Oz7j?^wQS6Zvv+iz&>Zor%uy4Ap=9($e~oI{}!r z)#vQ(nL3TETFk9ZjW~B7rB7o#IOD9~ebM$#5yv7Yp^bzG*P=vXIr?IB;j!vGvvncE z9%6}O`-Wti5)>COb`Qa9?r!zOtbfcC)l^8pRN2rIqgk>w6tZAf>Ye0kz&4i{HL=6o z;da9dVWLP$nU7nF^yiQ>9y!YuNH1?V{n%?YL5jtnbXu?VNsckbNwWD1V$_QtBJ@zU zf+ZW_3b_^01*C3Nd#@;xY4cYHV-95ppY8jN*}JOvO)r}O9!OOG%i|tNHNWbO*Q9a` zS@Sb{I{Aifx?&UpEHOoe<{@Xtc5B9BJ)2Dj-@;^XMSFK6Hq(g298hkEPCnV-X8x+k zbsrqHNuO3KBXTxS{;;IcqiXS*Q?Ex|RUxm*K|we114~IoSoM-y;Tu{vOlF;KC8L(H zh0MkK9rBwUfc!JUbUW%~@>^T10QQ-F$)oQFGWXcl#{D%bitZIlk=GMC_1+wgi;l=h zw#PJcC?9cOb7?gU84&9fBh+Xyf)!_+V^|9xdqOYqc^`S)HQDB}EQumAOu z0+4p;S>95^$8eGkIGv%Eh!Sk5?U-wYPu9Z>{DH_zj*M6%J}+zD7q^i)>wBe~U@kZ0 z@J6fTTRC?&-gU1kmkxEr?ahq3$Ze;HA3&IWqdE9JZ)fAw`eb$OXMPG=VdvP!>gf(} zb2VbsG67s2ANr>(Eyo~s7p=M-ov6z{1FV8}%vJ8r^X-IE0q-o_)03*Z+_|pW^6@2uG_IQ>{?)9bT$?S(b24g7>tMrymaCVIQqE+;N88yuH~eFuc)tuVLR z?yfISptTame$K7${8P}w%naPTo#Qe^GBB?r?q(hH*5;QTb$tPSL2EtgZ=Z`IMtL67YZRsKlnaoo{9p3oo;+z!#05 z!*7{+czKBRyj!oXewzE;)jLrL+&Xt6mQ@Uo7>P8p60H7c6`>yv?KT#?KMwo0e{^-+ zw|i(&n5_hmCZ20*VAHkzq}yzj?VAY}j_PRxgm1;}z4-4TPaCd|fS=}869X5uVWz5v zOEp2+0MXEv0MeLk?ubfuxAk%~0R zqAf~KnkUN=O1^bu(~Eq6*?0SMVzGSteq`1_#r@?bVls5e&Y9%So>Skwb|*|w2}w!g zPH*SO05f``-rWbEu@9R`A^jEC6bjy-7WhB7$O*d%KXn}t+XSXAon~9|H>c1&mb}TZ zbsfmymWs%%OU_;uB>6Q;hZpU$FVHBkn>Nwl!9uQ6upp?kXvt(O>}whdfed2f3{^}Y zBjf_D#jYrZWcr5Wy+zXf)t)km%nsX}eLLywHT`*{E!?N?yR9DBDzcjF<;?A87@2jo zUb{aPF)O#4bq?fKjrg3ds$G&B4Gw2rV|LG$b}Kk90|cxIL38{$-&Q)DI04dgz-X&> zY0jnCiqnhNCku!10QS!#xnj6n+A#&(~a>ag@3!^-bDI2L{ ztJlFul343Evi{>Ls#2Ay{lhZ&k@Nj&^=^l2jndC{`M~5wgU)?ZY2>Ea?nz98UFoT6 zS&IdYA5o%G|MD>75wl~+j@|he4fG<`h~w9)g)YlvBOYzK{{Hoz845W z78QZ50h~+kso|?r6`ub;*9UYl_E?pm(s%7EmNkGi=c9*p|$n$o}7e6$1ml9WLB<5B_ zW9q$^W~5YiOJTcVRojlH7rORxgyXqIOPe5%a7JZYV>$)^5S4nf;9Bqk&);{)h?F<) zZeDB;G&U~|fA2P(6?61HZm?fUCh3}O1hgWzsz}-yEoc1(--o%N*4D0FpDa$f1k2-{ z0rs4v7+1BcHwp!sMw<7ANR>W)P=(HYVW$#J0sAS&DwGP+_G!IxaT5}LR#!iks|ZtV z(?eR*#$7$FmXgW|A&(_n?_hgUs*&h7>2hz~mJR)biJ?+6-+QU-YCVGO4M|PX2ev2& zn4Kd}6ynY75;Cn(2GW>WU=3%znuL5Xfn3YacAvboM#*@=B&(vE@U);oT1c4H`^Sfl3nMH%(#YNvIZoo)c8Nlmc zT7>E2(R`}H@Wi*(K4E zi|e5WX7$bQl|gDD*=0euT-#Xyz)V&jcu@T==($o=7^OubdC3iLLD8PN{CNuZtCPyB&!>)6`dVE=5$mz41lXjY z#4U`ErO`_9GZ`&QCJMfeYik_mY2b>m^XES=C|z?$Ev8ggQTZ=(xxe=A3oH_Jb6AsE z8n`}@7$st)qWi}1xTUW(|I7NX@pp%0${0;t){0WkzU^3-8piL+62-YXkQcJJz|cbB zw)w|WQx}uOZuVd{EjB78&B2_AQHea3no{N17ilM$v-{hLDz7YKdoJ=-R&efYW4@%! zgs_+~AgfDfuh;vTJ;b~GI`sG`; z4s5D?=NL|xQssEg_yzM?I)(L!h4~9_=Pow*!W&LgBk0+6>7pS5hW{tv; zOU2*@;4fPMy*7-Ao z0DR^SD+PzNncFzMYiXO3^(TQ9YU1-an>As3Su;fIV9vC^;n%pZ-Amg7!0^X1dF>^4 zJa@rtbv`Tk&oMJx#CRr4?#kB#pVz;9ro$y&Dx$dGG?2@1Us!a-ldUyR?Tp_>-TxU! zSYqq|fVg~?Dt&jIZ)gogFvnu4Dek8%dQ8(t*= zVQxK05fv+0`?rFhEnh*D6`lcH&e@Y3_6-4GDK!34;W-4Kx%=NtKv(jK@8dAMUe*P{ zYW#<^|F31n^C-T2tno%ELOu<88A1j_4$-13xvyyB_?evj8M}vSg!?SK481@;kk+V_ zKAs{>D70iiNH-$W#M+lHuhmOXWU%4b?)O0HwrF*W2dANDvIKuDT#B zt>XM3S(j3kcv)3_+rTtL>91&v1bMRkKhcj$;@#ykBh4)1AsXyqvae`J{xzd9_N2(a zXAF6m5xQqiYy|0l62Ps&4g`U=`;2`hk}`}k$2BN6G~^T<#pVf&45JDwb9s_;_U`OS zLyAowY)jK&_8N0y?Ny}}nd5h3)q>zdsCDLoU9n#aS3N6TC-;Ao;Kk*;o406Bx6YfP zz66sW4eAT$>0@iqgG*Lb`hAsxHV-W9gS^zoS8c-Gu#bx40TSqzV%TPrn17`F5iv^Q zr!wj?LWGihhWqb}@YLpriIFNa7R@LZ>M{>@>n@=3Xw(Gd{*&LD9rmQc@BHXBRP)mx z^7A=x)6Np$)1h%KrdA)XjL)!1$d9MCN{@AT^prhFwx>9reG%TbG=I^xs1tDJEBOp7 zojC!vTF^NEk1>u_dd~mD*qLu9R!Uz0-#J8Xl(1*o^Y8dV#5f^%}{<=mj?OPY`ny62S?SWuSj+`%l|n z3zd?rOICl=AEy$L`*rjjCDBb;=7Ch1_q9WD&16BckH3~jF-8PP#dr%|6)sm^73 z@Dn#cP7+2d5ONYnWsxc(7yNn?fEkvrIZ2c*L57m0$440L)CGVS6N zYyPYNw`m!*I|XPnceWPl8Q5?5`#%#3pN$=KL0ms8F~(@B_JZB?F-iz0!vl2;)ZK@) z#bqRA!Gjz7q>MXGT;k2mS74d3m4=UnWxmG5p=41(^1$0tvi?c($Nx-uSwUG#3nf*Q zCQn@^uCh{CWBgByQlqs|_21&(hZL%k1Dj*AyBYO*FKIr+(ov%ea&CR{?G5IhB?Fl8b?XA1If1bX%U;8|I0F zAHZ56{r_iV0cSkRKLK7B{7+qd9Ri!1Wx+K&n;=W-{UdMhK;oVkPcK)eBT)*ap6I%m zqAon!CHh;xi)P=|%R5h1gO?s!L5uF_$iG;FdS%!MpMe)jh!JC(*U$DFg6ucke6So8 zLkv}d(_NLG2B(`gVvld+9DiPldOgD9kqQLaEsNIYeO@39f!cZysEX}=S={t&Q?EoJ z-kjnLb`xu69v>=I5goVhZ}U1w_}%w6^a6b&K6xB5EW2YMC|)EuLIog%xp9usW{UlOSK!pXVy*TkLqLg&%!$IW z;^SQ{3JQ*|JR1UpVrbbX_6`DDiCkBqlm!ZD%8|i9!@f+#pyEx<0V&Gov z_|=0`kwkcN{=ljr^z}yiI-5G5tJ8+w#FG>B%lbZ^B1xJ)o^E@_;?6K|H(riCeEnS9 zx4&WWwH*4`SDxOR;!YC5Y2aT#e&hJq@z_R)@-GfYY!HVBjM@VZXA2NVh4nvitc~DK zVoUtRQOE@1a8M|Gz+r}`ky>6|=sQjH3QV5+^7~{l^<^P`7y_4VTr2^|5y?A)fjX(< zdV#_c3V`s~(yKHP+H5&jr!Uq_u}Ho1U45HNqM7fUTC`cl!E*J7ZrVs$VvSIMos?IT z-{XcwD+Tm1WS-vcQWt|&dXV*eqH%kO!vpIM@AGuDq0fGI&p$=7J*HnK+jp?Fkv3=* zsacq6#9T@X1(|D*Xw~6jlx|gkyX0|%C}`rr$u=oLmbBcF-H@*3S!*vaH1b54v+f zY&8iWIa-(icz!D3&|3_w>^$vq24N!gGLBMhjyp5BYCr{0eY9;lreAWe;sSNF^t`Ih zMTd>+%u`!qxAM z+8UKi|5B^{_z+mhaRp~iRGVo^3V;K=RQHvOb&PXoeo#vN?+R_!_xK(CTY|qUfAZU& z{Eq^m&tgs%YoQe-6mKpMoHNQ*4<`PqJI+xv>T$fI+TGCn|BH~?g(;WHe-<8z`jXZw zE#wn~LK6@E0VafBlM!Lp32Eft6v2TW4+J8Cr^^|Z&mb#W&wyyH)+&hEt+Gm?w~?2+ zBXl;6FjvK~es=DgWN>nFEcueae$L{DPtbR@`=C@1yd~lshM8qz9bo+}5qF-&>M#{t zAME9PCit*?&FVF>AAkPE&?WoI{#*}K^VN`Z?XJPmPv{cH75Z)cHc!z@njN0*sUOmQ zNuq5C=7_hUfIksy(;iohR>yvitxdROhgXlSJjyg@aHv=(GvP3UiVUHmE02I`n}xD7 zR+DJ&hxJ0a170&W6hWkgqUd>&8BiV3wZt=}O$)>%RXoAbV!h1#4{rR5HGBe^Z5E?{ z-J;q$C`hVAaN9l+eFWLYZQDrE->;+qBz?*J(b2;~p|-qbFA*vPE&JOp&sU$a+ZOm^ z<}Bwft#B4ByVG%ViRUd7CzmZDD7EeF=PZvpM)YF` zbg|-AyL+@0hWfQU@k%JzKf*g`BEf%taTesr-!-Gk8&B}IvLVP{td04Kq=_q?0f0RO zI)9hJAJx-iA|Y^|WDc|qbVaMytg0h;T4{|8&aB6op_UuZnXwl9?8>h(d?9Cj)EV~B zA#L0ls+LZeJLVjXrC9@=;yLrEl!xr99V)g*RamPOzM1HCg+J@g}OS}_H~7TTaNI&DU2@IwHYPi zjH?7OVx0MUr!URa7+`M`U?azP(hD1sR-g!ennDBIzbx)?65xi>SsYyU0Idc!d zc-d>Xy@Feezx$$)tY%`|EG&Goon$52qnm`J0joo?{7^F<73yWgEZIv!?C}ZX^h~ye zq!DhxWEDg4?PFjK(E4@~M^oMs z26(dC390BMf-_S0w?pa7q;~@F`G^NF9-o;Gp4e1w#0mU(_O1?}#KVbrTa#PH?Vz{; z&LcqJ`9cSSvgm@SGX>giB{e0N6H?>4fpeI$8hy-y2@mk*PmHu_vuKaW`L_b?B+m|v zXZibAG2VNaDr?bWl{}0cz8C09)A6Flgpyb=OG=Rvx3$$V;gSe(qIZxQW1{+0KWEsi zM(RFit4>dh-DoFUi8=2kQ&nherCz$|bSTt`7&}H9P;?by<)%25YN5D*yD?eCOv<#> z0L-MIObj=oF6C%@UudYCJi5tb%x>b~*J9vrOrUDb(fLd0LU*e%B0p$zz}$dpyO&Tr z`MY8scpyOJ`AtU+Y+@%Fbv7%4Xc14u zLixK<&c9x#FK|1_ILk(<-T?n`YrW`nHq|EdEvyi^t4>dyGIhJ@sO8u^`8VFIyb}Do z9D*>?l6Cguu<+k$f_PQ8<_lZ5shp3vG|V`E#yQzhO`lq-efOQm`2qXO$pTaJZKchR z*XPu4h2(coQyiHnxTY7a42l-57HONP0Q*RR@s|s6fdbD%7~iy3h#WXQ%;UDu@i9t& zB%Q`p>R)2Xsw%-h$Vmwc&3u^RZxt6V>+imHcFd|rjm07L^15)?CqxRMu1bpXoBme@w>0pD% zHys**iXdCTLY%U`sxw%y%lLEJB$$N8g4l2CByJ9vH?rNYZ;$zUF-I{ zmVb(QDgc%RM{aEN)ZT&`35@%h>F%p)gFrzf>LA%{A`gu73qddx%ok_K^AWvntZ!qn z$l}vaksrZ-Bu5@O`NUYWzL<)G{Nds~X~j9aXn6R>5^k`$N0iFfgUXn23aG%Nu-7(q z>%68jD0ieiRAIdM*`;j!7^{u44(=?C#JRR87_ed5yuns}jNxMRcezq~E%L;alzdLe zyc;df;VZ{a9P!syfYP4r7r|yMm;A*Yr0B50Ft0Kwg13M)75t49m+DVxqi z$cM0`>0w|2-FQX!oQ0u zi>wqBsdhAJ#eYPKc(J~Gmy}671f_K@`xdNS7PcD$-V=3tAqKK})WI&cpX5_^Wa4+L zU-31;GAcmo_{E-5s0PMihCmv>DlpT*ps2OMOX(0xEEzK)lWHvX(&l715|K;ueAtl9 zFvOQc7#L|y%G9}x@%X{Zi;5UX{8?#5dbA)tWFNNYP1?2FuBAOo!O#8~Z=9is3!YbUQJj{PhXaMp}d zz*5l%uS?DjY2&EcB0h!<`BCsh(fM)CllQ2=P8>f2b_m#YaUMOk#tQklpxuhMr5zq* z3j)r25=~(d!}IKaoY4QrhdLTE5Z|um?&ti+ZT-Q`r2{U`TObx$+MM;BQ@eD+(c|x7Cb^2aOb|fYZE=e&eg5IJUL5sni&-g^JQOd7_HL`{# z!Ws6fNfO^mn*VnCnirQ>@%VOldD0xCrxa9+ByVM6KM~&gqm?8cfJ>M~==Fx*#NTjL zoIleE3Hq97pE%T1L6E&CmJDv80>E`JGw^AX{!9F;SFRT?mkF|U&P z`ah)P$JOyiL%<+f4?&LXv{E@$Z69*~Q4q%)rKMmUwqGpI2`8qw9+S>!Ei3$FF$zM`$A0aGC78>eOfq+(l^I3#jwJ@X z8TQVhDgawdqsXB_g8+{vgE!?P*bI1AFAS23A`$4oogKTq&ye@sMD(`=_nGK^csj~> zxC|J@IaE55-t!Nc(tyU=$`~lHm0+`=*`}2anHG{2c&8dX#Wgo;t^$(!Job)v;Tte? z0gzu`WDY#_Hsij$3vwc2X9B*jRnAiZFEh zA=r85Q%T|Pu@#AZ^+7r^oFdr=)OrH{flg<-+yi87EJsi*sOAPJv#d}VW3hw zozEq;;<=XEoC%Z>J3Cw&!}pP}HCr|{-a&+5mkd3Ie>JEBW!}*A0oNWe90R!*kTNTB zAUa5`9Bh3!(YRK*Ddkwa5))4|9x2WaFgQ1Nr;TGQ8l>_{NPDl~IQ6UWN$A~+&@gQ6 zSmo((b{*%Q7y62^4EVjc%(%U@Qu?{RB45_Cy&YzDo9f0Cs6#qH)XlpVQ^|0FbTiQv z)cqEE>dJJlA>M0gO8q{<{_CW}W>y_5AZQ^3&)YBj>4xt4#^gCefB;z<;&50s-fG9? z4bqCtu$m1-P)3ins|4-?%QQte9m!xYSPdnY1>K2^A;?_eip-IDx|iz9UduI^_s34) zwANP4FO*yo&XnurPLBkeph`#PP_K9n&TrI8s#%EwmGuQ`!qiwdZ-J+S+(s{vN%4hYn-(~zxUP-kC;|8p1coT#s#q;jasH(&4tG`Bb1m~ zhCk&^85@86Mk9p>2e*t(dLXrEygjW9EJ^x1YKERA3N>g!W?egVpNeKIwKThC{05p7 zmrQ)Z)_T@n@bPPz@eUn>C}1p(y0^Kxmkct=jUW?9Jue^sh@TrG;R~&YoRBNUyZC}?a@i*q z<>Gw=8Kp4o+ij&ZfUF4VN39-Tz3ZuY6ZR}L9;7f3JA0yt0_mE0PqeWen?X$*SsofVu)T` zNAj9Nb{yh@8a{6F<`0SqPIO#;ypaDcj_D8TK}v{Y>GsEisi1H~ki$i(KB zK<4?Oq#xg02u3Yr0*p)b<*24pO^{LDfZVt5d z`6(iy3I|D^-@nvYY-_l-CmG8T*!3BT6j9XYSFr9ix7&RNX9)Z=L!55W-L>>q?q~yo z9vEyeiISfOTTj)Fyb~<7fa}{?_MiOx#&XpKX!Yh*#S>5TRI{>Ndr4Vhl9{0xOuNNw zg!MmMo_{-m17=j0pV^_*+i~c<-(EoLOKnDm?E@E|zHvQTOD@LDQ#*zr=2_c4&aR|{ zA}h1^vaC^H$^AlZql1eMIB7~Fg*ne zB9y4M*oxI~43yxhakXvuEVO4u?#LqIQdRQYa!u~N ziuv|Ox$#ugf#m0j2u6Xd>sxZa(gdQ83&O2li~8}S;CLEJV%S_NM0G> zJ}n4880t#Kng2Svo}ABtm%=Jm1%+#cH|k%J`}J5b>X>Gepn2;8Z85_0X50jwluHum zO(w>!U!qt~{u4j_QdRtS{CDQy+Or0AY7}Z1g5-74f6;Q8Jj{yM~d+vH%DPC%dmJVj#=O64oIY-@i1BoHzqH3215|XY}rrF zp45C?dxIfANVwlOC9p? z&mi#bCUv6a<#=vIIul~3l$~`Q)ZLeCbm#6gU2zz*;BXP_*-54t#N)3$Y7#{P?qz|* zVs-gY)24KhEIR{9si%|m_JME!fuQ31vFa4ABxxsdySvyOz`VHP-qvuHW$!@xe1~sm zipKbxb2A(EF^crioAcEv<8tgiUstOAiS4bs@_WvE-6c~aprz%qc~17*S!G$y)%~~L z)^{Ng<8dK0J&a|#vuInaVd9dx?v=>S8Wx*K3@ctzL+jyQ0zbVKG^fyTj*Kt3fgCt; zZLz3y;AUilbTT~X>{Lhx>2weRTp7@J+Nc$nMmW;QiHMFo5H!sx8WJLXj^1up7or$@uCu{4jpm;&HO? zDj>6uVnsY9r)=iN+sW45huQu=SYpbl-k8y5V8t5i>N(NIg>rbo@j~FN7D`*v`K~S` z-g96e-u_AC`C?=Y$5nkh!3r9d6>kU=ycK9db$S?&EW>Oq^djpkB zGe6yqb)4%)jlD%5IKPV3nGfxOAqqgpvg0jag13{V9q--kmp7)OY^o1XV8O5h(o&$A z#wYcA=+kd}Sp)n{t0Laj*!V^9+1}LR^!82d(aS)7N59r^{TJpbyp#wjM?= zpaQ7I<+pBc=;HN^0Ix-=H?=vd{BHsLnS*)w_GiX&!QzSpJm~dfe;hNA2>O7(p7yr> zdOLci#QNVKNN^c!))I*qM7BG3cw~%PP4kMfC^8*!e%qy${rmH^q7UHZ=ggyrkn>bG z^;2gJYR*9wo!)SuEbaK}_cJ?z_thTQARcC{r+gL*oHLTir-^J^)j}Up>?EkS(q2xz znFFS9VKia%OahqO>rJZnEggh33GldP_{#-8fYnbjTQbUO7VB_7q=f+!qoj7}Z?vwC zV%cIc8#eJV#h!UDjR68fn5ieU%Z@&y((5Ht3h91k#G)h=h9EVGPcl~XjCg0)H!Vva zGUY-8K!!I;=&W1fis~fXl_7MCiX}V->DAw*MGUZlxG)Byz@}HeT0Wa&gffI>ix%~k ztDTU2stdXj&TtkAglL&W1x)G&am8yAdFftDa|du8IuX=SnJ6SRM;#W%nMQS*Qh~YK z@-lIo@4#xCy+$jCor?WPyR<1OUlR7CUmnl~SLBp&RDPYLCV{0joOUf#&3LGlEI71A z-yYGHIEhfj%uTyfr|LtV!Sk+vBA5whcmvxr1@;s4DQR76^F$N6AF@=zA$NlYuYP%FrcDN~N=?Z3TwJcj} z?TI16_O!*{5SCqiqPHdZbzOI=2Lr&{3WU+qUWc(`gkomK=+&W-Tp4S)fm}Fpzzx+K z3)*t5SY6v{TC6ax7FtPLZ~O}93eOJ%L051@Nabj&B)-)(<-UdGJm3Eo^kq{wKmb zIO6E@eVa?0Ryi_BCm7x=n7_{P#NKSy1buagPW+(f{8wbf=~Lw4Uv%lTa@7P`;FH%@ z-M+$Uir)v4(rdN-XUK-hB215etuDGnZ$A>Xo?|+REK@7Z~{~ee3eVp``{e7hH;Xwi4ywdvpP8P((=l3)AkT@SA zSQAKv4}s3Zxqm*Dj|TJ4&v#T97*`87H){tgR~AouyZ^~RE64Ha90xND%)=M|pN=rd t5Her7-w0%Ui5@wNK;lI3Ab!4RWDf!VNeUR@AD>M~u`elNw9CWL{{aFnmKy*7