From 8b199a9f822ca42564a7a89da0cab3133684bd12 Mon Sep 17 00:00:00 2001 From: Prabhu Sreenivasan <45380242+PrabhuSreenivasan@users.noreply.github.com> Date: Mon, 23 Dec 2019 23:57:35 +0530 Subject: [PATCH] SONiC Management Framework Release 1.0 (#18) * [JIRA SONIC-9259] Add range limit to mtu in sonic-port. Change-Id: I5917eb03c44410fcf0aa0ceb5720cd5c12415d00 * Signature chnage for transformer functions * modified acl-key xfmr to return integer and enhanced the get-req handling in common app. * make common-app as default to handle acl, add the field-xfmr for acl type * [JIRA SONIC-9203] Added IP_TYPE field with value ANY in DEFAULT_RULE. Change-Id: I82ec0a1610da009f9906d0ac2ab7c5eb5aa4b13b * Fix for bugs 96, 97 and 107 * Addressed the comment to sort the speed * Fix sonic get query failure * fix to exclude key-leaf data populating db-filed value and removed commented lines in xmfr_acl * Change MAX_MTU to 9216 in platform_dummy file as well, since it overwrites it. * Fix for bugs 96, 97 and 107 (Speed is not displaying properly) (#109) * Fix for not showing description when description is configured as part of #show interface command. * Addressing the crash when max mtu is set as 9276. Currently supported max-mtu is 9216. * Fix for bugs 96, 97 and 107 * Addressed the comment to sort the speed * Change MAX_MTU to 9216 in platform_dummy file as well, since it overwrites it. * fix for show process not working (#110) * added unit8 yang data0type support for get-req * Fix crash for get leaf query * cleanup code to showcase overloaded methods * [JIRA SONIC-9466] merge mgmt-framework bug fixes from Dell - 12th Sept Change-Id: I2a92251040a816c24f8433e49dd508091dbb494b * fix the build error * Fis get leaf crash, remove unsed annotations * [JIRA SONIC-9426] CVL throws error when trying to configure IP address. Change-Id: Iec675bff98c912ef5d80a2d38524748d6a0b1683 * [JIRA SONIC-9494] CVL Error seen when performing no description on interface Change-Id: Ic3e89d74bd399e891a06e14bd4ff7dcd486a9090 * [JIRA SONIC-9420] Updated Help string to display max length of ACL is 63 characters. Added pattern and length check in CVL yang also to allow 72 characters (63 of acl name + 9 from acl type ex. _ACL_IPV4) Change-Id: Iba9ffc7aa34f1600c61b95ec9a3e23971533e829 * [JIRA SONIC-9496] Disabled nonyang demo app Disabled nonyang vlan demo app by adding .demo suffix to yaml and app module code. It can bemanually enabled by renaming those files back. Change-Id: I1714e772fb452ae246d44af65d43dd1cf65f5e18 * Adding Interface table entry with just name, before the one with ifname and IP. * add get-validate to validate a YANG node durin data translation back to YANG response * Fix crash during update request to leaflist * Fix top level delete * Fix: Incorrect LLDP neighbor TTL (#117) * Remove the TTL information from CLI and GNMI output because LLDP neighbor TTL information is currently not stored in appDB. Signed-off-by: Garrick He * Bugfix for creating 2 interface entries when IP is configured, and when interface comes up as L2. (#116) * [JIRA SONIC-9314] Modified the MAX_PRIORITY constant to 65536, to help app module to translate between SeqId and priority when given max seqid of 65535. Change-Id: I314e5cabb89779e0410d05d18152425f2c0228b2 * [JIRA SONIC-9472] Modified logic in Jinja template for "show ip access-group" to display both Ingress and Egress ACLs for single port. Also updated help message for max allowed characters for acl name in "show" commands. sonic# show ip access-group Ingress IP access-list A1 on Ethernet0 Egress IP access-list A2 on Ethernet0 Ingress IP access-list A1 on Ethernet4 Egress IP access-list A2 on Ethernet4 sonic# Change-Id: I601e1b21b01e40ea6a285400e803092c66f1c941 * [JIRA SONIC-9521] Merge mgmt-framework changes by Dell team - 13th Sep Change-Id: I2a830e2198b506525ae970377a5bbfb49a98006b * [JIRA SONIC-9486] Permit only TLS1.2 or higher in REST Server Management REST Server is enhanced to use only TLS1.2 or higer version with one of below cipher suites (in order). TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 Similar changes to gNMI telemetry server will be done by Dell team. UT: 1) Verified ACL CLIs, which also verifies client SDK 2) Verified swagger UI with Chrome and Firefox browsers 3) Verified thru curl that sslv2, sslv3, tlsv1.0, tlsv1.1 clients are rejected by REST Server. 4) Verified thru curl that unsupported ciphers TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA and TLS_RSA_WITH_3DES_EDE_CBC_SHA are rejected by REST Server. 5) Mgmt-framework automated UT Change-Id: I378522335f69d9a73ff7d62dc7ceec79087faf2f * added yang annotations * Get case - leaf-list support in Transformer core for Sonic and OC yang. * add the field transformer for forwarding-action * Set case - leaf-list support in transformer core for OC yang * provision to get data for sibling container from the module level * Fixed variable scope issue while processing leaf data to redis DB format * fix license header * Updated license statement for REST server sources * Update license header * update broadcom license for pyang plugin for openAPI * Updated License statement * Update broadcom license * DB Access Layer: Update Broadcom License * Add validate callback function support for acl. Children will inherit parent validate handler * Add copyright/license headers (#123) Signed-off-by: Tejaswi Goel * move json creation for sonic-yang to map * Moving unwanted CVL YANG to testdata * Updated Makefiles * Delete file checked in mistakenly. * Updated new Makefile with license, copy schema from testdata/schema also. * Updated License statement * Update License statement * update broadcom license and made changes to keep the diff file in the ygot-modified directory * error handling and code clean-up * update broadcom license to the diff files which are created for patching ygot files * Add error handling in xlate_utils.go * fix the uint64 encoding, fix the ygot bug in handling the union type of leafref * For a Get req on individual terminal node- Fix overloaded function processing, data-type conversion and leaf-list check handling * table transformer support * CLI skeletion for VLAN feature: config, show and its templates * Made changes to keep the patch files into single patch file * Cleanup of unused code * Updated the ygot patch file * Changes for supporting show command with dummy data * add the union type * Update Makefile Add rule to compile test YANG schema * CLI skeleton for Port channel Signed-off-by: Tejaswi Goel * Add post transformer infra * CVL changes for SONiC YANG * CVL changes for SONiC YANG * Initial support for table transformer * Fix issues in initial commit for table transformer * copy the misisng lines from transformer-phase1 * add missing lines from transforer-phase1 * support for table transformer for crud and get operation * Extend annotations for augmentations in oc-yang * Addressing the comments mentioned * Fixed alignment of XML files * Cleanup of the xml files * Handle nested groupings for augmentation * changed the xSpecMap to xYangSpecMap for code clarity and added new file with transformer-constants * Changes to remove dummy json file Signed-off-by: Tejaswi Goel * Enhanced transformer core to support user-defined key-delimiter/concatenater * basic support for sonic-yang annotation * Fill cvl KeySpec with DbName read from annotation * More changes for CVL YANG * Fix table get in Traverse for App DB with ":" separator * added support to invoke container level key transformer * added code to pass the current ygot node to the key xfmr function * added support for sonic yang non-config db get request * Data base specific key-delimiter support in transformer core - Sonic Get case * Changes in show port-channel command Signed-off-by: Tejaswi Goel * Add checks for xpath entry in xYangSpecMap and xDbSpecMap * Chk for list type to create keySpec * workaround for VLAN_MEMBER_TABLE list level get due to translib.generateGetResponsePayload() failure * added key-name support for oc yang and support to create and push table with just the keys and no field-value data in to redis. * Updated Makefile * OC Yang Get case - DB type based key-delimiter support in transformer core * CVl changes for SONiC YANG * CVL changes for SONiC YANG * Add check for no xfmrFunc defined case * Correct naming convention for Interface commands Signed-off-by: Tejaswi Goel * Changed processLeafList() function name to checkAndProcessLeafList() , added comments and removed unnecessary logs in common app * fix for vlan get-req crash * sonic yang get case handling for table instance level * Handle nested db-name annotations for oc * Import module name of the annotated module in annotate template file * Added table transformer method prototype. * Added table transformer extension * Include the prefix for the module where the grouping is used in annotation template * Include unique namespace, Use the prefix of the including module * xspec map and cru support in transformer infra per revised sonic-yang and changed the api-names from cvl to sonic * Management interface cli tree, actioner implementation and sonic yang for management port and interface config handling. (#153) * sFlow CLI Template (#147) * sFlow CLI template * Add XML skeleton for the sFlow CLI * Add actioner script * Add renderer template Signed-off-by: Garrick He * added code to support reading db data for get req per revised sonic-yang * rearranged the code to call the table transformer and collect data before calling the subtree-transformer overloaded method. * Fixed table transformer GET case issues : 1.) calling table-transformer for each leaf when doing a get on parent conatiner(OC-interface) 2.) dbMapData not getting filled for container query in dbDataToYangJsonCreate * Handle delete for restructured sonic yang * Strip augmented module names in xpath to reference xYangSpecMap * transformer infra support for revised sonic-yang GET req * Handle delete for restructured sonic acl * Fix the leaf level get for restructured sonic yang * Make file changes to generate sonic yaml files * support table transformer - GET case on leaf or nested container * Get for sonic yang at instance level to return single instance data * Use new xpathPredicate function that removes augmented module name in the uri * Bug fixed for not showing GB instead of Gx * Add Copyright info * Sonic yang restructuring fix terminal node leaf/leaf-list cases * revert accidently added local changes in xspec.go * Clean up of files and add missed items during merge * exclude annotation file from generating ocbinds * fix Makefile in installing yang files from cv/schema * add back the cv/schema/*yin * Fixed list instance level GET issue * Revert "Merge pull request #173 from project-arlo/transformer-phase2" This reverts commit ca4b330ead308954254232ec29b16412b586b783, reversing changes made to 211f17e7b80555cf41cbfa204411fe60c0cf64bb. * Revert "Merge branch 'transformer-phase1' into transformer_merge" This reverts commit 211f17e7b80555cf41cbfa204411fe60c0cf64bb, reversing changes made to f032ec5b286c344e6cf6a0b5ef34b9f116a79687. * commit Transformer codes for community PR * Update Makefile * Update Makefile * undo ygot patch changes done by kwan * update the patch file * Patch goyang files to make rules * Add missing models list file * Remove network-instance yang * Addressing PR review comments. * Add new file entry in goyang.patch file * Incorporating review comments - phase2 * Adding comment for TRACE_ONERROR * Moving go-server.sh to tools/test/rest-server.sh * Correcting regex pattern for key names * Correct error code if key does not exist * Address review comments * Address review comments * Address PR review comments - phase2 * Add validation for speed and description (#291) * Add validation for speed and description * Add pattern for alias * Updated the Makefile to have go pkg version, and renamed the ACL CLI actioner file * Update control * Moving jsonquery patch in patches/jsonquery.patch file, updating testcases as per latest YANG model. * Minor change in test case. * Updating makefile * Checkout jsonquery only once. * Use git clean before patching to ensure no files are left behind Co-authored-by: asha-behera <51354864+asha-behera@users.noreply.github.com> Co-authored-by: ranjinidn <51423501+ranjinidn@users.noreply.github.com> Co-authored-by: s-mari <52256418+s-mari@users.noreply.github.com> Co-authored-by: Kwan Co-authored-by: Mayank Maheshwari <51356673+maheshwari-mayank@users.noreply.github.com> Co-authored-by: Justine Jose <51496803+justinejose91@users.noreply.github.com> Co-authored-by: Arunsundar Kannan <31632515+arunsundark@users.noreply.github.com> Co-authored-by: Kwan Kim <29056019+redfish-api@users.noreply.github.com> Co-authored-by: Sachin Holla <51310506+sachinholla@users.noreply.github.com> Co-authored-by: Garrick He <32883830+GarrickHe@users.noreply.github.com> Co-authored-by: Partha Dutta <51353699+dutta-partha@users.noreply.github.com> Co-authored-by: amrutasali <51424374+amrutasali@users.noreply.github.com> Co-authored-by: Faraaz mohammed Co-authored-by: anand-kumar-subramanian <51383315+anand-kumar-subramanian@users.noreply.github.com> Co-authored-by: a-barboza <29963827+a-barboza@users.noreply.github.com> Co-authored-by: Tejaswi Goel Co-authored-by: Balachandar Mani Co-authored-by: rvasanthm <51932293+rvasanthm@users.noreply.github.com> Co-authored-by: joyas-joseph <51463120+joyas-joseph@users.noreply.github.com> Co-authored-by: Eric Seifert --- .gitignore | 15 + Makefile | 166 + README.md | 90 + config/transformer/models_list | 3 + debian/changelog | 5 + debian/compat | 1 + debian/control | 19 + debian/rules | 7 + goyang-modified-files/goyang.patch | 530 +++ models/.gitkeep | 0 models/Makefile | 164 + models/openapi/vlan.yaml.demo | 186 + models/yang/.gitignore | 2 + models/yang/Makefile | 79 + .../annotations/openconfig-acl-annot.yang | 197 + models/yang/annotations/sonic-extensions.yang | 88 + models/yang/common/iana-if-type.yang | 1554 ++++++++ models/yang/common/ietf-inet-types.yang | 457 +++ models/yang/common/ietf-interfaces.yang | 1121 ++++++ models/yang/common/ietf-yang-types.yang | 474 +++ models/yang/common/openconfig-aaa-radius.yang | 186 + models/yang/common/openconfig-aaa-tacacs.yang | 142 + models/yang/common/openconfig-aaa-types.yang | 172 + models/yang/common/openconfig-aaa.yang | 822 ++++ .../yang/common/openconfig-alarm-types.yang | 150 + models/yang/common/openconfig-alarms.yang | 231 ++ models/yang/common/openconfig-extensions.yang | 175 + .../yang/common/openconfig-if-aggregate.yang | 232 ++ .../common/openconfig-if-ethernet-ext.yang | 117 + models/yang/common/openconfig-if-ip-ext.yang | 179 + models/yang/common/openconfig-if-poe.yang | 110 + models/yang/common/openconfig-if-tunnel.yang | 120 + models/yang/common/openconfig-if-types.yang | 108 + models/yang/common/openconfig-inet-types.yang | 343 ++ models/yang/common/openconfig-lldp-types.yang | 306 ++ models/yang/common/openconfig-messages.yang | 221 ++ .../common/openconfig-packet-match-types.yang | 309 ++ .../yang/common/openconfig-packet-match.yang | 371 ++ .../common/openconfig-platform-types.yang | 347 ++ models/yang/common/openconfig-procmon.yang | 175 + .../common/openconfig-system-logging.yang | 503 +++ .../common/openconfig-system-management.yang | 138 + .../common/openconfig-system-terminal.yang | 249 ++ models/yang/common/openconfig-types.yang | 466 +++ models/yang/common/openconfig-vlan-types.yang | 206 + models/yang/common/openconfig-vlan.yang | 449 +++ models/yang/common/openconfig-yang-types.yang | 191 + models/yang/openconfig-acl.yang | 847 ++++ models/yang/openconfig-if-ethernet.yang | 438 +++ models/yang/openconfig-if-ip.yang | 1322 +++++++ models/yang/openconfig-interfaces.yang | 1067 +++++ models/yang/openconfig-lldp.yang | 660 ++++ models/yang/openconfig-platform.yang | 779 ++++ models/yang/openconfig-system.yang | 997 +++++ models/yang/sonic/Makefile | 53 + models/yang/sonic/common/sonic-common.yang | 50 + models/yang/sonic/common/sonic-extension.yang | 61 + models/yang/sonic/sonic-acl.yang | 221 ++ models/yang/sonic/sonic-interface.yang | 67 + models/yang/sonic/sonic-port.yang | 93 + patches/jsonquery.patch | 14 + src/.gitkeep | 0 src/CLI/.gitkeep | 0 src/CLI/Makefile | 53 + src/CLI/actioner/sonic-cli-acl.py | 278 ++ src/CLI/actioner/sonic-cli-if.py | 154 + src/CLI/actioner/sonic-cli-lldp.py | 99 + src/CLI/actioner/sonic-cli-pfm.py | 128 + src/CLI/actioner/sonic-cli-sys.py | 164 + src/CLI/clicfg/mgmt_clish_entities.xsl | 26 + src/CLI/clicfg/mgmt_clish_entities_macro.xsl | 32 + src/CLI/clicfg/mgmt_clish_feature_master.xsd | 98 + src/CLI/clicfg/mgmt_clish_features.xsl | 66 + src/CLI/clicfg/mgmt_clish_platform.xml | 38 + src/CLI/clitree/Makefile | 42 + src/CLI/clitree/cli-xml/acl.xml | 218 + src/CLI/clitree/cli-xml/configure_mode.xml | 38 + src/CLI/clitree/cli-xml/enable_mode.xml | 82 + src/CLI/clitree/cli-xml/include/pipe.xml | 501 +++ .../include/pipe_without_display_xml.xml | 482 +++ src/CLI/clitree/cli-xml/interface.xml | 163 + src/CLI/clitree/cli-xml/ip.xml | 40 + src/CLI/clitree/cli-xml/ipv4.xml | 84 + src/CLI/clitree/cli-xml/ipv6.xml | 61 + src/CLI/clitree/cli-xml/lldp.xml | 54 + src/CLI/clitree/cli-xml/platform.xml | 50 + src/CLI/clitree/cli-xml/sonic_types.xml | 465 +++ src/CLI/clitree/cli-xml/startup.xml | 27 + src/CLI/clitree/cli-xml/system.xml | 54 + src/CLI/clitree/macro/acl_macro.xml | 304 ++ src/CLI/clitree/scripts/klish_ins_def_cmd.py | 187 + src/CLI/clitree/scripts/klish_insert_pipe.py | 197 + .../klish_platform_features_process.sh | 122 + .../clitree/scripts/klish_preproc_cmdtree.py | 58 + .../clitree/scripts/klish_replace_macro.py | 408 ++ src/CLI/clitree/scripts/platform_dummy.xml | 40 + src/CLI/clitree/scripts/sonic-clish.xsd | 249 ++ src/CLI/klish/Makefile | 27 + src/CLI/klish/clish_start | 11 + src/CLI/klish/klish-2.1.4.tgz | Bin 0 -> 2479271 bytes .../clish/shell/shell_libxml2.c.diff | 102 + src/CLI/klish/patches/scripts/patchmake.sh | 190 + src/CLI/renderer/Makefile | 6 + src/CLI/renderer/scripts/__init__.py | 0 src/CLI/renderer/scripts/acl_jinja2.py | 63 + src/CLI/renderer/scripts/render_cli.py | 133 + src/CLI/renderer/scripts/rpipe_utils.py | 382 ++ src/CLI/renderer/templates/acl_show.j2 | 4 + .../renderer/templates/lldp_neighbor_show.j2 | 29 + src/CLI/renderer/templates/lldp_show.j2 | 18 + src/CLI/renderer/templates/platform_show.j2 | 7 + .../renderer/templates/show_access_group.j2 | 40 + .../renderer/templates/show_access_list.j2 | 74 + src/CLI/renderer/templates/show_interface.j2 | 125 + .../templates/show_interface_counters.j2 | 39 + .../renderer/templates/show_interface_id.j2 | 121 + .../templates/show_interface_status.j2 | 36 + src/CLI/renderer/templates/system_cpu_show.j2 | 12 + .../templates/system_processes_show.j2 | 9 + src/CLI/renderer/templates/system_show.j2 | 7 + src/cvl/Makefile | 79 + src/cvl/README.md | 62 + src/cvl/conf/cvl_cfg.json | 20 + src/cvl/cvl.go | 1864 +++++++++ src/cvl/cvl_api.go | 514 +++ src/cvl/cvl_luascript.go | 65 + src/cvl/cvl_test.go | 3491 +++++++++++++++++ src/cvl/internal/util/util.go | 255 ++ src/cvl/internal/yparser/yparser.go | 699 ++++ src/cvl/jsondata_test.go | 70 + src/cvl/schema/Makefile | 66 + src/cvl/testdata/acl_rule.json | 10 + src/cvl/testdata/aclrule.json | 9 + src/cvl/testdata/acltable.json | 4 + src/cvl/testdata/config_db.json | 107 + src/cvl/testdata/config_db1.json | 133 + src/cvl/testdata/config_db2.json | 3437 ++++++++++++++++ src/cvl/testdata/create_acl_table.json | 8 + src/cvl/testdata/create_acl_table12.json | 8 + src/cvl/testdata/create_acl_table13.json | 8 + src/cvl/testdata/port_table.json | 165 + src/cvl/testdata/schema/Makefile | 53 + .../testdata/schema/sonic-acl-deviation.yang | 43 + .../testdata/schema/sonic-bgp-neighbor.yang | 84 + src/cvl/testdata/schema/sonic-buffer-pg.yang | 66 + .../testdata/schema/sonic-buffer-pool.yang | 51 + .../testdata/schema/sonic-buffer-profile.yang | 67 + .../testdata/schema/sonic-cablelength.yang | 60 + .../schema/sonic-device-metadata.yang | 97 + .../schema/sonic-device-neighbor.yang | 72 + .../testdata/schema/sonic-dscp-tc-map.yang | 58 + .../testdata/schema/sonic-mirror-session.yang | 60 + src/cvl/testdata/schema/sonic-pf-limits.yang | 44 + .../schema/sonic-pfc-priority-queue-map.yang | 55 + .../testdata/schema/sonic-port-qos-map.yang | 87 + .../schema/sonic-portchannel-interface.yang | 48 + .../testdata/schema/sonic-portchannel.yang | 77 + src/cvl/testdata/schema/sonic-queue.yang | 74 + src/cvl/testdata/schema/sonic-scheduler.yang | 52 + .../schema/sonic-tc-priority-group-map.yang | 54 + .../testdata/schema/sonic-tc-queue-map.yang | 55 + .../testdata/schema/sonic-vlan-deviation.yang | 36 + .../testdata/schema/sonic-vlan-interface.yang | 48 + src/cvl/testdata/schema/sonic-vlan.yang | 107 + .../testdata/schema/sonic-wred-profile.yang | 80 + src/cvl/tests/Makefile | 37 + src/cvl/tests/acl_rule.json | 22 + src/cvl/tests/cfg_validator.go | 273 ++ src/cvl/tests/config_db.json | 107 + src/cvl/tests/config_db1.json | 313 ++ src/cvl/tests/config_db2.json | 3437 ++++++++++++++++ src/cvl/tests/create_acl_table.json | 8 + src/cvl/tests/cv_acl.go | 443 +++ src/cvl/tests/cv_edit_op.go | 192 + src/cvl/tests/cv_vlan.go | 448 +++ src/cvl/tests/run_test.sh | 31 + src/rest/Makefile | 84 + src/rest/main/main.go | 206 + src/rest/main/main_test.go | 38 + src/rest/server/context.go | 190 + src/rest/server/context_test.go | 228 ++ src/rest/server/error.go | 202 + src/rest/server/error_test.go | 229 ++ src/rest/server/handler.go | 258 ++ src/rest/server/handler_test.go | 524 +++ src/rest/server/pamAuth.go | 165 + src/rest/server/pamAuth_test.go | 195 + src/rest/server/req_validate.go | 94 + src/rest/server/router.go | 140 + src/translib/Makefile | 60 + src/translib/acl_app.go | 1712 ++++++++ src/translib/acl_app_test.go | 572 +++ src/translib/app_interface.go | 170 + src/translib/app_utils.go | 231 ++ src/translib/common_app.go | 485 +++ src/translib/db/db.go | 1375 +++++++ src/translib/db/db_test.go | 610 +++ src/translib/db/map.go | 123 + src/translib/db/subscribe.go | 275 ++ src/translib/db/test/arloIssue29.go | 85 + src/translib/db/test/testdb.go | 163 + src/translib/db/test/testmap.go | 102 + src/translib/db/test/testsubscribe.go | 88 + src/translib/intf_app.go | 1291 ++++++ src/translib/lldp_app.go | 456 +++ src/translib/nonyang_app.go.demo | 412 ++ src/translib/ocbinds/oc.go | 22 + src/translib/path_utils.go | 191 + src/translib/path_utils_test.go | 164 + src/translib/pfm_app.go | 431 ++ src/translib/request_binder.go | 266 ++ src/translib/request_binder_test.go | 514 +++ src/translib/subscribe.go | 340 ++ src/translib/sys_app.go | 491 +++ .../test/acl/01_create_MyACL1_MyACL2.json | 343 ++ .../test/acl/02_create_MyACL3_5Rules.json | 147 + .../acl/03_create_MyACL1_5_more_rules.json | 134 + .../acl/04_create_MyACL1_1Rule_content.json | 25 + .../test/acl/05_Create_MyACL3_binding.json | 28 + .../test/acl/08_update_AclSets_MyACL3.json | 149 + ..._after_delete_1Rule_get_MyACL4_command.txt | 2 + ...fter_delete_1Rule_get_MyACL4_response.json | 1 + .../test/acl/09_create_MyACL4_4Rules.json | 123 + .../acl/09_create_MyACL4_4Rules_command.txt | 1 + .../acl/09_delete_1Rule_MyACL4_command.txt | 1 + .../test/acl/09_get_1Rule_MyACL4_command.txt | 2 + .../acl/09_get_all_MyACL4_4Rules_command.txt | 1 + .../09_get_all_MyACL4_4Rules_response.json | 1 + .../test/interfaces/01_get_all_command.txt | 2 + .../test/interfaces/01_get_all_response.json | 1 + .../interfaces/02_get_interface_command.txt | 2 + .../interfaces/02_get_interface_response.json | 1 + .../03_get_interface_config_command.txt | 2 + .../03_get_interface_config_response.json | 1 + .../04_get_interface_state_command.txt | 2 + .../04_get_interface_state_response.json | 1 + .../test/interfaces/05_set_interface_mtu.json | 1 + .../05_set_interface_mtu_command.txt | 1 + .../interfaces/06_set_interface_ipv4.json | 1 + .../06_set_interface_ipv4_command.txt | 1 + .../interfaces/07_set_interface_ipv6.json | 1 + .../07_set_interface_ipv6_command.txt | 1 + .../08_delete_interface_ipv4_command.txt | 1 + .../09_delete_interface_ipv6_command.txt | 1 + .../test/lldp/01-get-all-intf-command.txt | 1 + .../test/lldp/01-get-all-intf-response.json | 1 + .../test/lldp/02-get-one-intf-command.txt | 1 + .../test/lldp/02-get-one-intf-response.json | 1 + .../test/platform/01_get_all_components.txt | 1 + .../test/platform/01_get_all_response.json | 1 + .../test/platform/02_get_one_component.txt | 1 + .../02_get_one_component_response.json | 1 + .../03_get_component_attribute_command.txt | 1 + .../03_get_component_attribute_response.json | 1 + .../test/system/01_get_all_components.txt | 1 + .../01_get_all_components_response.json | 1 + .../system/02_get_system_state_command.txt | 1 + .../system/02_get_system_state_response.json | 1 + .../system/03_get_system_memory_command.txt | 1 + .../system/03_get_system_memory_response.json | 1 + .../system/04_get_system_cpus_command.txt | 1 + .../system/04_get_system_cpus_response.json | 1 + .../05_get_system_processes_command.txt | 1 + .../05_get_system_processes_response.json | 1 + .../06_get_system_processes_pid_command.txt | 1 + .../06_get_system_processes_pid_response.json | 1 + ...system_processes_pid_attribute_command.txt | 1 + ...stem_processes_pid_attribute_response.json | 1 + src/translib/test/translibtest.go | 142 + src/translib/tlerr/app_errors.go | 92 + src/translib/tlerr/tlerr.go | 103 + src/translib/transformer/transformer.go | 161 + src/translib/transformer/xconst.go | 51 + src/translib/transformer/xfmr_acl.go | 976 +++++ src/translib/transformer/xfmr_interface.go | 135 + src/translib/transformer/xfmr_path_utils.go | 99 + src/translib/transformer/xlate.go | 407 ++ src/translib/transformer/xlate_from_db.go | 766 ++++ src/translib/transformer/xlate_to_db.go | 565 +++ src/translib/transformer/xlate_utils.go | 591 +++ src/translib/transformer/xspec.go | 598 +++ src/translib/translib.go | 745 ++++ src/translib/translib_test.go | 59 + tools/.gitkeep | 0 tools/pyang/pyang_plugins/openapi.py | 832 ++++ tools/pyang/pyang_plugins/yin_cvl.py | 179 + tools/swagger_codegen/.gitignore | 1 + .../go-server/src/swagger/routes.go | 24 + .../templates-nonyang/README.mustache | 30 + .../templates-nonyang/controller-api.mustache | 24 + .../templates-nonyang/logger.mustache | 24 + .../go-server/templates-nonyang/main.mustache | 33 + .../templates-nonyang/model.mustache | 32 + .../templates-nonyang/partial_header.mustache | 17 + .../templates-nonyang/routers.mustache | 17 + .../templates-nonyang/swagger.mustache | 1 + .../templates-yang/controller-api.mustache | 21 + .../go-server/templates-yang/routers.mustache | 17 + .../swagger_codegen/ui-dist/favicon-16x16.png | Bin 0 -> 665 bytes .../swagger_codegen/ui-dist/favicon-32x32.png | Bin 0 -> 628 bytes .../ui-dist/index.html_notused | 60 + .../ui-dist/oauth2-redirect.html | 67 + .../ui-dist/swagger-ui-bundle.js | 93 + .../ui-dist/swagger-ui-bundle.js.map | 1 + .../ui-dist/swagger-ui-standalone-preset.js | 14 + .../swagger-ui-standalone-preset.js.map | 1 + tools/swagger_codegen/ui-dist/swagger-ui.css | 3 + .../ui-dist/swagger-ui.css.map | 1 + tools/swagger_codegen/ui-dist/swagger-ui.js | 9 + .../swagger_codegen/ui-dist/swagger-ui.js.map | 1 + tools/test/rest-server.sh | 71 + tools/ui_gen/src/uigen.py | 31 + tools/ui_gen/templates/landing_html.template | 49 + .../templates/swagger_index_html.template | 62 + ygot-modified-files/ygot.patch | 752 ++++ 315 files changed, 65396 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 config/transformer/models_list create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100755 debian/rules create mode 100644 goyang-modified-files/goyang.patch create mode 100644 models/.gitkeep create mode 100644 models/Makefile create mode 100644 models/openapi/vlan.yaml.demo create mode 100644 models/yang/.gitignore create mode 100644 models/yang/Makefile create mode 100644 models/yang/annotations/openconfig-acl-annot.yang create mode 100644 models/yang/annotations/sonic-extensions.yang create mode 100644 models/yang/common/iana-if-type.yang create mode 100644 models/yang/common/ietf-inet-types.yang create mode 100644 models/yang/common/ietf-interfaces.yang create mode 100644 models/yang/common/ietf-yang-types.yang create mode 100644 models/yang/common/openconfig-aaa-radius.yang create mode 100644 models/yang/common/openconfig-aaa-tacacs.yang create mode 100644 models/yang/common/openconfig-aaa-types.yang create mode 100644 models/yang/common/openconfig-aaa.yang create mode 100644 models/yang/common/openconfig-alarm-types.yang create mode 100644 models/yang/common/openconfig-alarms.yang create mode 100644 models/yang/common/openconfig-extensions.yang create mode 100644 models/yang/common/openconfig-if-aggregate.yang create mode 100644 models/yang/common/openconfig-if-ethernet-ext.yang create mode 100644 models/yang/common/openconfig-if-ip-ext.yang create mode 100644 models/yang/common/openconfig-if-poe.yang create mode 100644 models/yang/common/openconfig-if-tunnel.yang create mode 100644 models/yang/common/openconfig-if-types.yang create mode 100644 models/yang/common/openconfig-inet-types.yang create mode 100644 models/yang/common/openconfig-lldp-types.yang create mode 100644 models/yang/common/openconfig-messages.yang create mode 100644 models/yang/common/openconfig-packet-match-types.yang create mode 100644 models/yang/common/openconfig-packet-match.yang create mode 100644 models/yang/common/openconfig-platform-types.yang create mode 100644 models/yang/common/openconfig-procmon.yang create mode 100644 models/yang/common/openconfig-system-logging.yang create mode 100644 models/yang/common/openconfig-system-management.yang create mode 100644 models/yang/common/openconfig-system-terminal.yang create mode 100644 models/yang/common/openconfig-types.yang create mode 100644 models/yang/common/openconfig-vlan-types.yang create mode 100644 models/yang/common/openconfig-vlan.yang create mode 100644 models/yang/common/openconfig-yang-types.yang create mode 100644 models/yang/openconfig-acl.yang create mode 100644 models/yang/openconfig-if-ethernet.yang create mode 100644 models/yang/openconfig-if-ip.yang create mode 100644 models/yang/openconfig-interfaces.yang create mode 100644 models/yang/openconfig-lldp.yang create mode 100644 models/yang/openconfig-platform.yang create mode 100644 models/yang/openconfig-system.yang create mode 100644 models/yang/sonic/Makefile create mode 100644 models/yang/sonic/common/sonic-common.yang create mode 100644 models/yang/sonic/common/sonic-extension.yang create mode 100644 models/yang/sonic/sonic-acl.yang create mode 100644 models/yang/sonic/sonic-interface.yang create mode 100644 models/yang/sonic/sonic-port.yang create mode 100644 patches/jsonquery.patch create mode 100644 src/.gitkeep create mode 100644 src/CLI/.gitkeep create mode 100644 src/CLI/Makefile create mode 100755 src/CLI/actioner/sonic-cli-acl.py create mode 100755 src/CLI/actioner/sonic-cli-if.py create mode 100644 src/CLI/actioner/sonic-cli-lldp.py create mode 100644 src/CLI/actioner/sonic-cli-pfm.py create mode 100644 src/CLI/actioner/sonic-cli-sys.py create mode 100644 src/CLI/clicfg/mgmt_clish_entities.xsl create mode 100644 src/CLI/clicfg/mgmt_clish_entities_macro.xsl create mode 100644 src/CLI/clicfg/mgmt_clish_feature_master.xsd create mode 100644 src/CLI/clicfg/mgmt_clish_features.xsl create mode 100644 src/CLI/clicfg/mgmt_clish_platform.xml create mode 100644 src/CLI/clitree/Makefile create mode 100644 src/CLI/clitree/cli-xml/acl.xml create mode 100644 src/CLI/clitree/cli-xml/configure_mode.xml create mode 100644 src/CLI/clitree/cli-xml/enable_mode.xml create mode 100644 src/CLI/clitree/cli-xml/include/pipe.xml create mode 100644 src/CLI/clitree/cli-xml/include/pipe_without_display_xml.xml create mode 100644 src/CLI/clitree/cli-xml/interface.xml create mode 100644 src/CLI/clitree/cli-xml/ip.xml create mode 100644 src/CLI/clitree/cli-xml/ipv4.xml create mode 100644 src/CLI/clitree/cli-xml/ipv6.xml create mode 100644 src/CLI/clitree/cli-xml/lldp.xml create mode 100644 src/CLI/clitree/cli-xml/platform.xml create mode 100644 src/CLI/clitree/cli-xml/sonic_types.xml create mode 100644 src/CLI/clitree/cli-xml/startup.xml create mode 100644 src/CLI/clitree/cli-xml/system.xml create mode 100644 src/CLI/clitree/macro/acl_macro.xml create mode 100755 src/CLI/clitree/scripts/klish_ins_def_cmd.py create mode 100755 src/CLI/clitree/scripts/klish_insert_pipe.py create mode 100755 src/CLI/clitree/scripts/klish_platform_features_process.sh create mode 100755 src/CLI/clitree/scripts/klish_preproc_cmdtree.py create mode 100755 src/CLI/clitree/scripts/klish_replace_macro.py create mode 100644 src/CLI/clitree/scripts/platform_dummy.xml create mode 100644 src/CLI/clitree/scripts/sonic-clish.xsd create mode 100644 src/CLI/klish/Makefile create mode 100755 src/CLI/klish/clish_start create mode 100644 src/CLI/klish/klish-2.1.4.tgz create mode 100644 src/CLI/klish/patches/klish-2.1.4/clish/shell/shell_libxml2.c.diff create mode 100755 src/CLI/klish/patches/scripts/patchmake.sh create mode 100644 src/CLI/renderer/Makefile create mode 100644 src/CLI/renderer/scripts/__init__.py create mode 100755 src/CLI/renderer/scripts/acl_jinja2.py create mode 100755 src/CLI/renderer/scripts/render_cli.py create mode 100644 src/CLI/renderer/scripts/rpipe_utils.py create mode 100644 src/CLI/renderer/templates/acl_show.j2 create mode 100755 src/CLI/renderer/templates/lldp_neighbor_show.j2 create mode 100644 src/CLI/renderer/templates/lldp_show.j2 create mode 100644 src/CLI/renderer/templates/platform_show.j2 create mode 100644 src/CLI/renderer/templates/show_access_group.j2 create mode 100644 src/CLI/renderer/templates/show_access_list.j2 create mode 100644 src/CLI/renderer/templates/show_interface.j2 create mode 100644 src/CLI/renderer/templates/show_interface_counters.j2 create mode 100644 src/CLI/renderer/templates/show_interface_id.j2 create mode 100644 src/CLI/renderer/templates/show_interface_status.j2 create mode 100644 src/CLI/renderer/templates/system_cpu_show.j2 create mode 100755 src/CLI/renderer/templates/system_processes_show.j2 create mode 100755 src/CLI/renderer/templates/system_show.j2 create mode 100644 src/cvl/Makefile create mode 100644 src/cvl/README.md create mode 100644 src/cvl/conf/cvl_cfg.json create mode 100644 src/cvl/cvl.go create mode 100644 src/cvl/cvl_api.go create mode 100644 src/cvl/cvl_luascript.go create mode 100644 src/cvl/cvl_test.go create mode 100644 src/cvl/internal/util/util.go create mode 100644 src/cvl/internal/yparser/yparser.go create mode 100644 src/cvl/jsondata_test.go create mode 100644 src/cvl/schema/Makefile create mode 100644 src/cvl/testdata/acl_rule.json create mode 100644 src/cvl/testdata/aclrule.json create mode 100644 src/cvl/testdata/acltable.json create mode 100644 src/cvl/testdata/config_db.json create mode 100644 src/cvl/testdata/config_db1.json create mode 100644 src/cvl/testdata/config_db2.json create mode 100644 src/cvl/testdata/create_acl_table.json create mode 100644 src/cvl/testdata/create_acl_table12.json create mode 100644 src/cvl/testdata/create_acl_table13.json create mode 100644 src/cvl/testdata/port_table.json create mode 100644 src/cvl/testdata/schema/Makefile create mode 100644 src/cvl/testdata/schema/sonic-acl-deviation.yang create mode 100644 src/cvl/testdata/schema/sonic-bgp-neighbor.yang create mode 100644 src/cvl/testdata/schema/sonic-buffer-pg.yang create mode 100644 src/cvl/testdata/schema/sonic-buffer-pool.yang create mode 100644 src/cvl/testdata/schema/sonic-buffer-profile.yang create mode 100644 src/cvl/testdata/schema/sonic-cablelength.yang create mode 100644 src/cvl/testdata/schema/sonic-device-metadata.yang create mode 100644 src/cvl/testdata/schema/sonic-device-neighbor.yang create mode 100644 src/cvl/testdata/schema/sonic-dscp-tc-map.yang create mode 100644 src/cvl/testdata/schema/sonic-mirror-session.yang create mode 100644 src/cvl/testdata/schema/sonic-pf-limits.yang create mode 100644 src/cvl/testdata/schema/sonic-pfc-priority-queue-map.yang create mode 100644 src/cvl/testdata/schema/sonic-port-qos-map.yang create mode 100644 src/cvl/testdata/schema/sonic-portchannel-interface.yang create mode 100644 src/cvl/testdata/schema/sonic-portchannel.yang create mode 100644 src/cvl/testdata/schema/sonic-queue.yang create mode 100644 src/cvl/testdata/schema/sonic-scheduler.yang create mode 100644 src/cvl/testdata/schema/sonic-tc-priority-group-map.yang create mode 100644 src/cvl/testdata/schema/sonic-tc-queue-map.yang create mode 100644 src/cvl/testdata/schema/sonic-vlan-deviation.yang create mode 100644 src/cvl/testdata/schema/sonic-vlan-interface.yang create mode 100644 src/cvl/testdata/schema/sonic-vlan.yang create mode 100644 src/cvl/testdata/schema/sonic-wred-profile.yang create mode 100644 src/cvl/tests/Makefile create mode 100644 src/cvl/tests/acl_rule.json create mode 100644 src/cvl/tests/cfg_validator.go create mode 100644 src/cvl/tests/config_db.json create mode 100644 src/cvl/tests/config_db1.json create mode 100644 src/cvl/tests/config_db2.json create mode 100644 src/cvl/tests/create_acl_table.json create mode 100644 src/cvl/tests/cv_acl.go create mode 100644 src/cvl/tests/cv_edit_op.go create mode 100644 src/cvl/tests/cv_vlan.go create mode 100755 src/cvl/tests/run_test.sh create mode 100644 src/rest/Makefile create mode 100644 src/rest/main/main.go create mode 100644 src/rest/main/main_test.go create mode 100644 src/rest/server/context.go create mode 100644 src/rest/server/context_test.go create mode 100644 src/rest/server/error.go create mode 100644 src/rest/server/error_test.go create mode 100644 src/rest/server/handler.go create mode 100644 src/rest/server/handler_test.go create mode 100644 src/rest/server/pamAuth.go create mode 100644 src/rest/server/pamAuth_test.go create mode 100644 src/rest/server/req_validate.go create mode 100644 src/rest/server/router.go create mode 100644 src/translib/Makefile create mode 100644 src/translib/acl_app.go create mode 100644 src/translib/acl_app_test.go create mode 100644 src/translib/app_interface.go create mode 100644 src/translib/app_utils.go create mode 100644 src/translib/common_app.go create mode 100644 src/translib/db/db.go create mode 100644 src/translib/db/db_test.go create mode 100644 src/translib/db/map.go create mode 100644 src/translib/db/subscribe.go create mode 100644 src/translib/db/test/arloIssue29.go create mode 100644 src/translib/db/test/testdb.go create mode 100644 src/translib/db/test/testmap.go create mode 100644 src/translib/db/test/testsubscribe.go create mode 100644 src/translib/intf_app.go create mode 100644 src/translib/lldp_app.go create mode 100644 src/translib/nonyang_app.go.demo create mode 100644 src/translib/ocbinds/oc.go create mode 100644 src/translib/path_utils.go create mode 100644 src/translib/path_utils_test.go create mode 100644 src/translib/pfm_app.go create mode 100644 src/translib/request_binder.go create mode 100644 src/translib/request_binder_test.go create mode 100644 src/translib/subscribe.go create mode 100644 src/translib/sys_app.go create mode 100644 src/translib/test/acl/01_create_MyACL1_MyACL2.json create mode 100644 src/translib/test/acl/02_create_MyACL3_5Rules.json create mode 100644 src/translib/test/acl/03_create_MyACL1_5_more_rules.json create mode 100644 src/translib/test/acl/04_create_MyACL1_1Rule_content.json create mode 100644 src/translib/test/acl/05_Create_MyACL3_binding.json create mode 100644 src/translib/test/acl/08_update_AclSets_MyACL3.json create mode 100644 src/translib/test/acl/09_after_delete_1Rule_get_MyACL4_command.txt create mode 100644 src/translib/test/acl/09_after_delete_1Rule_get_MyACL4_response.json create mode 100644 src/translib/test/acl/09_create_MyACL4_4Rules.json create mode 100644 src/translib/test/acl/09_create_MyACL4_4Rules_command.txt create mode 100644 src/translib/test/acl/09_delete_1Rule_MyACL4_command.txt create mode 100644 src/translib/test/acl/09_get_1Rule_MyACL4_command.txt create mode 100644 src/translib/test/acl/09_get_all_MyACL4_4Rules_command.txt create mode 100644 src/translib/test/acl/09_get_all_MyACL4_4Rules_response.json create mode 100644 src/translib/test/interfaces/01_get_all_command.txt create mode 100644 src/translib/test/interfaces/01_get_all_response.json create mode 100644 src/translib/test/interfaces/02_get_interface_command.txt create mode 100644 src/translib/test/interfaces/02_get_interface_response.json create mode 100644 src/translib/test/interfaces/03_get_interface_config_command.txt create mode 100644 src/translib/test/interfaces/03_get_interface_config_response.json create mode 100644 src/translib/test/interfaces/04_get_interface_state_command.txt create mode 100644 src/translib/test/interfaces/04_get_interface_state_response.json create mode 100644 src/translib/test/interfaces/05_set_interface_mtu.json create mode 100644 src/translib/test/interfaces/05_set_interface_mtu_command.txt create mode 100644 src/translib/test/interfaces/06_set_interface_ipv4.json create mode 100644 src/translib/test/interfaces/06_set_interface_ipv4_command.txt create mode 100644 src/translib/test/interfaces/07_set_interface_ipv6.json create mode 100644 src/translib/test/interfaces/07_set_interface_ipv6_command.txt create mode 100644 src/translib/test/interfaces/08_delete_interface_ipv4_command.txt create mode 100644 src/translib/test/interfaces/09_delete_interface_ipv6_command.txt create mode 100644 src/translib/test/lldp/01-get-all-intf-command.txt create mode 100644 src/translib/test/lldp/01-get-all-intf-response.json create mode 100644 src/translib/test/lldp/02-get-one-intf-command.txt create mode 100644 src/translib/test/lldp/02-get-one-intf-response.json create mode 100644 src/translib/test/platform/01_get_all_components.txt create mode 100644 src/translib/test/platform/01_get_all_response.json create mode 100644 src/translib/test/platform/02_get_one_component.txt create mode 100644 src/translib/test/platform/02_get_one_component_response.json create mode 100644 src/translib/test/platform/03_get_component_attribute_command.txt create mode 100644 src/translib/test/platform/03_get_component_attribute_response.json create mode 100644 src/translib/test/system/01_get_all_components.txt create mode 100644 src/translib/test/system/01_get_all_components_response.json create mode 100644 src/translib/test/system/02_get_system_state_command.txt create mode 100644 src/translib/test/system/02_get_system_state_response.json create mode 100644 src/translib/test/system/03_get_system_memory_command.txt create mode 100644 src/translib/test/system/03_get_system_memory_response.json create mode 100644 src/translib/test/system/04_get_system_cpus_command.txt create mode 100644 src/translib/test/system/04_get_system_cpus_response.json create mode 100644 src/translib/test/system/05_get_system_processes_command.txt create mode 100644 src/translib/test/system/05_get_system_processes_response.json create mode 100644 src/translib/test/system/06_get_system_processes_pid_command.txt create mode 100644 src/translib/test/system/06_get_system_processes_pid_response.json create mode 100644 src/translib/test/system/07_get_system_processes_pid_attribute_command.txt create mode 100644 src/translib/test/system/07_get_system_processes_pid_attribute_response.json create mode 100644 src/translib/test/translibtest.go create mode 100644 src/translib/tlerr/app_errors.go create mode 100644 src/translib/tlerr/tlerr.go create mode 100644 src/translib/transformer/transformer.go create mode 100644 src/translib/transformer/xconst.go create mode 100644 src/translib/transformer/xfmr_acl.go create mode 100644 src/translib/transformer/xfmr_interface.go create mode 100644 src/translib/transformer/xfmr_path_utils.go create mode 100644 src/translib/transformer/xlate.go create mode 100644 src/translib/transformer/xlate_from_db.go create mode 100644 src/translib/transformer/xlate_to_db.go create mode 100644 src/translib/transformer/xlate_utils.go create mode 100644 src/translib/transformer/xspec.go create mode 100644 src/translib/translib.go create mode 100644 src/translib/translib_test.go create mode 100644 tools/.gitkeep create mode 100644 tools/pyang/pyang_plugins/openapi.py create mode 100644 tools/pyang/pyang_plugins/yin_cvl.py create mode 100644 tools/swagger_codegen/.gitignore create mode 100644 tools/swagger_codegen/go-server/src/swagger/routes.go create mode 100644 tools/swagger_codegen/go-server/templates-nonyang/README.mustache create mode 100644 tools/swagger_codegen/go-server/templates-nonyang/controller-api.mustache create mode 100644 tools/swagger_codegen/go-server/templates-nonyang/logger.mustache create mode 100644 tools/swagger_codegen/go-server/templates-nonyang/main.mustache create mode 100644 tools/swagger_codegen/go-server/templates-nonyang/model.mustache create mode 100644 tools/swagger_codegen/go-server/templates-nonyang/partial_header.mustache create mode 100644 tools/swagger_codegen/go-server/templates-nonyang/routers.mustache create mode 100644 tools/swagger_codegen/go-server/templates-nonyang/swagger.mustache create mode 100644 tools/swagger_codegen/go-server/templates-yang/controller-api.mustache create mode 100644 tools/swagger_codegen/go-server/templates-yang/routers.mustache create mode 100644 tools/swagger_codegen/ui-dist/favicon-16x16.png create mode 100644 tools/swagger_codegen/ui-dist/favicon-32x32.png create mode 100644 tools/swagger_codegen/ui-dist/index.html_notused create mode 100644 tools/swagger_codegen/ui-dist/oauth2-redirect.html create mode 100644 tools/swagger_codegen/ui-dist/swagger-ui-bundle.js create mode 100644 tools/swagger_codegen/ui-dist/swagger-ui-bundle.js.map create mode 100644 tools/swagger_codegen/ui-dist/swagger-ui-standalone-preset.js create mode 100644 tools/swagger_codegen/ui-dist/swagger-ui-standalone-preset.js.map create mode 100644 tools/swagger_codegen/ui-dist/swagger-ui.css create mode 100644 tools/swagger_codegen/ui-dist/swagger-ui.css.map create mode 100644 tools/swagger_codegen/ui-dist/swagger-ui.js create mode 100644 tools/swagger_codegen/ui-dist/swagger-ui.js.map create mode 100755 tools/test/rest-server.sh create mode 100755 tools/ui_gen/src/uigen.py create mode 100644 tools/ui_gen/templates/landing_html.template create mode 100644 tools/ui_gen/templates/swagger_index_html.template create mode 100644 ygot-modified-files/ygot.patch diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..900036b7c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ + +.vscode +*.code-workspace +pkg/* +build +gopkgs +__pycache__ +*.pyc +*.rdb +*.swp + +*.yin +*.tree +src/translib/ocbinds/ocbinds.go + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..77f2412f3b --- /dev/null +++ b/Makefile @@ -0,0 +1,166 @@ +################################################################################ +# # +# Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or # +# its subsidiaries. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# # +################################################################################ + +.PHONY: all clean cleanall codegen rest-server rest-clean yamlGen cli + +TOPDIR := $(abspath .) +BUILD_DIR := $(TOPDIR)/build +export TOPDIR + +ifeq ($(BUILD_GOPATH),) +export BUILD_GOPATH=$(TOPDIR)/gopkgs +endif + +export GOPATH=$(BUILD_GOPATH):$(TOPDIR) + +ifeq ($(GO),) +GO := /usr/local/go/bin/go +export GO +endif + +INSTALL := /usr/bin/install + +MAIN_TARGET = sonic-mgmt-framework_1.0-01_amd64.deb + +GO_DEPS_LIST = github.com/gorilla/mux \ + github.com/Workiva/go-datastructures/queue \ + github.com/openconfig/goyang \ + github.com/openconfig/ygot/ygot \ + github.com/go-redis/redis \ + github.com/golang/glog \ + github.com/pkg/profile \ + gopkg.in/go-playground/validator.v9 \ + golang.org/x/crypto/ssh \ + github.com/antchfx/jsonquery \ + github.com/antchfx/xmlquery \ + github.com/facette/natsort \ + github.com/philopon/go-toposort + + +REST_BIN = $(BUILD_DIR)/rest_server/main +CERTGEN_BIN = $(BUILD_DIR)/rest_server/generate_cert + + +all: build-deps go-deps go-pkg-version go-patch translib rest-server cli + +build-deps: + mkdir -p $(BUILD_DIR) + +go-deps: $(GO_DEPS_LIST) + +go-pkg-version: go-deps + cd $(BUILD_GOPATH)/src/github.com/go-redis/redis; git checkout d19aba07b47683ef19378c4a4d43959672b7cec8 2>/dev/null ; true; \ +$(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/go-redis/redis; \ +cd $(BUILD_GOPATH)/src/github.com/gorilla/mux; git checkout 49c01487a141b49f8ffe06277f3dca3ee80a55fa 2>/dev/null ; true; \ +$(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/gorilla/mux; \ +cd $(BUILD_GOPATH)/src/github.com/Workiva/go-datastructures; git checkout f07cbe3f82ca2fd6e5ab94afce65fe43319f675f 2>/dev/null ; true; \ +$(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/Workiva/go-datastructures; \ +cd $(BUILD_GOPATH)/src/github.com/golang/glog; git checkout 23def4e6c14b4da8ac2ed8007337bc5eb5007998 2>/dev/null ; true; \ +$(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/golang/glog; \ +cd $(BUILD_GOPATH)/src/github.com/pkg/profile; git checkout acd64d450fd45fb2afa41f833f3788c8a7797219 2>/dev/null ; true; \ +$(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/pkg/profile; \ +cd $(BUILD_GOPATH)/src/github.com/antchfx/xmlquery; git checkout 16f1e6cdc5fe44a7f8e2a8c9faf659a1b3a8fd9b 2>/dev/null ; true; \ +$(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/antchfx/xmlquery; \ +cd $(BUILD_GOPATH)/src/github.com/facette/natsort; git checkout 2cd4dd1e2dcba4d85d6d3ead4adf4cfd2b70caf2 2>/dev/null ; true; \ +$(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/facette/natsort; \ +cd $(BUILD_GOPATH)/src/github.com/philopon/go-toposort; git checkout 9be86dbd762f98b5b9a4eca110a3f40ef31d0375 2>/dev/null ; true; \ +$(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/philopon/go-toposort + +$(GO_DEPS_LIST): + $(GO) get -v $@ + +cli: rest-server + $(MAKE) -C src/CLI + +cvl: go-deps go-patch go-pkg-version + $(MAKE) -C src/cvl + $(MAKE) -C src/cvl/schema + $(MAKE) -C src/cvl/testdata/schema + +cvl-test: + $(MAKE) -C src/cvl gotest + +rest-server: translib + $(MAKE) -C src/rest + +rest-clean: + $(MAKE) -C src/rest clean + +translib: cvl + $(MAKE) -C src/translib + +codegen: + $(MAKE) -C models + +yamlGen: + $(MAKE) -C models/yang + $(MAKE) -C models/yang/sonic + +go-patch: go-deps + cd $(BUILD_GOPATH)/src/github.com/openconfig/ygot/; git reset --hard HEAD; git clean -f -d; git checkout 724a6b18a9224343ef04fe49199dfb6020ce132a 2>/dev/null ; true; \ +cd ../; cp $(TOPDIR)/ygot-modified-files/ygot.patch .; \ +patch -p1 < ygot.patch; rm -f ygot.patch; \ +$(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/openconfig/ygot/ygot; \ + cd $(BUILD_GOPATH)/src/github.com/openconfig/goyang/; git reset --hard HEAD; git clean -f -d; git checkout 064f9690516f4f72db189f4690b84622c13b7296 >/dev/null ; true; \ + cp $(TOPDIR)/goyang-modified-files/goyang.patch .; \ + patch -p1 < goyang.patch; rm -f goyang.patch; \ + $(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/openconfig/goyang; \ + cd $(BUILD_GOPATH)/src/github.com/antchfx/jsonquery; git reset --hard HEAD; \ + git checkout 3535127d6ca5885dbf650204eb08eabf8374a274 2>/dev/null ; \ + git apply $(TOPDIR)/patches/jsonquery.patch; \ + $(GO) install -v -gcflags "-N -l" $(BUILD_GOPATH)/src/github.com/antchfx/jsonquery + +install: + $(INSTALL) -D $(REST_BIN) $(DESTDIR)/usr/sbin/rest_server + $(INSTALL) -D $(CERTGEN_BIN) $(DESTDIR)/usr/sbin/generate_cert + $(INSTALL) -d $(DESTDIR)/usr/sbin/schema/ + $(INSTALL) -d $(DESTDIR)/usr/sbin/lib/ + $(INSTALL) -d $(DESTDIR)/usr/models/yang/ + $(INSTALL) -D $(TOPDIR)/models/yang/sonic/*.yang $(DESTDIR)/usr/models/yang/ + $(INSTALL) -D $(TOPDIR)/models/yang/sonic/common/*.yang $(DESTDIR)/usr/models/yang/ + $(INSTALL) -D $(TOPDIR)/src/cvl/schema/*.yin $(DESTDIR)/usr/sbin/schema/ + $(INSTALL) -D $(TOPDIR)/src/cvl/testdata/schema/*.yin $(DESTDIR)/usr/sbin/schema/ + $(INSTALL) -D $(TOPDIR)/models/yang/*.yang $(DESTDIR)/usr/models/yang/ + $(INSTALL) -D $(TOPDIR)/config/transformer/models_list $(DESTDIR)/usr/models/yang/ + $(INSTALL) -D $(TOPDIR)/models/yang/common/*.yang $(DESTDIR)/usr/models/yang/ + $(INSTALL) -D $(TOPDIR)/models/yang/annotations/*.yang $(DESTDIR)/usr/models/yang/ + cp -rf $(TOPDIR)/build/rest_server/dist/ui/ $(DESTDIR)/rest_ui/ + cp -rf $(TOPDIR)/build/cli $(DESTDIR)/usr/sbin/ + cp -rf $(TOPDIR)/build/swagger_client_py/ $(DESTDIR)/usr/sbin/lib/ + cp -rf $(TOPDIR)/src/cvl/conf/cvl_cfg.json $(DESTDIR)/usr/sbin/cvl_cfg.json + +ifeq ($(SONIC_COVERAGE_ON),y) + echo "" > $(DESTDIR)/usr/sbin/.test +endif + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + mv $* $(DEST)/ + +clean: rest-clean + $(MAKE) -C src/cvl clean + $(MAKE) -C src/translib clean + $(MAKE) -C src/cvl/schema clean + $(MAKE) -C src/cvl cleanall + rm -rf build/* + rm -rf debian/.debhelper + rm -rf $(BUILD_GOPATH)/src/github.com/openconfig/goyang/annotate.go + +cleanall: + $(MAKE) -C src/cvl cleanall + rm -rf build/* diff --git a/README.md b/README.md new file mode 100644 index 0000000000..b33661e3d8 --- /dev/null +++ b/README.md @@ -0,0 +1,90 @@ +## SONiC Management Framework Repo + +### Build Instruction +Please note that the build instruction in this guide has only been tested on Ubuntu 16.04. +#### Pre-rerequisit +##### User permissions: + `sudo usermod -aG sudo $USER` + `sudo usermod -aG docker $USER` + +##### Packages to be installed: + `sudo apt-get install git docker` + +#### Steps to build and create an installer +1. git clone https://github.com/project-arlo/sonic-buildimage.git +2. cd sonic-buildimage/ +3. sudo modprobe overlay +4. make init +5. make configure PLATFORM=broadcom +6. Run the prefetch python script to download all binaries (see below for the script). +7. To build mgmt-framework container: + `BLDENV=stretch make target/docker-sonic-mgmt-framework.gz` +8. To build Debian Stretch, if not already downloaded: + `BLDENV=stretch make stretch` +9. To build the ONIE installer: + `BLDENV=stretch make target/sonic-broadcom.bin` + +#### Faster builds +In order to speed up the process of build, you can prefetch the latest debian files from Azure server, and just build what you need. + +Here is a python script you could use to fetch latest prebuilt objects (deb, gz, ko, etc) from SONiC Jenkins cluster: + + import os + import shutil + import urllib.request + from html.parser import HTMLParser + + UPSTREAM_PREFIX = 'https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/lastSuccessfulBuild/artifact/' + + def get_all_bins(target_path, extension): + """Get all files matching the given extension from the target path""" + print('Fetching %s*%s' % (target_path, extension)) + os.makedirs(target_path, exist_ok=True) + + req = urllib.request.urlopen(UPSTREAM_PREFIX + target_path) + data = req.read().decode() + + class Downloader(HTMLParser): + """Class to parse retrieved data, match against the given extension, + and download the matching files to the given target directory""" + def handle_starttag(self, tag, attrs): + """Handle only tags""" + if tag == 'a': + for attr, val in attrs: + if attr == 'href' and val.endswith(extension): + self.download_file(val) + + @staticmethod + def download_file(path): + filename = os.path.join(target_path, path) + freq = urllib.request.urlopen(UPSTREAM_PREFIX + target_path + path) + + print('\t%s' % path) + with open(filename, 'wb') as fp: + shutil.copyfileobj(freq, fp) + + + parser = Downloader() + parser.feed(data) + print() + + get_all_bins('target/debs/stretch/', '.deb') + get_all_bins('target/files/stretch/', '.ko') + get_all_bins('target/python-debs/', '.deb') + get_all_bins('target/python-wheels/', '.whl') + get_all_bins('target/', '.gz') + + + +##### Incremental builds +Just clean up the deb's/gz that require re-build, and build again. Here is an exmple: + +##### To build deb file for sonic-mgmt-framework + + BLDENV=stretch make target/debs/stretch/sonic-mgmt-framework_1.0-01_amd64.deb-clean + BLDENV=stretch make target/debs/stretch/sonic-mgmt-framework_1.0-01_amd64.deb + +##### To build sonic-mgmt-framework docker alone + + BLDENV=stretch make target/docker-sonic-mgmt-framework.gz-clean + BLDENV=stretch make target/docker-sonic-mgmt-framework.gz diff --git a/config/transformer/models_list b/config/transformer/models_list new file mode 100644 index 0000000000..c9f26c1638 --- /dev/null +++ b/config/transformer/models_list @@ -0,0 +1,3 @@ +#List yang models transformer need to load +openconfig-acl.yang +openconfig-acl-annot.yang diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000000..91d0815d54 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5 @@ +sonic-mgmt-framework (1.0-01) UNRELEASED; urgency=low + + * Initial release. + + -- Prabhu Sreenivasan Tue, 18 Jun 2019 00:25:19 +0000 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000000..ec635144f6 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000000..8c53c29642 --- /dev/null +++ b/debian/control @@ -0,0 +1,19 @@ +Source: sonic-mgmt-framework +Maintainer: Prabhu Sreenivasan +Build-Depends: debhelper (>= 8.0.0), + dh-systemd +Standards-Version: 3.9.3 +Section: net + +Package: sonic-mgmt-framework +Priority: extra +Architecture: amd64 +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: SONiC Management Framework + +Package: sonic-mgmt-framework-dbg +Priority: extra +Architecture: amd64 +Section: debug +Depends: sonic-mgmt-framework (=${binary:Version}) +Description: debugging symbols for SONiC Management Framework diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000000..c08b68a370 --- /dev/null +++ b/debian/rules @@ -0,0 +1,7 @@ +#!/usr/bin/make -f +%: + dh $@ --with systemd + + +override_dh_shlibdeps: + dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info -l$(shell pwd)/build/cli/target/.libs/:$(shell pwd)/build/cli/.libs/ diff --git a/goyang-modified-files/goyang.patch b/goyang-modified-files/goyang.patch new file mode 100644 index 0000000000..3bb6420449 --- /dev/null +++ b/goyang-modified-files/goyang.patch @@ -0,0 +1,530 @@ +diff --git a/README.md b/README.md +index 4d22c1e..805adb5 100644 +--- a/README.md ++++ b/README.md +@@ -14,6 +14,7 @@ The forms include: + + * tree - a simple tree representation + * types - list understood types extracted from the schema ++* annotate - a template file to annotate the yang modules + + The yang package, and the goyang program, are not complete and are a work in + progress. +diff --git a/annotate.go b/annotate.go +new file mode 100644 +index 0000000..243c416 +--- /dev/null ++++ b/annotate.go +@@ -0,0 +1,395 @@ ++// Copyright 2015 Google Inc. ++// ++// Licensed under the Apache License, Version 2.0 (the "License"); ++// you may not use this file except in compliance with the License. ++// You may obtain a copy of the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, ++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++// See the License for the specific language governing permissions and ++// limitations under the License. ++ ++package main ++ ++import ( ++ "fmt" ++ "io" ++ "strings" ++ ++ "github.com/openconfig/goyang/pkg/yang" ++) ++ ++var allimports = make(map[string]string) ++var modules = make(map[string]*yang.Module) ++var allmodules = make(map[string]*yang.Module) ++ ++func init() { ++ register(&formatter{ ++ name: "annotate", ++ f: genAnnotate, ++ utilf: getFile, ++ help: "generate template file for yang annotations", ++ }) ++} ++ ++// Get the modules for which annotation file needs to be generated ++func getFile(files []string, mods map[string]*yang.Module) { ++ allmodules = mods ++ for _, name := range files { ++ slash := strings.Split(name, "/") ++ modname := slash[len(slash)-1] ++ modname = strings.TrimSuffix(modname, ".yang"); ++ /* Save the yang.Module entries we are interested in */ ++ modules[modname] = mods[modname] ++ } ++} ++ ++func genAnnotate(w io.Writer, entries []*yang.Entry) { ++ /* Get all the imported modules in the entries */ ++ GetAllImports(entries) ++ for _, e := range entries { ++ if _, ok := modules[e.Name]; ok { ++ var path string = "" ++ var prefix string = "" ++ generate(w, e, path, prefix) ++ // { Add closing brace for each module ++ fmt.Fprintln(w, "}") ++ fmt.Fprintln(w) ++ } ++ } ++} ++ ++// generate writes to stdoutput a template annotation file entry for the selected modules. ++func generate(w io.Writer, e *yang.Entry, path string, prefix string) { ++ if e.Parent == nil { ++ if e.Name != "" { ++ fmt.Fprintf(w, "module %s-annot {\n", e.Name) //} ++ fmt.Fprintln(w) ++ fmt.Fprintf(w, " yang-version \"%s\";\n", getYangVersion(e.Name, modules)) ++ fmt.Fprintln(w) ++ fmt.Fprintf(w, " namespace \"http://openconfig.net/yang/annotation/%s-annot\";\n", e.Prefix.Name) ++ if e.Prefix != nil { ++ fmt.Fprintf(w, " prefix \"%s-annot\";\n", e.Prefix.Name) ++ } ++ fmt.Fprintln(w) ++ ++ var imports = make(map[string]string) ++ imports = getImportModules(e.Name, modules) ++ for k := range imports { ++ if e.Name != k { ++ fmt.Fprintf(w, " import %s { prefix %s; }\n", k, allimports[k]) ++ } ++ } ++ // Include the module for which annotation is being generated ++ fmt.Fprintf(w, " import %s { prefix %s; }\n", e.Name, e.Prefix.Name) ++ ++ fmt.Fprintln(w) ++ } ++ } ++ ++ name := e.Name ++ if prefix == "" && e.Prefix != nil { ++ prefix = e.Prefix.Name ++ } ++ name = prefix + ":" + name ++ ++ if (e.Node.Kind() != "module") { ++ path = path + "/" + name ++ printDeviation(w, path) ++ } ++ ++ var names []string ++ for k := range e.Dir { ++ names = append(names, k) ++ } ++ ++ if (e.Node.Kind() == "module") { ++ if len(e.Node.(*yang.Module).Augment) > 0 { ++ for _,a := range e.Node.(*yang.Module).Augment { ++ pathList := strings.Split(a.Name, "/") ++ pathList = pathList[1:] ++ for i, pvar := range pathList { ++ if len(pvar) > 0 && !strings.Contains(pvar, ":") { ++ pvar = e.Prefix.Name + ":" + pvar ++ pathList[i] = pvar ++ } ++ } ++ path = "/" + strings.Join(pathList, "/") ++ handleAugments(w, a, e.Node.(*yang.Module).Grouping, e.Prefix.Name, path) ++ } ++ } ++ } ++ ++ for _, k := range names { ++ generate(w, e.Dir[k], path, prefix) ++ } ++ ++} ++ ++func printDeviation(w io.Writer, path string){ ++ fmt.Fprintf(w, " deviation %s {\n", path) ++ fmt.Fprintf(w, " deviate add {\n") ++ fmt.Fprintf(w, " }\n") ++ fmt.Fprintf(w, " }\n") ++ fmt.Fprintln(w) ++} ++ ++ ++// Save to map all imported modules ++func GetAllImports(entries []*yang.Entry) { ++ for _, e := range entries { ++ allimports[e.Name] = e.Prefix.Name ++ } ++} ++ ++func GetModuleFromPrefix(prefix string) string { ++ for m, p := range allimports { ++ if prefix == p { ++ return m ++ } ++ } ++ return "" ++} ++ ++//Get Yang version from the yang.Modules ++func getYangVersion(modname string, mods map[string]*yang.Module) string { ++ if (mods[modname].YangVersion != nil) { ++ return mods[modname].YangVersion.Name ++ } ++ return "" ++ ++} ++ ++// Get imported modules for a given module from yang.Module ++func getImportModules(modname string, mods map[string]*yang.Module) map[string]string { ++ imports := map[string]string{} ++ if (mods[modname].Import != nil) { ++ for _, imp := range mods[modname].Import { ++ imports[imp.Name] = imp.Prefix.Name ++ } ++ } ++ return imports ++} ++ ++func handleAugments(w io.Writer, a *yang.Augment, grp []*yang.Grouping, prefix string, path string) { ++ for _, u := range a.Uses { ++ grpN := u.Name ++ for _, g := range grp { ++ if grpN == g.Name { ++ if len(g.Container) > 0 { ++ handleContainer(w, g.Container, grp, prefix, path) ++ } ++ if len(g.List) > 0 { ++ handleList(w, g.List, grp, prefix, path) ++ } ++ if len(g.LeafList) > 0 { ++ handleLeafList(w, g.LeafList, prefix, path) ++ } ++ if len(g.Leaf) > 0 { ++ handleLeaf(w, g.Leaf, prefix, path) ++ } ++ if len(g.Choice) > 0 { ++ handleChoice(w, g.Choice, grp, prefix, path) ++ } ++ if len(g.Uses) > 0 { ++ handleUses(w, g.Uses, grp, prefix, path) ++ } ++ } ++ } ++ } ++ ++} ++ ++func handleUses(w io.Writer, u []*yang.Uses, grp []*yang.Grouping, prefix string, path string) { ++ for _, u := range u { ++ grpN := u.Name ++ if strings.Contains(grpN, ":") { ++ tokens := strings.Split(grpN, ":") ++ nprefix := tokens[0] ++ grpN = tokens[1] ++ mod := GetModuleFromPrefix(nprefix) ++ grp = allmodules[mod].Grouping ++ } ++ for _, g := range grp { ++ if grpN == g.Name { ++ if len(g.Container) > 0 { ++ handleContainer(w, g.Container, grp, prefix, path) ++ } ++ if len(g.List) > 0 { ++ handleList(w, g.List, grp, prefix, path) ++ } ++ if len(g.LeafList) > 0 { ++ handleLeafList(w, g.LeafList, prefix, path) ++ } ++ if len(g.Leaf) > 0 { ++ handleLeaf(w, g.Leaf, prefix, path) ++ } ++ if len(g.Choice) > 0 { ++ handleChoice(w, g.Choice, grp, prefix, path) ++ } ++ if len(g.Uses) > 0 { ++ handleUses(w, g.Uses, grp, prefix, path) ++ } ++ ++ } ++ } ++ } ++ ++} ++ ++func handleContainer(w io.Writer, ctr []*yang.Container, grp []*yang.Grouping, prefix string, path string) { ++ for _, c := range ctr { ++ npath := path + "/" + prefix + ":" + c.Name ++ printDeviation(w, npath) ++ if len(c.Container) > 0 { ++ handleContainer(w, c.Container, grp, prefix, npath) ++ } ++ if len(c.List) > 0 { ++ handleList(w, c.List, grp, prefix, npath) ++ } ++ if len(c.LeafList) > 0 { ++ handleLeafList(w, c.LeafList, prefix, npath) ++ } ++ if len(c.Leaf) > 0 { ++ handleLeaf(w, c.Leaf, prefix, npath) ++ } ++ if len(c.Choice) > 0 { ++ handleChoice(w, c.Choice, grp, prefix, npath) ++ } ++ if len(c.Grouping) > 0 { ++ handleGrouping(w, c.Grouping, grp, prefix, npath) ++ } ++ if len(c.Uses) > 0 { ++ handleUses(w, c.Uses, grp, prefix, npath) ++ } ++ } ++} ++ ++func handleList(w io.Writer, lst []*yang.List, grp []*yang.Grouping, prefix string, path string) { ++ for _, l := range lst { ++ npath := path + "/" + prefix + ":" + l.Name ++ printDeviation(w, npath) ++ if len(l.Container) > 0 { ++ handleContainer(w, l.Container, grp, prefix, npath) ++ } ++ if len(l.List) > 0 { ++ handleList(w, l.List, grp, prefix, npath) ++ } ++ if len(l.LeafList) > 0 { ++ handleLeafList(w, l.LeafList, prefix, npath) ++ } ++ if len(l.Leaf) > 0 { ++ handleLeaf(w, l.Leaf, prefix, npath) ++ } ++ if len(l.Choice) > 0 { ++ handleChoice(w, l.Choice, grp, prefix, npath) ++ } ++ if len(l.Grouping) > 0 { ++ handleGrouping(w, l.Grouping, grp, prefix, npath) ++ } ++ if len(l.Uses) > 0 { ++ handleUses(w, l.Uses, grp, prefix, npath) ++ } ++ ++ } ++} ++ ++func handleGrouping(w io.Writer, grp []*yang.Grouping, grptop []*yang.Grouping, prefix string, path string) { ++ for _, g := range grp { ++ npath := path + "/" + prefix + ":" + g.Name ++ printDeviation(w, npath) ++ if len(g.Container) > 0 { ++ handleContainer(w, g.Container, grptop, prefix, npath) ++ } ++ if len(g.List) > 0 { ++ handleList(w, g.List, grptop, prefix, npath) ++ } ++ if len(g.LeafList) > 0 { ++ handleLeafList(w, g.LeafList, prefix, npath) ++ } ++ if len(g.Leaf) > 0 { ++ handleLeaf(w, g.Leaf, prefix, npath) ++ } ++ if len(g.Choice) > 0 { ++ handleChoice(w, g.Choice, grptop, prefix, npath) ++ } ++ if len(g.Grouping) > 0 { ++ handleGrouping(w, g.Grouping, grptop, prefix, npath) ++ } ++ if len(g.Uses) > 0 { ++ handleUses(w, g.Uses, grptop, prefix, npath) ++ } ++ ++ } ++} ++ ++func handleLeaf (w io.Writer, lf []*yang.Leaf, prefix string, path string) { ++ if len(lf) > 0 { ++ for _, l := range lf { ++ npath := path + "/" + prefix + ":" + l.Name ++ printDeviation(w, npath) ++ } ++ } ++ ++} ++ ++func handleLeafList (w io.Writer, llst []*yang.LeafList, prefix string, path string) { ++ if len(llst) > 0 { ++ for _, l := range llst { ++ npath := path + "/" + prefix + ":" + l.Name ++ printDeviation(w, npath) ++ } ++ } ++} ++ ++func handleChoice (w io.Writer, ch []*yang.Choice, grp []*yang.Grouping, prefix string, path string) { ++ for _, c := range ch { ++ npath := path + "/" + prefix + ":" + c.Name ++ printDeviation(w, npath) ++ if len(c.Container) > 0 { ++ handleContainer(w, c.Container, grp, prefix, npath) ++ } ++ if len(c.List) > 0 { ++ handleList(w, c.List, grp, prefix, npath) ++ } ++ if len(c.LeafList) > 0 { ++ handleLeafList(w, c.LeafList, prefix, npath) ++ } ++ if len(c.Leaf) > 0 { ++ handleLeaf(w, c.Leaf, prefix, npath) ++ } ++ if len(c.Case) > 0 { ++ handleCase(w, c.Case, grp, prefix, npath) ++ } ++ } ++} ++ ++func handleCase (w io.Writer, ch []*yang.Case, grp []*yang.Grouping, prefix string, path string) { ++ for _, c := range ch { ++ npath := path + "/" + prefix + ":" + c.Name ++ printDeviation(w, npath) ++ if len(c.Container) > 0 { ++ handleContainer(w, c.Container, grp, prefix, npath) ++ } ++ if len(c.List) > 0 { ++ handleList(w, c.List, grp, prefix, npath) ++ } ++ if len(c.LeafList) > 0 { ++ handleLeafList(w, c.LeafList, prefix, npath) ++ } ++ if len(c.Leaf) > 0 { ++ handleLeaf(w, c.Leaf, prefix, npath) ++ } ++ if len(c.Choice) > 0 { ++ handleChoice(w, c.Choice, grp, prefix, npath) ++ } ++ if len(c.Uses) > 0 { ++ handleUses(w, c.Uses, grp, prefix, npath) ++ } ++ ++ } ++} ++ +diff --git a/pkg/yang/entry.go b/pkg/yang/entry.go +index ef658d6..f626dc9 100644 +--- a/pkg/yang/entry.go ++++ b/pkg/yang/entry.go +@@ -80,6 +80,7 @@ type Entry struct { + + // Fields associated with directory nodes + Dir map[string]*Entry `json:",omitempty"` ++ DirOKeys []string // Ordered Keys list in Dir + Key string `json:",omitempty"` // Optional key name for lists (i.e., maps) + + // Fields associated with leaf nodes +@@ -115,6 +116,10 @@ type Entry struct { + // the augmenting entity per RFC6020 Section 7.15.2. The namespace + // of the Entry should be accessed using the Namespace function. + namespace *Value ++ ++ ChildSchemaCache map[reflect.StructTag]*Entry `json:"-"` ++ ++ IsSchemaValidated bool `json:"-"` + } + + // An RPCEntry contains information related to an RPC Node. +@@ -264,6 +269,7 @@ func newDirectory(n Node) *Entry { + return &Entry{ + Kind: DirectoryEntry, + Dir: make(map[string]*Entry), ++ DirOKeys: make([]string, 0), + Node: n, + Name: n.NName(), + Extra: map[string][]interface{}{}, +@@ -366,6 +372,7 @@ func (e *Entry) add(key string, value *Entry) *Entry { + return e + } + e.Dir[key] = value ++ e.DirOKeys = append(e.DirOKeys, key) + return e + } + +@@ -1090,6 +1097,7 @@ func (e *Entry) FixChoice() { + } + ce.Parent = ne + e.Dir[k] = ne ++ e.DirOKeys = append(e.DirOKeys, k) + } + } + } +@@ -1260,6 +1268,14 @@ func (e *Entry) shallowDup() *Entry { + // copied we will have to explicitly uncopy them. + ne := *e + ++ //Copy the ordered Dir keys to new entry ++ if len(e.DirOKeys) > 0 { ++ ne.DirOKeys = make([]string, 0) ++ for _, key := range e.DirOKeys { ++ ne.DirOKeys = append(ne.DirOKeys, key) ++ } ++ } ++ + // Now only copy direct children, clear their Dir, and fix up + // Parent pointers. + if e.Dir != nil { +@@ -1283,6 +1299,14 @@ func (e *Entry) dup() *Entry { + // to do that. + ne := *e + ++ //Copy the ordered Dir keys to new entry ++ if len(e.DirOKeys) > 0 { ++ ne.DirOKeys = make([]string, 0) ++ for _, key := range e.DirOKeys { ++ ne.DirOKeys = append(ne.DirOKeys, key) ++ } ++ } ++ + // Now recurse down to all of our children, fixing up Parent + // pointers as we go. + if e.Dir != nil { +@@ -1317,6 +1341,7 @@ func (e *Entry) merge(prefix *Value, namespace *Value, oe *Entry) { + } else { + v.Parent = e + e.Dir[k] = v ++ e.DirOKeys = append(e.DirOKeys, k) + } + } + } +@@ -1378,8 +1403,8 @@ func (s sortedErrors) Less(i, j int) bool { + } + return nless(fi[x], fj[x]) + } +- for x := 1; x < 4; x++ { +- switch compare(1) { ++ for x := 0; x < len(fi) && x < len(fj); x++ { ++ switch compare(x) { + case -1: + return true + case 1: +diff --git a/yang.go b/yang.go +index 2480a4e..515d1b3 100644 +--- a/yang.go ++++ b/yang.go +@@ -58,6 +58,7 @@ import ( + type formatter struct { + name string + f func(io.Writer, []*yang.Entry) ++ utilf func([]string, map[string]*yang.Module) + help string + flags *getopt.Set + } +@@ -208,5 +209,8 @@ Formats: + entries[x] = yang.ToEntry(mods[n]) + } + ++ if format == "annotate" { ++ formatters[format].utilf(files, mods) ++ } + formatters[format].f(os.Stdout, entries) + } diff --git a/models/.gitkeep b/models/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/models/Makefile b/models/Makefile new file mode 100644 index 0000000000..8f542e905d --- /dev/null +++ b/models/Makefile @@ -0,0 +1,164 @@ +################################################################################ +# # +# Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or # +# its subsidiaries. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# # +################################################################################ + +TOPDIR := .. +ABS_TOPDIR := $(abspath $(TOPDIR)) + +BUILD_DIR := $(TOPDIR)/build +CODEGEN_TOOLS_DIR := $(TOPDIR)/tools/swagger_codegen + +CODEGEN_VER := 2.4.5 +CODEGEN_JAR := $(CODEGEN_TOOLS_DIR)/swagger-codegen-cli-$(CODEGEN_VER).jar + +SERVER_BUILD_DIR := $(BUILD_DIR)/rest_server +SERVER_CODEGEN_DIR := $(SERVER_BUILD_DIR)/codegen +SERVER_DIST_DIR := $(SERVER_BUILD_DIR)/dist +SERVER_DIST_INIT := $(SERVER_DIST_DIR)/.init_done +SERVER_DIST_GO := $(SERVER_DIST_DIR)/src/swagger +SERVER_DIST_UI := $(SERVER_DIST_DIR)/ui +SERVER_DIST_UI_HOME := $(SERVER_DIST_DIR)/ui/index.html + +YANGAPI_DIR := $(TOPDIR)/build/yaml +YANGAPI_SPECS := $(shell find $(YANGAPI_DIR) -name '*.yaml' | sort) +YANGAPI_NAMES := $(basename $(notdir $(YANGAPI_SPECS))) +YANGAPI_SERVERS := $(addsuffix /.yangapi_done, $(addprefix $(SERVER_CODEGEN_DIR)/, $(YANGAPI_NAMES))) + +OPENAPI_DIR := openapi +OPENAPI_SPECS := $(shell find $(OPENAPI_DIR) -name '*.yaml' | sort) +OPENAPI_NAMES := $(basename $(notdir $(OPENAPI_SPECS))) +OPENAPI_SERVERS := $(addsuffix /.openapi_done, $(addprefix $(SERVER_CODEGEN_DIR)/, $(OPENAPI_NAMES))) + +PY_CLIENT_CODEGEN_DIR := $(BUILD_DIR)/swagger_client_py +PY_CLIENT_TARGETS := $(addsuffix .yangapi_client, $(addprefix $(PY_CLIENT_CODEGEN_DIR)/, $(YANGAPI_NAMES))) \ + $(addsuffix .openapi_client, $(addprefix $(PY_CLIENT_CODEGEN_DIR)/, $(OPENAPI_NAMES))) + +UIGEN_DIR = $(TOPDIR)/tools/ui_gen +UIGEN_SRCS = $(shell find $(UIGEN_DIR) -type f) + + +.PHONY: all clean cleanall go-server py-client + +all: go-server py-client + +go-server: $(YANGAPI_SERVERS) $(OPENAPI_SERVERS) $(SERVER_DIST_INIT) $(SERVER_DIST_UI_HOME) + +$(SERVER_DIST_UI_HOME): $(YANGAPI_SERVERS) $(OPENAPI_SERVERS) $(UIGEN_SRCS) + @echo "+++ Generating landing page for Swagger UI +++" + $(UIGEN_DIR)/src/uigen.py + +py-client: $(PY_CLIENT_TARGETS) + + +.SECONDEXPANSION: + +#====================================================================== +# Common rule for directories. Use "." suffix, like "xyz/." +#====================================================================== +.PRECIOUS: %/. +%/.: + mkdir -p $@ + +#====================================================================== +# Download swagger codegen jar from Maven.org repo. It will be saved as +# build/swagger-codegen-cli.jar file. +#====================================================================== +$(CODEGEN_JAR): | $$(@D)/. + cd $(@D) && \ + wget http://central.maven.org/maven2/io/swagger/swagger-codegen-cli/$(CODEGEN_VER)/$(@F) + +#====================================================================== +# Generate swagger server in GO language for Yang generated OpenAPIs +# specs. +#====================================================================== +%/.yangapi_done: $(YANGAPI_DIR)/$$(*F).yaml | $$(@D)/. $(CODEGEN_JAR) $(SERVER_DIST_INIT) + @echo "+++ Generating GO server for Yang API $$(basename $(@D)).yaml +++" + java -jar $(CODEGEN_JAR) generate \ + --lang go-server \ + --input-spec $(YANGAPI_DIR)/$$(basename $(@D)).yaml \ + --template-dir $(CODEGEN_TOOLS_DIR)/go-server/templates-yang \ + --output $(@D) + cp $(@D)/go/api_* $(SERVER_DIST_GO)/ + cp $(@D)/go/routers.go $(SERVER_DIST_GO)/routers_$$(basename $(@D)).go + cp $(@D)/api/swagger.yaml $(SERVER_DIST_UI)/$$(basename $(@D)).yaml + touch $@ + +#====================================================================== +# Generate swagger server in GO language for handcoded OpenAPI specs +#====================================================================== +%/.openapi_done: $(OPENAPI_DIR)/$$(*F).yaml | $$(@D)/. $(CODEGEN_JAR) $(SERVER_DIST_INIT) + @echo "+++ Generating GO server for OpenAPI $$(basename $(@D)).yaml +++" + java -jar $(CODEGEN_JAR) generate \ + --lang go-server \ + --input-spec $(OPENAPI_DIR)/$$(basename $(@D)).yaml \ + --template-dir $(CODEGEN_TOOLS_DIR)/go-server/templates-nonyang \ + --output $(@D) + cp $(@D)/go/api_* $(@D)/go/model_* $(SERVER_DIST_GO)/ + cp $(@D)/go/routers.go $(SERVER_DIST_GO)/routers_$$(basename $(@D)).go + cp $(@D)/api/swagger.yaml $(SERVER_DIST_UI)/$$(basename $(@D)).yaml + touch $@ + +#====================================================================== +# Initialize dist directory for GO server code +#====================================================================== +$(SERVER_DIST_INIT): | $$(@D)/. + cp -r $(CODEGEN_TOOLS_DIR)/ui-dist $(@D)/ui + cp -r $(CODEGEN_TOOLS_DIR)/go-server/src $(@D)/ + touch $@ + +#====================================================================== +# Generate swagger client in Python for yang generated OpenAPI specs +#====================================================================== +%.yangapi_client: $(YANGAPI_DIR)/$$(*F).yaml | $(CODEGEN_JAR) $$(@D)/. + @echo "+++++ Generating Python client for $(*F).yaml +++++" + java -jar $(CODEGEN_JAR) generate \ + -DpackageName=$(subst -,_,$(*F))_client \ + --lang python \ + --input-spec $(YANGAPI_DIR)/$(*F).yaml \ + --output $(@D) + touch $@ + +#====================================================================== +# Generate swagger client in Python for handcoded OpenAPI specs +#====================================================================== +%.openapi_client: $(OPENAPI_DIR)/$$(*F).yaml | $(CODEGEN_JAR) $$(@D)/. + @echo "+++++ Generating Python client for $(*F).yaml +++++" + java -jar $(CODEGEN_JAR) generate \ + -DpackageName=$(subst -,_,$(*F))_client \ + --lang python \ + --input-spec $(OPENAPI_DIR)/$(*F).yaml \ + --output $(@D) + touch $@ + +#====================================================================== +# Cleanups +#====================================================================== + +clean-server: + rm -rf $(SERVER_DIST_DIR) + rm -rf $(SERVER_CODEGEN_DIR) + +clean-client: + rm -rf $(PY_CLIENT_CODEGEN_DIR) + +clean: clean-server clean-client + make -C yang clean + +cleanall: clean + rm -f $(CODEGEN_JAR) + diff --git a/models/openapi/vlan.yaml.demo b/models/openapi/vlan.yaml.demo new file mode 100644 index 0000000000..8304bc3280 --- /dev/null +++ b/models/openapi/vlan.yaml.demo @@ -0,0 +1,186 @@ +swagger: "2.0" +info: + description: "Sample OpenAPI spec for SONiC VLAN table operations." + version: "1.0.0" + title: "SONiC Management Infra PoC - VLANs" + termsOfService: "" + contact: + email: "noone@broadcom.com" + license: + name: "Apache 2.0" + url: "http://www.apache.org/licenses/LICENSE-2.0.html" +basePath: "/nonyang" +tags: +- name: "vlan" + description: "Vlan configuration APIs" +schemes: +- "https" +- "http" +paths: + /vlan: + post: + tags: + - "vlan" + summary: "Create vlans" + description: "Create vlans by id" + operationId: "createVlans" + consumes: + - "application/json" + parameters: + - in: "body" + name: "body" + description: "Vlans to be configured" + required: true + schema: + type: "array" + items: + type: "integer" + responses: + 201: + description: "Vlans created" + 500: + description: "Vlan creation failed" + get: + tags: + - "vlan" + summary: "Get all vlan" + description: "Returns all vlans" + operationId: "getVlans" + produces: + - "application/json" + responses: + 200: + description: "successful operation" + schema: + type: "array" + items: + $ref: "#/definitions/VlanInfo" + 500: + description: "Internal error" + + /vlan/{id}: + get: + tags: + - "vlan" + summary: "Finds vlan by id" + description: "Returns vlan by id" + operationId: "getVlanById" + produces: + - "application/json" + parameters: + - name: "id" + in: "path" + description: "Vlan id" + required: true + type: "integer" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/VlanInfo" + 404: + description: "Vlan not found" + delete: + tags: + - "vlan" + summary: "Delete vlan by id" + description: "Delete vlan by id" + operationId: "deleteVlanById" + parameters: + - name: "id" + in: "path" + description: "Vlan id" + required: true + type: "integer" + responses: + 204: + description: "Vlan deleted" + 404: + description: "Vlan not found" + + /vlan/{id}/member: + post: + tags: + - "vlan" + summary: "Add member interfaces" + description: "Add member interfaces" + operationId: "addVlanMembers" + consumes: + - "application/json" + parameters: + - name: "id" + in: "path" + description: "Vlan id" + required: true + type: "integer" + - name: "body" + in: "body" + description: "Member info" + required: true + schema: + type: "array" + items: + $ref: "#/definitions/VlanMember" + responses: + 201: + description: "Members added" + 404: + description: "Vlan not found" + + /vlan/{id}/member/{port}: + delete: + tags: + - "vlan" + summary: "Remove member interfaces" + description: "Remove member interfaces" + operationId: "removeVlanMembers" + parameters: + - name: "id" + in: "path" + description: "Vlan id" + required: true + type: "integer" + - name: "port" + in: "path" + description: "Member port name" + required: true + type: "string" + responses: + 204: + description: "Vlan member deleted" + 404: + description: "Vlan or vlan member config not found" + +definitions: + VlanInfo: + type: "object" + required: [id] + properties: + id: + description: "Vlan id" + type: "integer" + format: "int32" + name: + description: "Vlan name" + type: "string" + format: "string" + members: + description: "Vlan member port details" + type: "array" + items: + $ref: "#/definitions/VlanMember" + + VlanMember: + type: "object" + required: [port] + properties: + port: + description: "Member port name" + type: "string" + format: "string" + mode: + description: "Tagging mode" + type: "string" + enum: + - "tagged" + - "untagged" diff --git a/models/yang/.gitignore b/models/yang/.gitignore new file mode 100644 index 0000000000..d77ad18a85 --- /dev/null +++ b/models/yang/.gitignore @@ -0,0 +1,2 @@ +allyangs_tree.html +allyangs.tree diff --git a/models/yang/Makefile b/models/yang/Makefile new file mode 100644 index 0000000000..0a5b27e230 --- /dev/null +++ b/models/yang/Makefile @@ -0,0 +1,79 @@ +################################################################################ +# # +# Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or # +# its subsidiaries. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# # +################################################################################ + +TOPDIR := ../.. +BUILD_DIR := $(TOPDIR)/build + +YANGAPI_DIR := $(TOPDIR)/build/yaml +YANGDIR := $(TOPDIR)/models/yang +YANGDIR_COMMON := $(TOPDIR)/models/yang/common +YANGDIR_ANNOTATIONS := $(TOPDIR)/models/yang/annotations/openapi_annotations +YANG_MOD_FILES := $(shell find $(YANGDIR) -maxdepth 1 -name '*.yang' | sort) +YANG_ANNOTATIONS_FILES := $(shell find $(YANGDIR_ANNOTATIONS) -maxdepth 1 -name '*.yang' | sort) +YANG_COMMON_FILES := $(shell find $(YANGDIR_COMMON) -name '*.yang' | sort) + +TOOLS_DIR := $(TOPDIR)/tools +PYANG_DIR := $(TOOLS_DIR)/pyang +PYANG_PLUGIN_DIR := $(PYANG_DIR)/pyang_plugins +PYANG_BIN := pyang + +.PHONY: all yamlGen + +all: yamlGen allyangs.tree allyangs_tree.html + +yamlGen: $(YANGAPI_DIR)/.done + +allyangs.tree: $(YANG_MOD_FILES) $(YANG_COMMON_FILES) + $(PYANG_BIN) \ + -f tree \ + -o $(YANGDIR)/$@ \ + -p $(YANGDIR_COMMON):$(YANGDIR) \ + $(YANG_MOD_FILES) $(YANG_ANNOTATIONS_FILES) + @echo "+++++ Generation of YANG tree for Yang modules completed +++++" + +allyangs_tree.html: $(YANG_MOD_FILES) $(YANG_COMMON_FILES) + $(PYANG_BIN) \ + -f jstree \ + -o $(YANGDIR)/$@ \ + -p $(YANGDIR_COMMON):$(YANGDIR) \ + $(YANG_MOD_FILES) $(YANG_ANNOTATIONS_FILES) + @echo "+++++ Generation of HTML tree for Yang modules completed +++++" + +#====================================================================== +# Generate YAML files for Yang modules +#====================================================================== +$(YANGAPI_DIR)/.done: $(YANG_MOD_FILES) $(YANG_COMMON_FILES) + @echo "+++++ Generating YAML files for Yang modules +++++" + mkdir -p $(YANGAPI_DIR) + $(PYANG_BIN) \ + -f swaggerapi \ + --outdir $(YANGAPI_DIR) \ + --plugindir $(PYANG_PLUGIN_DIR) \ + -p $(YANGDIR_COMMON):$(YANGDIR) \ + $(YANG_MOD_FILES) $(YANG_ANNOTATIONS_FILES) + @echo "+++++ Generation of YAML files for Yang modules completed +++++" + touch $@ + +#====================================================================== +# Cleanups +#====================================================================== + +clean: + rm -rf $(YANGAPI_DIR) + rm -rf allyangs.tree allyangs_tree.html diff --git a/models/yang/annotations/openconfig-acl-annot.yang b/models/yang/annotations/openconfig-acl-annot.yang new file mode 100644 index 0000000000..8129fe0895 --- /dev/null +++ b/models/yang/annotations/openconfig-acl-annot.yang @@ -0,0 +1,197 @@ +module openconfig-acl-annot { + + yang-version "1"; + + namespace "http://openconfig.net/yang/annotation"; + prefix "oc-acl-annot"; + + import sonic-extensions { prefix sonic-ext; } + import openconfig-acl { prefix oc-acl; } + import openconfig-packet-match { prefix oc-pkt-match; } + + deviation /oc-acl:acl { + deviate add { + sonic-ext:post-transformer "acl_post_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set { + deviate add { + sonic-ext:table-name "ACL_TABLE"; + sonic-ext:key-transformer "acl_set_key_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:config/oc-acl:name { + deviate add { + sonic-ext:field-transformer "acl_set_name_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:config/oc-acl:type { + deviate add { + sonic-ext:field-transformer "acl_type_field_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:config/oc-acl:description { + deviate add { + sonic-ext:field-name "policy_desc"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:state/oc-acl:name { + deviate add { + sonic-ext:field-transformer "acl_set_name_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:state/oc-acl:type { + deviate add { + sonic-ext:field-transformer "acl_type_field_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:state/oc-acl:description { + deviate add { + sonic-ext:field-name "policy_desc"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry { + deviate add { + sonic-ext:table-name "ACL_RULE"; + sonic-ext:key-transformer "acl_entry_key_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-acl:ipv4 { + deviate add { + sonic-ext:get-validate "validate_ipv4"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-acl:ipv6 { + deviate add { + sonic-ext:get-validate "validate_ipv6"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-acl:config/oc-acl:sequence-id { + deviate add { + sonic-ext:field-transformer "acl_entry_sequenceid_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:ipv4/oc-pkt-match:config/oc-pkt-match:source-address { + deviate add { + sonic-ext:field-name "SRC_IP"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:ipv4/oc-pkt-match:config/oc-pkt-match:destination-address { + deviate add { + sonic-ext:field-name "DST_IP"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:ipv4/oc-pkt-match:config/oc-pkt-match:protocol { + deviate add { + sonic-ext:field-transformer "acl_ip_protocol_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:ipv4/oc-pkt-match:state/oc-pkt-match:source-address { + deviate add { + sonic-ext:field-name "SRC_IP"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:ipv4/oc-pkt-match:state/oc-pkt-match:destination-address { + deviate add { + sonic-ext:field-name "DST_IP"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:ipv4/oc-pkt-match:state/oc-pkt-match:protocol { + deviate add { + sonic-ext:field-transformer "acl_ip_protocol_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:ipv6/oc-pkt-match:config/oc-pkt-match:source-address { + deviate add { + sonic-ext:field-name "SRC_IP"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:ipv6/oc-pkt-match:config/oc-pkt-match:destination-address { + deviate add { + sonic-ext:field-name "DST_IP"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:ipv6/oc-pkt-match:config/oc-pkt-match:protocol { + deviate add { + sonic-ext:field-transformer "acl_ip_protocol_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:transport/oc-pkt-match:config/oc-pkt-match:source-port { + deviate add { + sonic-ext:field-transformer "acl_source_port_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:transport/oc-pkt-match:config/oc-pkt-match:destination-port { + deviate add { + sonic-ext:field-transformer "acl_destination_port_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:transport/oc-pkt-match:state/oc-pkt-match:source-port { + deviate add { + sonic-ext:field-transformer "acl_source_port_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:transport/oc-pkt-match:state/oc-pkt-match:destination-port { + deviate add { + sonic-ext:field-transformer "acl_destination_port_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:transport/oc-pkt-match:config/oc-pkt-match:tcp-flags { + deviate add { + sonic-ext:field-transformer "acl_tcp_flags_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-pkt-match:l2/oc-pkt-match:config/oc-pkt-match:ethertype { + deviate add { + sonic-ext:field-transformer "acl_l2_ethertype_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-acl:actions/oc-acl:config/oc-acl:forwarding-action { + deviate add { + sonic-ext:field-name "PACKET_ACTION"; + sonic-ext:field-transformer "acl_forwarding_action_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/oc-acl:acl-entries/oc-acl:acl-entry/oc-acl:actions/oc-acl:state/oc-acl:forwarding-action { + deviate add { + sonic-ext:field-name "PACKET_ACTION"; + sonic-ext:field-transformer "acl_forwarding_action_xfmr"; + } + } + + deviation /oc-acl:acl/oc-acl:interfaces { + deviate add { + sonic-ext:subtree-transformer "acl_port_bindings_xfmr"; + } + } + +} + diff --git a/models/yang/annotations/sonic-extensions.yang b/models/yang/annotations/sonic-extensions.yang new file mode 100644 index 0000000000..c1252ef601 --- /dev/null +++ b/models/yang/annotations/sonic-extensions.yang @@ -0,0 +1,88 @@ +module sonic-extensions { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/sonic-ext"; + + prefix "sonic-ext"; + + // meta + organization "Sonic working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module provides extensions to the YANG language to allow + Sonic specific functionality and meta-data to be defined."; + + revision "2019-08-30" { + description + "Add extensions for redis DB mappings to identify the Redis DB name."; + } + + revision "2019-07-26" { + description + "Add extensionis for redis DB mappings for table, table-keys, table-fields and corresponding transformer methods."; + } + + + // extension statements + extension table-name { + argument "table-name"; + description "Db table name."; + } + + extension key-transformer { + argument "key-transformer-name"; + description "Db table key transformer name indicating that the list keys together form db table keys."; + } + + extension key-delimiter { + argument "key-delimiter-string"; + description "Db table key values delimiter."; + } + + extension field-name { + argument "field-name"; + description "Db table field name."; + } + + extension openapi-opid { + argument "openapi-opid"; + description "Custom Operation ID for OpenAPI"; + } + + extension field-transformer { + argument "field-transformer-name"; + description "Db table field transformer name.This can be applied to either transform yang value to some different format + or choose a specific DB field based on the type of yang value."; + } + + extension subtree-transformer { + argument "subtree-transformer-name"; + description "Subtree/node level transformer name that will have db mappings for an entire yang subtree."; + } + + extension post-transformer { + argument "post-transformer-name"; + description "Transformer name that will perform post-translation tasks."; + } + + extension get-validate { + argument "get-validate-name"; + description "Validation callpoint used to validate a YANG node during data translation back to YANG as a response to GET."; + } + + extension db-name { + argument "db-name"; + description "DB name that will indicate where data is stored. Eg: Config DB, App DB etc"; + } + extension table-transformer { + argument "table-transformer-name"; + description "Db table transformer name.This can be applied to either transform yang value to some different format + or choose a specific DB table based on the type."; + } +} diff --git a/models/yang/common/iana-if-type.yang b/models/yang/common/iana-if-type.yang new file mode 100644 index 0000000000..74e46b4b2f --- /dev/null +++ b/models/yang/common/iana-if-type.yang @@ -0,0 +1,1554 @@ +module iana-if-type { + namespace "urn:ietf:params:xml:ns:yang:iana-if-type"; + prefix ianaift; + + import ietf-interfaces { + prefix if; + } + + organization "IANA"; + contact + " Internet Assigned Numbers Authority + + Postal: ICANN + 12025 Waterfront Drive, Suite 300 + Los Angeles, CA 90094-2536 + United States + + Tel: +1 310 301 5800 + "; + description + "This YANG module defines YANG identities for IANA-registered + interface types. + + This YANG module is maintained by IANA and reflects the + 'ifType definitions' registry. + + The latest revision of this YANG module can be obtained from + the IANA web site. + + Requests for new values should be made to IANA via + email (iana&iana.org). + + Copyright (c) 2014 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + The initial version of this YANG module is part of RFC 7224; + see the RFC itself for full legal notices."; + reference + "IANA 'ifType definitions' registry. + "; + + revision 2015-06-12 { + description + "Corrected formatting issue."; + } + revision 2014-09-24 { + description + "Registered ifType 280."; + } + revision 2014-09-19 { + description + "Registered ifType 279."; + } + revision 2014-07-03 { + description + "Registered ifTypes 277-278."; + } + revision 2014-05-19 { + description + "Updated the contact address."; + } + revision 2014-05-08 { + description + "Initial revision."; + reference + "RFC 7224: IANA Interface Type YANG Module"; + } + + identity iana-interface-type { + base if:interface-type; + description + "This identity is used as a base for all interface types + defined in the 'ifType definitions' registry."; + } + + identity other { + base iana-interface-type; + } + identity regular1822 { + base iana-interface-type; + } + identity hdh1822 { + base iana-interface-type; + } + identity ddnX25 { + base iana-interface-type; + } + identity rfc877x25 { + base iana-interface-type; + reference + "RFC 1382 - SNMP MIB Extension for the X.25 Packet Layer"; + } + identity ethernetCsmacd { + base iana-interface-type; + description + "For all Ethernet-like interfaces, regardless of speed, + as per RFC 3635."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity iso88023Csmacd { + base iana-interface-type; + status deprecated; + description + "Deprecated via RFC 3635. + Use ethernetCsmacd(6) instead."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity iso88024TokenBus { + base iana-interface-type; + } + identity iso88025TokenRing { + base iana-interface-type; + } + identity iso88026Man { + base iana-interface-type; + } + identity starLan { + base iana-interface-type; + status deprecated; + description + "Deprecated via RFC 3635. + Use ethernetCsmacd(6) instead."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity proteon10Mbit { + base iana-interface-type; + } + identity proteon80Mbit { + base iana-interface-type; + } + identity hyperchannel { + base iana-interface-type; + } + identity fddi { + base iana-interface-type; + reference + "RFC 1512 - FDDI Management Information Base"; + } + identity lapb { + base iana-interface-type; + reference + "RFC 1381 - SNMP MIB Extension for X.25 LAPB"; + } + identity sdlc { + base iana-interface-type; + } + identity ds1 { + base iana-interface-type; + description + "DS1-MIB."; + reference + "RFC 4805 - Definitions of Managed Objects for the + DS1, J1, E1, DS2, and E2 Interface Types"; + } + identity e1 { + base iana-interface-type; + status obsolete; + description + "Obsolete; see DS1-MIB."; + reference + "RFC 4805 - Definitions of Managed Objects for the + DS1, J1, E1, DS2, and E2 Interface Types"; + } + identity basicISDN { + base iana-interface-type; + description + "No longer used. See also RFC 2127."; + } + identity primaryISDN { + base iana-interface-type; + description + "No longer used. See also RFC 2127."; + } + identity propPointToPointSerial { + base iana-interface-type; + description + "Proprietary serial."; + } + identity ppp { + base iana-interface-type; + } + identity softwareLoopback { + base iana-interface-type; + } + identity eon { + base iana-interface-type; + description + "CLNP over IP."; + } + identity ethernet3Mbit { + base iana-interface-type; + } + identity nsip { + base iana-interface-type; + description + "XNS over IP."; + } + identity slip { + base iana-interface-type; + description + "Generic SLIP."; + } + identity ultra { + base iana-interface-type; + description + "Ultra Technologies."; + } + identity ds3 { + base iana-interface-type; + description + "DS3-MIB."; + reference + "RFC 3896 - Definitions of Managed Objects for the + DS3/E3 Interface Type"; + } + identity sip { + base iana-interface-type; + description + "SMDS, coffee."; + reference + "RFC 1694 - Definitions of Managed Objects for SMDS + Interfaces using SMIv2"; + } + identity frameRelay { + base iana-interface-type; + description + "DTE only."; + reference + "RFC 2115 - Management Information Base for Frame Relay + DTEs Using SMIv2"; + } + identity rs232 { + base iana-interface-type; + reference + "RFC 1659 - Definitions of Managed Objects for RS-232-like + Hardware Devices using SMIv2"; + } + identity para { + base iana-interface-type; + description + "Parallel-port."; + reference + "RFC 1660 - Definitions of Managed Objects for + Parallel-printer-like Hardware Devices using + SMIv2"; + } + identity arcnet { + base iana-interface-type; + description + "ARCnet."; + } + identity arcnetPlus { + base iana-interface-type; + description + "ARCnet Plus."; + } + identity atm { + base iana-interface-type; + description + "ATM cells."; + } + identity miox25 { + base iana-interface-type; + reference + "RFC 1461 - SNMP MIB extension for Multiprotocol + Interconnect over X.25"; + } + identity sonet { + base iana-interface-type; + description + "SONET or SDH."; + } + identity x25ple { + base iana-interface-type; + reference + "RFC 2127 - ISDN Management Information Base using SMIv2"; + } + identity iso88022llc { + base iana-interface-type; + } + identity localTalk { + base iana-interface-type; + } + identity smdsDxi { + base iana-interface-type; + } + identity frameRelayService { + base iana-interface-type; + description + "FRNETSERV-MIB."; + reference + "RFC 2954 - Definitions of Managed Objects for Frame + Relay Service"; + } + identity v35 { + base iana-interface-type; + } + identity hssi { + base iana-interface-type; + } + identity hippi { + base iana-interface-type; + } + identity modem { + base iana-interface-type; + description + "Generic modem."; + } + identity aal5 { + base iana-interface-type; + description + "AAL5 over ATM."; + } + identity sonetPath { + base iana-interface-type; + } + identity sonetVT { + base iana-interface-type; + } + identity smdsIcip { + base iana-interface-type; + description + "SMDS InterCarrier Interface."; + } + identity propVirtual { + base iana-interface-type; + description + "Proprietary virtual/internal."; + reference + "RFC 2863 - The Interfaces Group MIB"; + } + identity propMultiplexor { + base iana-interface-type; + description + "Proprietary multiplexing."; + reference + "RFC 2863 - The Interfaces Group MIB"; + } + identity ieee80212 { + base iana-interface-type; + description + "100BaseVG."; + } + identity fibreChannel { + base iana-interface-type; + description + "Fibre Channel."; + } + identity hippiInterface { + base iana-interface-type; + description + "HIPPI interfaces."; + } + identity frameRelayInterconnect { + base iana-interface-type; + status obsolete; + description + "Obsolete; use either + frameRelay(32) or frameRelayService(44)."; + } + identity aflane8023 { + base iana-interface-type; + description + "ATM Emulated LAN for 802.3."; + } + identity aflane8025 { + base iana-interface-type; + description + "ATM Emulated LAN for 802.5."; + } + identity cctEmul { + base iana-interface-type; + description + "ATM Emulated circuit."; + } + identity fastEther { + base iana-interface-type; + status deprecated; + description + "Obsoleted via RFC 3635. + ethernetCsmacd(6) should be used instead."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity isdn { + base iana-interface-type; + description + "ISDN and X.25."; + reference + "RFC 1356 - Multiprotocol Interconnect on X.25 and ISDN + in the Packet Mode"; + } + identity v11 { + base iana-interface-type; + description + "CCITT V.11/X.21."; + } + identity v36 { + base iana-interface-type; + description + "CCITT V.36."; + } + identity g703at64k { + base iana-interface-type; + description + "CCITT G703 at 64Kbps."; + } + identity g703at2mb { + base iana-interface-type; + status obsolete; + description + "Obsolete; see DS1-MIB."; + } + identity qllc { + base iana-interface-type; + description + "SNA QLLC."; + } + identity fastEtherFX { + base iana-interface-type; + status deprecated; + description + "Obsoleted via RFC 3635. + ethernetCsmacd(6) should be used instead."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity channel { + base iana-interface-type; + description + "Channel."; + } + identity ieee80211 { + base iana-interface-type; + description + "Radio spread spectrum."; + } + identity ibm370parChan { + base iana-interface-type; + description + "IBM System 360/370 OEMI Channel."; + } + identity escon { + base iana-interface-type; + description + "IBM Enterprise Systems Connection."; + } + identity dlsw { + base iana-interface-type; + description + "Data Link Switching."; + } + identity isdns { + base iana-interface-type; + description + "ISDN S/T interface."; + } + identity isdnu { + base iana-interface-type; + description + "ISDN U interface."; + } + identity lapd { + base iana-interface-type; + description + "Link Access Protocol D."; + } + identity ipSwitch { + base iana-interface-type; + description + "IP Switching Objects."; + } + identity rsrb { + base iana-interface-type; + description + "Remote Source Route Bridging."; + } + identity atmLogical { + base iana-interface-type; + description + "ATM Logical Port."; + reference + "RFC 3606 - Definitions of Supplemental Managed Objects + for ATM Interface"; + } + identity ds0 { + base iana-interface-type; + description + "Digital Signal Level 0."; + reference + "RFC 2494 - Definitions of Managed Objects for the DS0 + and DS0 Bundle Interface Type"; + } + identity ds0Bundle { + base iana-interface-type; + description + "Group of ds0s on the same ds1."; + reference + "RFC 2494 - Definitions of Managed Objects for the DS0 + and DS0 Bundle Interface Type"; + } + identity bsc { + base iana-interface-type; + description + "Bisynchronous Protocol."; + } + identity async { + base iana-interface-type; + description + "Asynchronous Protocol."; + } + identity cnr { + base iana-interface-type; + description + "Combat Net Radio."; + } + identity iso88025Dtr { + base iana-interface-type; + description + "ISO 802.5r DTR."; + } + identity eplrs { + base iana-interface-type; + description + "Ext Pos Loc Report Sys."; + } + identity arap { + base iana-interface-type; + description + "Appletalk Remote Access Protocol."; + } + identity propCnls { + base iana-interface-type; + description + "Proprietary Connectionless Protocol."; + } + identity hostPad { + base iana-interface-type; + description + "CCITT-ITU X.29 PAD Protocol."; + } + identity termPad { + base iana-interface-type; + description + "CCITT-ITU X.3 PAD Facility."; + } + identity frameRelayMPI { + base iana-interface-type; + description + "Multiproto Interconnect over FR."; + } + identity x213 { + base iana-interface-type; + description + "CCITT-ITU X213."; + } + identity adsl { + base iana-interface-type; + description + "Asymmetric Digital Subscriber Loop."; + } + identity radsl { + base iana-interface-type; + description + "Rate-Adapt. Digital Subscriber Loop."; + } + identity sdsl { + base iana-interface-type; + description + "Symmetric Digital Subscriber Loop."; + } + identity vdsl { + base iana-interface-type; + description + "Very H-Speed Digital Subscrib. Loop."; + } + identity iso88025CRFPInt { + base iana-interface-type; + description + "ISO 802.5 CRFP."; + } + identity myrinet { + base iana-interface-type; + description + "Myricom Myrinet."; + } + identity voiceEM { + base iana-interface-type; + description + "Voice recEive and transMit."; + } + identity voiceFXO { + base iana-interface-type; + description + "Voice Foreign Exchange Office."; + } + identity voiceFXS { + base iana-interface-type; + description + "Voice Foreign Exchange Station."; + } + identity voiceEncap { + base iana-interface-type; + description + "Voice encapsulation."; + } + identity voiceOverIp { + base iana-interface-type; + description + "Voice over IP encapsulation."; + } + identity atmDxi { + base iana-interface-type; + description + "ATM DXI."; + } + identity atmFuni { + base iana-interface-type; + description + "ATM FUNI."; + } + identity atmIma { + base iana-interface-type; + description + "ATM IMA."; + } + identity pppMultilinkBundle { + base iana-interface-type; + description + "PPP Multilink Bundle."; + } + identity ipOverCdlc { + base iana-interface-type; + description + "IBM ipOverCdlc."; + } + identity ipOverClaw { + base iana-interface-type; + description + "IBM Common Link Access to Workstn."; + } + identity stackToStack { + base iana-interface-type; + description + "IBM stackToStack."; + } + identity virtualIpAddress { + base iana-interface-type; + description + "IBM VIPA."; + } + identity mpc { + base iana-interface-type; + description + "IBM multi-protocol channel support."; + } + identity ipOverAtm { + base iana-interface-type; + description + "IBM ipOverAtm."; + reference + "RFC 2320 - Definitions of Managed Objects for Classical IP + and ARP Over ATM Using SMIv2 (IPOA-MIB)"; + } + identity iso88025Fiber { + base iana-interface-type; + description + "ISO 802.5j Fiber Token Ring."; + } + identity tdlc { + base iana-interface-type; + description + "IBM twinaxial data link control."; + } + identity gigabitEthernet { + base iana-interface-type; + status deprecated; + description + "Obsoleted via RFC 3635. + ethernetCsmacd(6) should be used instead."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity hdlc { + base iana-interface-type; + description + "HDLC."; + } + identity lapf { + base iana-interface-type; + description + "LAP F."; + } + identity v37 { + base iana-interface-type; + description + "V.37."; + } + identity x25mlp { + base iana-interface-type; + description + "Multi-Link Protocol."; + } + identity x25huntGroup { + base iana-interface-type; + description + "X25 Hunt Group."; + } + identity transpHdlc { + base iana-interface-type; + description + "Transp HDLC."; + } + identity interleave { + base iana-interface-type; + description + "Interleave channel."; + } + identity fast { + base iana-interface-type; + description + "Fast channel."; + } + identity ip { + base iana-interface-type; + description + "IP (for APPN HPR in IP networks)."; + } + identity docsCableMaclayer { + base iana-interface-type; + description + "CATV Mac Layer."; + } + identity docsCableDownstream { + base iana-interface-type; + description + "CATV Downstream interface."; + } + identity docsCableUpstream { + base iana-interface-type; + description + "CATV Upstream interface."; + } + identity a12MppSwitch { + base iana-interface-type; + description + "Avalon Parallel Processor."; + } + identity tunnel { + base iana-interface-type; + description + "Encapsulation interface."; + } + identity coffee { + base iana-interface-type; + description + "Coffee pot."; + reference + "RFC 2325 - Coffee MIB"; + } + identity ces { + base iana-interface-type; + description + "Circuit Emulation Service."; + } + identity atmSubInterface { + base iana-interface-type; + description + "ATM Sub Interface."; + } + identity l2vlan { + base iana-interface-type; + description + "Layer 2 Virtual LAN using 802.1Q."; + } + identity l3ipvlan { + base iana-interface-type; + description + "Layer 3 Virtual LAN using IP."; + } + identity l3ipxvlan { + base iana-interface-type; + description + "Layer 3 Virtual LAN using IPX."; + } + identity digitalPowerline { + base iana-interface-type; + description + "IP over Power Lines."; + } + identity mediaMailOverIp { + base iana-interface-type; + description + "Multimedia Mail over IP."; + } + identity dtm { + base iana-interface-type; + description + "Dynamic synchronous Transfer Mode."; + } + identity dcn { + base iana-interface-type; + description + "Data Communications Network."; + } + identity ipForward { + base iana-interface-type; + description + "IP Forwarding Interface."; + } + identity msdsl { + base iana-interface-type; + description + "Multi-rate Symmetric DSL."; + } + identity ieee1394 { + base iana-interface-type; + + description + "IEEE1394 High Performance Serial Bus."; + } + identity if-gsn { + base iana-interface-type; + description + "HIPPI-6400."; + } + identity dvbRccMacLayer { + base iana-interface-type; + description + "DVB-RCC MAC Layer."; + } + identity dvbRccDownstream { + base iana-interface-type; + description + "DVB-RCC Downstream Channel."; + } + identity dvbRccUpstream { + base iana-interface-type; + description + "DVB-RCC Upstream Channel."; + } + identity atmVirtual { + base iana-interface-type; + description + "ATM Virtual Interface."; + } + identity mplsTunnel { + base iana-interface-type; + description + "MPLS Tunnel Virtual Interface."; + } + identity srp { + base iana-interface-type; + description + "Spatial Reuse Protocol."; + } + identity voiceOverAtm { + base iana-interface-type; + description + "Voice over ATM."; + } + identity voiceOverFrameRelay { + base iana-interface-type; + description + "Voice Over Frame Relay."; + } + identity idsl { + base iana-interface-type; + description + "Digital Subscriber Loop over ISDN."; + } + identity compositeLink { + base iana-interface-type; + description + "Avici Composite Link Interface."; + } + identity ss7SigLink { + base iana-interface-type; + description + "SS7 Signaling Link."; + } + identity propWirelessP2P { + base iana-interface-type; + description + "Prop. P2P wireless interface."; + } + identity frForward { + base iana-interface-type; + description + "Frame Forward Interface."; + } + identity rfc1483 { + base iana-interface-type; + description + "Multiprotocol over ATM AAL5."; + reference + "RFC 1483 - Multiprotocol Encapsulation over ATM + Adaptation Layer 5"; + } + identity usb { + base iana-interface-type; + description + "USB Interface."; + } + identity ieee8023adLag { + base iana-interface-type; + description + "IEEE 802.3ad Link Aggregate."; + } + identity bgppolicyaccounting { + base iana-interface-type; + description + "BGP Policy Accounting."; + } + identity frf16MfrBundle { + base iana-interface-type; + description + "FRF.16 Multilink Frame Relay."; + } + identity h323Gatekeeper { + base iana-interface-type; + description + "H323 Gatekeeper."; + } + identity h323Proxy { + base iana-interface-type; + description + "H323 Voice and Video Proxy."; + } + identity mpls { + base iana-interface-type; + description + "MPLS."; + } + identity mfSigLink { + base iana-interface-type; + description + "Multi-frequency signaling link."; + } + identity hdsl2 { + base iana-interface-type; + description + "High Bit-Rate DSL - 2nd generation."; + } + identity shdsl { + base iana-interface-type; + description + "Multirate HDSL2."; + } + identity ds1FDL { + base iana-interface-type; + description + "Facility Data Link (4Kbps) on a DS1."; + } + identity pos { + base iana-interface-type; + description + "Packet over SONET/SDH Interface."; + } + identity dvbAsiIn { + base iana-interface-type; + description + "DVB-ASI Input."; + } + identity dvbAsiOut { + base iana-interface-type; + description + "DVB-ASI Output."; + } + identity plc { + base iana-interface-type; + description + "Power Line Communications."; + } + identity nfas { + base iana-interface-type; + description + "Non-Facility Associated Signaling."; + } + identity tr008 { + base iana-interface-type; + description + "TR008."; + } + identity gr303RDT { + base iana-interface-type; + description + "Remote Digital Terminal."; + } + identity gr303IDT { + base iana-interface-type; + description + "Integrated Digital Terminal."; + } + identity isup { + base iana-interface-type; + description + "ISUP."; + } + identity propDocsWirelessMaclayer { + base iana-interface-type; + description + "Cisco proprietary Maclayer."; + } + identity propDocsWirelessDownstream { + base iana-interface-type; + description + "Cisco proprietary Downstream."; + } + identity propDocsWirelessUpstream { + base iana-interface-type; + description + "Cisco proprietary Upstream."; + } + identity hiperlan2 { + base iana-interface-type; + description + "HIPERLAN Type 2 Radio Interface."; + } + identity propBWAp2Mp { + base iana-interface-type; + description + "PropBroadbandWirelessAccesspt2Multipt (use of this value + for IEEE 802.16 WMAN interfaces as per IEEE Std 802.16f + is deprecated, and ieee80216WMAN(237) should be used + instead)."; + } + identity sonetOverheadChannel { + base iana-interface-type; + description + "SONET Overhead Channel."; + } + identity digitalWrapperOverheadChannel { + base iana-interface-type; + description + "Digital Wrapper."; + } + identity aal2 { + base iana-interface-type; + description + "ATM adaptation layer 2."; + } + identity radioMAC { + base iana-interface-type; + description + "MAC layer over radio links."; + } + identity atmRadio { + base iana-interface-type; + description + "ATM over radio links."; + } + identity imt { + base iana-interface-type; + description + "Inter-Machine Trunks."; + } + identity mvl { + base iana-interface-type; + description + "Multiple Virtual Lines DSL."; + } + identity reachDSL { + base iana-interface-type; + description + "Long Reach DSL."; + } + identity frDlciEndPt { + base iana-interface-type; + description + "Frame Relay DLCI End Point."; + } + identity atmVciEndPt { + base iana-interface-type; + description + "ATM VCI End Point."; + } + identity opticalChannel { + base iana-interface-type; + description + "Optical Channel."; + } + identity opticalTransport { + base iana-interface-type; + description + "Optical Transport."; + } + identity propAtm { + base iana-interface-type; + description + "Proprietary ATM."; + } + identity voiceOverCable { + base iana-interface-type; + description + "Voice Over Cable Interface."; + } + identity infiniband { + base iana-interface-type; + description + "Infiniband."; + } + identity teLink { + base iana-interface-type; + description + "TE Link."; + } + identity q2931 { + base iana-interface-type; + description + "Q.2931."; + } + identity virtualTg { + base iana-interface-type; + description + "Virtual Trunk Group."; + } + identity sipTg { + base iana-interface-type; + description + "SIP Trunk Group."; + } + identity sipSig { + base iana-interface-type; + description + "SIP Signaling."; + } + identity docsCableUpstreamChannel { + base iana-interface-type; + description + "CATV Upstream Channel."; + } + identity econet { + base iana-interface-type; + description + "Acorn Econet."; + } + identity pon155 { + base iana-interface-type; + description + "FSAN 155Mb Symetrical PON interface."; + } + identity pon622 { + base iana-interface-type; + description + "FSAN 622Mb Symetrical PON interface."; + } + identity bridge { + base iana-interface-type; + description + "Transparent bridge interface."; + } + identity linegroup { + base iana-interface-type; + description + "Interface common to multiple lines."; + } + identity voiceEMFGD { + base iana-interface-type; + description + "Voice E&M Feature Group D."; + } + identity voiceFGDEANA { + base iana-interface-type; + description + "Voice FGD Exchange Access North American."; + } + identity voiceDID { + base iana-interface-type; + description + "Voice Direct Inward Dialing."; + } + identity mpegTransport { + base iana-interface-type; + description + "MPEG transport interface."; + } + identity sixToFour { + base iana-interface-type; + status deprecated; + description + "6to4 interface (DEPRECATED)."; + reference + "RFC 4087 - IP Tunnel MIB"; + } + identity gtp { + base iana-interface-type; + description + "GTP (GPRS Tunneling Protocol)."; + } + identity pdnEtherLoop1 { + base iana-interface-type; + description + "Paradyne EtherLoop 1."; + } + identity pdnEtherLoop2 { + base iana-interface-type; + description + "Paradyne EtherLoop 2."; + } + identity opticalChannelGroup { + base iana-interface-type; + description + "Optical Channel Group."; + } + identity homepna { + base iana-interface-type; + description + "HomePNA ITU-T G.989."; + } + identity gfp { + base iana-interface-type; + description + "Generic Framing Procedure (GFP)."; + } + identity ciscoISLvlan { + base iana-interface-type; + description + "Layer 2 Virtual LAN using Cisco ISL."; + } + identity actelisMetaLOOP { + base iana-interface-type; + description + "Acteleis proprietary MetaLOOP High Speed Link."; + } + identity fcipLink { + base iana-interface-type; + description + "FCIP Link."; + } + identity rpr { + base iana-interface-type; + description + "Resilient Packet Ring Interface Type."; + } + identity qam { + base iana-interface-type; + description + "RF Qam Interface."; + } + identity lmp { + base iana-interface-type; + description + "Link Management Protocol."; + reference + "RFC 4327 - Link Management Protocol (LMP) Management + Information Base (MIB)"; + } + identity cblVectaStar { + base iana-interface-type; + description + "Cambridge Broadband Networks Limited VectaStar."; + } + identity docsCableMCmtsDownstream { + base iana-interface-type; + description + "CATV Modular CMTS Downstream Interface."; + } + identity adsl2 { + base iana-interface-type; + status deprecated; + description + "Asymmetric Digital Subscriber Loop Version 2 + (DEPRECATED/OBSOLETED - please use adsl2plus(238) + instead)."; + reference + "RFC 4706 - Definitions of Managed Objects for Asymmetric + Digital Subscriber Line 2 (ADSL2)"; + } + identity macSecControlledIF { + base iana-interface-type; + description + "MACSecControlled."; + } + identity macSecUncontrolledIF { + base iana-interface-type; + description + "MACSecUncontrolled."; + } + identity aviciOpticalEther { + base iana-interface-type; + description + "Avici Optical Ethernet Aggregate."; + } + identity atmbond { + base iana-interface-type; + description + "atmbond."; + } + identity voiceFGDOS { + base iana-interface-type; + description + "Voice FGD Operator Services."; + } + identity mocaVersion1 { + base iana-interface-type; + description + "MultiMedia over Coax Alliance (MoCA) Interface + as documented in information provided privately to IANA."; + } + identity ieee80216WMAN { + base iana-interface-type; + description + "IEEE 802.16 WMAN interface."; + } + identity adsl2plus { + base iana-interface-type; + description + "Asymmetric Digital Subscriber Loop Version 2 - + Version 2 Plus and all variants."; + } + identity dvbRcsMacLayer { + base iana-interface-type; + description + "DVB-RCS MAC Layer."; + reference + "RFC 5728 - The SatLabs Group DVB-RCS MIB"; + } + identity dvbTdm { + base iana-interface-type; + description + "DVB Satellite TDM."; + reference + "RFC 5728 - The SatLabs Group DVB-RCS MIB"; + } + identity dvbRcsTdma { + base iana-interface-type; + description + "DVB-RCS TDMA."; + reference + "RFC 5728 - The SatLabs Group DVB-RCS MIB"; + } + identity x86Laps { + base iana-interface-type; + description + "LAPS based on ITU-T X.86/Y.1323."; + } + identity wwanPP { + base iana-interface-type; + description + "3GPP WWAN."; + } + identity wwanPP2 { + base iana-interface-type; + description + "3GPP2 WWAN."; + } + identity voiceEBS { + base iana-interface-type; + description + "Voice P-phone EBS physical interface."; + } + identity ifPwType { + base iana-interface-type; + description + "Pseudowire interface type."; + reference + "RFC 5601 - Pseudowire (PW) Management Information Base (MIB)"; + } + identity ilan { + base iana-interface-type; + description + "Internal LAN on a bridge per IEEE 802.1ap."; + } + identity pip { + base iana-interface-type; + description + "Provider Instance Port on a bridge per IEEE 802.1ah PBB."; + } + identity aluELP { + base iana-interface-type; + description + "Alcatel-Lucent Ethernet Link Protection."; + } + identity gpon { + base iana-interface-type; + description + "Gigabit-capable passive optical networks (G-PON) as per + ITU-T G.948."; + } + identity vdsl2 { + base iana-interface-type; + description + "Very high speed digital subscriber line Version 2 + (as per ITU-T Recommendation G.993.2)."; + reference + "RFC 5650 - Definitions of Managed Objects for Very High + Speed Digital Subscriber Line 2 (VDSL2)"; + } + identity capwapDot11Profile { + base iana-interface-type; + description + "WLAN Profile Interface."; + reference + "RFC 5834 - Control and Provisioning of Wireless Access + Points (CAPWAP) Protocol Binding MIB for + IEEE 802.11"; + } + identity capwapDot11Bss { + base iana-interface-type; + description + "WLAN BSS Interface."; + reference + "RFC 5834 - Control and Provisioning of Wireless Access + Points (CAPWAP) Protocol Binding MIB for + IEEE 802.11"; + } + identity capwapWtpVirtualRadio { + base iana-interface-type; + description + "WTP Virtual Radio Interface."; + reference + "RFC 5833 - Control and Provisioning of Wireless Access + Points (CAPWAP) Protocol Base MIB"; + } + identity bits { + base iana-interface-type; + description + "bitsport."; + } + identity docsCableUpstreamRfPort { + base iana-interface-type; + description + "DOCSIS CATV Upstream RF Port."; + } + identity cableDownstreamRfPort { + base iana-interface-type; + description + "CATV downstream RF Port."; + } + identity vmwareVirtualNic { + base iana-interface-type; + description + "VMware Virtual Network Interface."; + } + identity ieee802154 { + base iana-interface-type; + description + "IEEE 802.15.4 WPAN interface."; + reference + "IEEE 802.15.4-2006"; + } + identity otnOdu { + base iana-interface-type; + description + "OTN Optical Data Unit."; + } + identity otnOtu { + base iana-interface-type; + description + "OTN Optical channel Transport Unit."; + } + identity ifVfiType { + base iana-interface-type; + description + "VPLS Forwarding Instance Interface Type."; + } + identity g9981 { + base iana-interface-type; + description + "G.998.1 bonded interface."; + } + identity g9982 { + base iana-interface-type; + description + "G.998.2 bonded interface."; + } + identity g9983 { + base iana-interface-type; + description + "G.998.3 bonded interface."; + } + + identity aluEpon { + base iana-interface-type; + description + "Ethernet Passive Optical Networks (E-PON)."; + } + identity aluEponOnu { + base iana-interface-type; + description + "EPON Optical Network Unit."; + } + identity aluEponPhysicalUni { + base iana-interface-type; + description + "EPON physical User to Network interface."; + } + identity aluEponLogicalLink { + base iana-interface-type; + description + "The emulation of a point-to-point link over the EPON + layer."; + } + identity aluGponOnu { + base iana-interface-type; + description + "GPON Optical Network Unit."; + reference + "ITU-T G.984.2"; + } + identity aluGponPhysicalUni { + base iana-interface-type; + description + "GPON physical User to Network interface."; + reference + "ITU-T G.984.2"; + } + identity vmwareNicTeam { + base iana-interface-type; + description + "VMware NIC Team."; + } + identity docsOfdmDownstream { + base iana-interface-type; + description + "CATV Downstream OFDM interface."; + } + identity docsOfdmaUpstream { + base iana-interface-type; + description + "CATV Upstream OFDMA interface."; + } + identity gfast { + base iana-interface-type; + description + "G.fast port."; + reference + "ITU-T G.9701"; + } + identity sdci { + base iana-interface-type; + description + "SDCI (IO-Link)."; + reference + "IEC 61131-9 Edition 1.0 2013-09"; + } +} diff --git a/models/yang/common/ietf-inet-types.yang b/models/yang/common/ietf-inet-types.yang new file mode 100644 index 0000000000..2f14270dec --- /dev/null +++ b/models/yang/common/ietf-inet-types.yang @@ -0,0 +1,457 @@ +module ietf-inet-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types"; + prefix "inet"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types for Internet addresses and related things. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - ip-address-no-zone + - ipv4-address-no-zone + - ipv6-address-no-zone"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of types related to protocol fields ***/ + + typedef ip-version { + type enumeration { + enum unknown { + value "0"; + description + "An unknown or unspecified version of the Internet + protocol."; + } + enum ipv4 { + value "1"; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum ipv6 { + value "2"; + description + "The IPv6 protocol as defined in RFC 2460."; + } + } + description + "This value represents the version of the IP protocol. + + In the value set and its semantics, this type is equivalent + to the InetVersion textual convention of the SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "The dscp type represents a Differentiated Services Code Point + that may be used for marking packets in a traffic stream. + In the value set and its semantics, this type is equivalent + to the Dscp textual convention of the SMIv2."; + reference + "RFC 3289: Management Information Base for the Differentiated + Services Architecture + RFC 2474: Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers + RFC 2780: IANA Allocation Guidelines For Values In + the Internet Protocol and Related Headers"; + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The ipv6-flow-label type represents the flow identifier or Flow + Label in an IPv6 packet header that may be used to + discriminate traffic flows. + + In the value set and its semantics, this type is equivalent + to the IPv6FlowLabel textual convention of the SMIv2."; + reference + "RFC 3595: Textual Conventions for IPv6 Flow Label + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef port-number { + type uint16 { + range "0..65535"; + } + description + "The port-number type represents a 16-bit port number of an + Internet transport-layer protocol such as UDP, TCP, DCCP, or + SCTP. Port numbers are assigned by IANA. A current list of + all assignments is available from . + + Note that the port number value zero is reserved by IANA. In + situations where the value zero does not make sense, it can + be excluded by subtyping the port-number type. + In the value set and its semantics, this type is equivalent + to the InetPortNumber textual convention of the SMIv2."; + reference + "RFC 768: User Datagram Protocol + RFC 793: Transmission Control Protocol + RFC 4960: Stream Control Transmission Protocol + RFC 4340: Datagram Congestion Control Protocol (DCCP) + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + /*** collection of types related to autonomous systems ***/ + + typedef as-number { + type uint32; + description + "The as-number type represents autonomous system numbers + which identify an Autonomous System (AS). An AS is a set + of routers under a single technical administration, using + an interior gateway protocol and common metrics to route + packets within the AS, and using an exterior gateway + protocol to route packets to other ASes. IANA maintains + the AS number space and has delegated large parts to the + regional registries. + + Autonomous system numbers were originally limited to 16 + bits. BGP extensions have enlarged the autonomous system + number space to 32 bits. This type therefore uses an uint32 + base type without a range restriction in order to support + a larger autonomous system number space. + + In the value set and its semantics, this type is equivalent + to the InetAutonomousSystemNumber textual convention of + the SMIv2."; + reference + "RFC 1930: Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271: A Border Gateway Protocol 4 (BGP-4) + RFC 4001: Textual Conventions for Internet Network Addresses + RFC 6793: BGP Support for Four-Octet Autonomous System (AS) + Number Space"; + } + + /*** collection of types related to IP addresses and hostnames ***/ + + typedef ip-address { + type union { + type inet:ipv4-address; + type inet:ipv6-address; + } + description + "The ip-address type represents an IP address and is IP + version neutral. The format of the textual representation + implies the IP version. This type supports scoped addresses + by allowing zone identifiers in the address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '(%[\p{N}\p{L}]+)?'; + } + description + "The ipv4-address type represents an IPv4 address in + dotted-quad notation. The IPv4 address may include a zone + index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format for the zone index is the numerical + format"; + } + + typedef ipv6-address { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(%[\p{N}\p{L}]+)?'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(%.+)?'; + } + description + "The ipv6-address type represents an IPv6 address in full, + mixed, shortened, and shortened-mixed notation. The IPv6 + address may include a zone index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format of IPv6 addresses uses the textual + representation defined in Section 4 of RFC 5952. The + canonical format for the zone index is the numerical + format as described in Section 11.2 of RFC 4007."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-no-zone { + type union { + type inet:ipv4-address-no-zone; + type inet:ipv6-address-no-zone; + } + description + "The ip-address-no-zone type represents an IP address and is + IP version neutral. The format of the textual representation + implies the IP version. This type does not support scoped + addresses since it does not allow zone identifiers in the + address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address-no-zone { + type inet:ipv4-address { + pattern '[0-9\.]*'; + } + description + "An IPv4 address without a zone index. This type, derived from + ipv4-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + } + + typedef ipv6-address-no-zone { + type inet:ipv6-address { + pattern '[0-9a-fA-F:\.]*'; + } + description + "An IPv6 address without a zone index. This type, derived from + ipv6-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-prefix { + type union { + type inet:ipv4-prefix; + type inet:ipv6-prefix; + } + description + "The ip-prefix type represents an IP prefix and is IP + version neutral. The format of the textual representations + implies the IP version."; + } + + typedef ipv4-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-prefix type represents an IPv4 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv4 prefix has all bits of + the IPv4 address set to zero that are not part of the + IPv4 prefix."; + } + + typedef ipv6-prefix { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(/.+)'; + } + description + "The ipv6-prefix type represents an IPv6 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The IPv6 address should have all bits that do not belong + to the prefix set to zero. + + The canonical format of an IPv6 prefix has all bits of + the IPv6 address set to zero that are not part of the + IPv6 prefix. Furthermore, the IPv6 address is represented + as defined in Section 4 of RFC 5952."; + reference + "RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + /*** collection of domain name and URI types ***/ + + typedef domain-name { + type string { + length "1..253"; + pattern + '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' + + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' + + '|\.'; + } + description + "The domain-name type represents a DNS domain name. The + name SHOULD be fully qualified whenever possible. + + Internet domain names are only loosely specified. Section + 3.5 of RFC 1034 recommends a syntax (modified in Section + 2.1 of RFC 1123). The pattern above is intended to allow + for current practice in domain name use, and some possible + future expansion. It is designed to hold various types of + domain names, including names used for A or AAAA records + (host names) and other records, such as SRV records. Note + that Internet host names have a stricter syntax (described + in RFC 952) than the DNS recommendations in RFCs 1034 and + 1123, and that systems that want to store host names in + schema nodes using the domain-name type are recommended to + adhere to this stricter standard to ensure interoperability. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + The description clause of schema nodes using the domain-name + type MUST describe when and how these names are resolved to + IP addresses. Note that the resolution of a domain-name value + may require to query multiple DNS records (e.g., A for IPv4 + and AAAA for IPv6). The order of the resolution process and + which DNS record takes precedence can either be defined + explicitly or may depend on the configuration of the + resolver. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be A-labels as per RFC 5890."; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1034: Domain Names - Concepts and Facilities + RFC 1123: Requirements for Internet Hosts -- Application + and Support + RFC 2782: A DNS RR for specifying the location of services + (DNS SRV) + RFC 5890: Internationalized Domain Names in Applications + (IDNA): Definitions and Document Framework"; + } + + typedef host { + type union { + type inet:ip-address; + type inet:domain-name; + } + description + "The host type represents either an IP address or a DNS + domain name."; + } + + typedef uri { + type string; + description + "The uri type represents a Uniform Resource Identifier + (URI) as defined by STD 66. + + Objects using the uri type MUST be in US-ASCII encoding, + and MUST be normalized as described by RFC 3986 Sections + 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary + percent-encoding is removed, and all case-insensitive + characters are set to lowercase except for hexadecimal + digits, which are normalized to uppercase as described in + Section 6.2.2.1. + + The purpose of this normalization is to help provide + unique URIs. Note that this normalization is not + sufficient to provide uniqueness. Two URIs that are + textually distinct after this normalization may still be + equivalent. + + Objects using the uri type may restrict the schemes that + they permit. For example, 'data:' and 'urn:' schemes + might not be appropriate. + + A zero-length URI is not a valid URI. This can be used to + express 'URI absent' where required. + + In the value set and its semantics, this type is equivalent + to the Uri SMIv2 textual convention defined in RFC 5017."; + reference + "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax + RFC 3305: Report from the Joint W3C/IETF URI Planning Interest + Group: Uniform Resource Identifiers (URIs), URLs, + and Uniform Resource Names (URNs): Clarifications + and Recommendations + RFC 5017: MIB Textual Conventions for Uniform Resource + Identifiers (URIs)"; + } + +} diff --git a/models/yang/common/ietf-interfaces.yang b/models/yang/common/ietf-interfaces.yang new file mode 100644 index 0000000000..ff2586abe9 --- /dev/null +++ b/models/yang/common/ietf-interfaces.yang @@ -0,0 +1,1121 @@ +module ietf-interfaces { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces"; + prefix if; + + import ietf-yang-types { + prefix yang; + } + + organization + "IETF NETMOD (Network Modeling) Working Group"; + + contact + "WG Web: + WG List: + + Editor: Martin Bjorklund + "; + + description + "This module contains a collection of YANG definitions for + managing network interfaces. + + Copyright (c) 2018 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 8343; see + the RFC itself for full legal notices."; + + revision 2018-02-20 { + description + "Updated to support NMDA."; + reference + "RFC 8343: A YANG Data Model for Interface Management"; + } + + revision 2014-05-08 { + description + "Initial revision."; + reference + "RFC 7223: A YANG Data Model for Interface Management"; + } + + /* + * Typedefs + */ + + typedef interface-ref { + type leafref { + path "/if:interfaces/if:interface/if:name"; + } + description + "This type is used by data models that need to reference + interfaces."; + } + + /* + * Identities + */ + + identity interface-type { + description + "Base identity from which specific interface types are + derived."; + } + + /* + * Features + */ + + feature arbitrary-names { + description + "This feature indicates that the device allows user-controlled + interfaces to be named arbitrarily."; + } + feature pre-provisioning { + description + "This feature indicates that the device supports + pre-provisioning of interface configuration, i.e., it is + possible to configure an interface whose physical interface + hardware is not present on the device."; + } + feature if-mib { + description + "This feature indicates that the device implements + the IF-MIB."; + reference + "RFC 2863: The Interfaces Group MIB"; + } + + /* + * Data nodes + */ + + container interfaces { + description + "Interface parameters."; + + list interface { + key "name"; + + description + "The list of interfaces on the device. + + The status of an interface is available in this list in the + operational state. If the configuration of a + system-controlled interface cannot be used by the system + (e.g., the interface hardware present does not match the + interface type), then the configuration is not applied to + the system-controlled interface shown in the operational + state. If the configuration of a user-controlled interface + cannot be used by the system, the configured interface is + not instantiated in the operational state. + + System-controlled interfaces created by the system are + always present in this list in the operational state, + whether or not they are configured."; + + leaf name { + type string; + description + "The name of the interface. + + A device MAY restrict the allowed values for this leaf, + possibly depending on the type of the interface. + For system-controlled interfaces, this leaf is the + device-specific name of the interface. + + If a client tries to create configuration for a + system-controlled interface that is not present in the + operational state, the server MAY reject the request if + the implementation does not support pre-provisioning of + interfaces or if the name refers to an interface that can + never exist in the system. A Network Configuration + Protocol (NETCONF) server MUST reply with an rpc-error + with the error-tag 'invalid-value' in this case. + + If the device supports pre-provisioning of interface + configuration, the 'pre-provisioning' feature is + advertised. + + If the device allows arbitrarily named user-controlled + interfaces, the 'arbitrary-names' feature is advertised. + When a configured user-controlled interface is created by + the system, it is instantiated with the same name in the + operational state. + + A server implementation MAY map this leaf to the ifName + MIB object. Such an implementation needs to use some + mechanism to handle the differences in size and characters + allowed between this leaf and ifName. The definition of + such a mechanism is outside the scope of this document."; + reference + "RFC 2863: The Interfaces Group MIB - ifName"; + } + + leaf description { + type string; + description + "A textual description of the interface. + + A server implementation MAY map this leaf to the ifAlias + MIB object. Such an implementation needs to use some + mechanism to handle the differences in size and characters + allowed between this leaf and ifAlias. The definition of + such a mechanism is outside the scope of this document. + + Since ifAlias is defined to be stored in non-volatile + storage, the MIB implementation MUST map ifAlias to the + value of 'description' in the persistently stored + configuration."; + reference + "RFC 2863: The Interfaces Group MIB - ifAlias"; + } + + leaf type { + type identityref { + base interface-type; + } + mandatory true; + description + "The type of the interface. + + When an interface entry is created, a server MAY + initialize the type leaf with a valid value, e.g., if it + is possible to derive the type from the name of the + interface. + + If a client tries to set the type of an interface to a + value that can never be used by the system, e.g., if the + type is not supported or if the type does not match the + name of the interface, the server MUST reject the request. + A NETCONF server MUST reply with an rpc-error with the + error-tag 'invalid-value' in this case."; + reference + "RFC 2863: The Interfaces Group MIB - ifType"; + } + + leaf enabled { + type boolean; + default "true"; + description + "This leaf contains the configured, desired state of the + interface. + + Systems that implement the IF-MIB use the value of this + leaf in the intended configuration to set + IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry + has been initialized, as described in RFC 2863. + + Changes in this leaf in the intended configuration are + reflected in ifAdminStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; + } + + leaf link-up-down-trap-enable { + if-feature if-mib; + type enumeration { + enum enabled { + value 1; + description + "The device will generate linkUp/linkDown SNMP + notifications for this interface."; + } + enum disabled { + value 2; + description + "The device will not generate linkUp/linkDown SNMP + notifications for this interface."; + } + } + description + "Controls whether linkUp/linkDown SNMP notifications + should be generated for this interface. + + If this node is not configured, the value 'enabled' is + operationally used by the server for interfaces that do + not operate on top of any other interface (i.e., there are + no 'lower-layer-if' entries), and 'disabled' otherwise."; + reference + "RFC 2863: The Interfaces Group MIB - + ifLinkUpDownTrapEnable"; + } + + leaf admin-status { + if-feature if-mib; + type enumeration { + enum up { + value 1; + description + "Ready to pass packets."; + } + enum down { + value 2; + description + "Not ready to pass packets and not in some test mode."; + } + enum testing { + value 3; + description + "In some test mode."; + } + } + config false; + mandatory true; + description + "The desired state of the interface. + + This leaf has the same read semantics as ifAdminStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; + } + + leaf oper-status { + type enumeration { + enum up { + value 1; + description + "Ready to pass packets."; + } + enum down { + value 2; + + description + "The interface does not pass any packets."; + } + enum testing { + value 3; + description + "In some test mode. No operational packets can + be passed."; + } + enum unknown { + value 4; + description + "Status cannot be determined for some reason."; + } + enum dormant { + value 5; + description + "Waiting for some external event."; + } + enum not-present { + value 6; + description + "Some component (typically hardware) is missing."; + } + enum lower-layer-down { + value 7; + description + "Down due to state of lower-layer interface(s)."; + } + } + config false; + mandatory true; + description + "The current operational state of the interface. + + This leaf has the same semantics as ifOperStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifOperStatus"; + } + + leaf last-change { + type yang:date-and-time; + config false; + description + "The time the interface entered its current operational + state. If the current state was entered prior to the + last re-initialization of the local network management + subsystem, then this node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - ifLastChange"; + } + + leaf if-index { + if-feature if-mib; + type int32 { + range "1..2147483647"; + } + config false; + mandatory true; + description + "The ifIndex value for the ifEntry represented by this + interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifIndex"; + } + + leaf phys-address { + type yang:phys-address; + config false; + description + "The interface's address at its protocol sub-layer. For + example, for an 802.x interface, this object normally + contains a Media Access Control (MAC) address. The + interface's media-specific modules must define the bit + and byte ordering and the format of the value of this + object. For interfaces that do not have such an address + (e.g., a serial line), this node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - ifPhysAddress"; + } + + leaf-list higher-layer-if { + type interface-ref; + config false; + description + "A list of references to interfaces layered on top of this + interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifStackTable"; + } + + leaf-list lower-layer-if { + type interface-ref; + config false; + description + "A list of references to interfaces layered underneath this + interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifStackTable"; + } + + leaf speed { + type yang:gauge64; + units "bits/second"; + config false; + description + "An estimate of the interface's current bandwidth in bits + per second. For interfaces that do not vary in + bandwidth or for those where no accurate estimation can + be made, this node should contain the nominal bandwidth. + For interfaces that have no concept of bandwidth, this + node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - + ifSpeed, ifHighSpeed"; + } + + container statistics { + config false; + description + "A collection of interface-related statistics objects."; + + leaf discontinuity-time { + type yang:date-and-time; + mandatory true; + description + "The time on the most recent occasion at which any one or + more of this interface's counters suffered a + discontinuity. If no such discontinuities have occurred + since the last re-initialization of the local management + subsystem, then this node contains the time the local + management subsystem re-initialized itself."; + } + + leaf in-octets { + type yang:counter64; + description + "The total number of octets received on the interface, + including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInOctets"; + } + + leaf in-unicast-pkts { + type yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were not addressed to a + multicast or broadcast address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts"; + } + + leaf in-broadcast-pkts { + type yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a broadcast + address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInBroadcastPkts"; + } + + leaf in-multicast-pkts { + type yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a multicast + address at this sub-layer. For a MAC-layer protocol, + this includes both Group and Functional addresses. + + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInMulticastPkts"; + } + + leaf in-discards { + type yang:counter32; + description + "The number of inbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being deliverable to a higher-layer + protocol. One possible reason for discarding such a + packet could be to free up buffer space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInDiscards"; + } + + leaf in-errors { + type yang:counter32; + description + "For packet-oriented interfaces, the number of inbound + packets that contained errors preventing them from being + deliverable to a higher-layer protocol. For character- + oriented or fixed-length interfaces, the number of + inbound transmission units that contained errors + preventing them from being deliverable to a higher-layer + protocol. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInErrors"; + } + + leaf in-unknown-protos { + type yang:counter32; + + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } + + leaf out-octets { + type yang:counter64; + description + "The total number of octets transmitted out of the + interface, including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutOctets"; + } + + leaf out-unicast-pkts { + type yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were not addressed + to a multicast or broadcast address at this sub-layer, + including those that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts"; + } + + leaf out-broadcast-pkts { + type yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were addressed to a + broadcast address at this sub-layer, including those + that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutBroadcastPkts"; + } + + leaf out-multicast-pkts { + type yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were addressed to a + multicast address at this sub-layer, including those + that were discarded or not sent. For a MAC-layer + protocol, this includes both Group and Functional + addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutMulticastPkts"; + } + + leaf out-discards { + type yang:counter32; + description + "The number of outbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being transmitted. One possible reason + for discarding such a packet could be to free up buffer + space. + + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutDiscards"; + } + + leaf out-errors { + type yang:counter32; + description + "For packet-oriented interfaces, the number of outbound + packets that could not be transmitted because of errors. + For character-oriented or fixed-length interfaces, the + number of outbound transmission units that could not be + transmitted because of errors. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutErrors"; + } + } + + } + } + + /* + * Legacy typedefs + */ + + typedef interface-state-ref { + type leafref { + path "/if:interfaces-state/if:interface/if:name"; + } + status deprecated; + description + "This type is used by data models that need to reference + the operationally present interfaces."; + } + + /* + * Legacy operational state data nodes + */ + + container interfaces-state { + config false; + status deprecated; + description + "Data nodes for the operational state of interfaces."; + + list interface { + key "name"; + status deprecated; + + description + "The list of interfaces on the device. + + System-controlled interfaces created by the system are + always present in this list, whether or not they are + configured."; + + leaf name { + type string; + status deprecated; + description + "The name of the interface. + + A server implementation MAY map this leaf to the ifName + MIB object. Such an implementation needs to use some + mechanism to handle the differences in size and characters + allowed between this leaf and ifName. The definition of + such a mechanism is outside the scope of this document."; + reference + "RFC 2863: The Interfaces Group MIB - ifName"; + } + + leaf type { + type identityref { + base interface-type; + } + mandatory true; + status deprecated; + description + "The type of the interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifType"; + } + + leaf admin-status { + if-feature if-mib; + type enumeration { + enum up { + value 1; + description + "Ready to pass packets."; + } + enum down { + value 2; + description + "Not ready to pass packets and not in some test mode."; + } + enum testing { + value 3; + description + "In some test mode."; + } + } + mandatory true; + status deprecated; + description + "The desired state of the interface. + + This leaf has the same read semantics as ifAdminStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; + } + + leaf oper-status { + type enumeration { + enum up { + value 1; + description + "Ready to pass packets."; + } + enum down { + value 2; + description + "The interface does not pass any packets."; + } + enum testing { + value 3; + description + "In some test mode. No operational packets can + be passed."; + } + enum unknown { + value 4; + description + "Status cannot be determined for some reason."; + } + enum dormant { + value 5; + description + "Waiting for some external event."; + } + enum not-present { + value 6; + description + "Some component (typically hardware) is missing."; + } + enum lower-layer-down { + value 7; + description + "Down due to state of lower-layer interface(s)."; + } + } + mandatory true; + status deprecated; + description + "The current operational state of the interface. + + This leaf has the same semantics as ifOperStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifOperStatus"; + } + + leaf last-change { + type yang:date-and-time; + status deprecated; + description + "The time the interface entered its current operational + state. If the current state was entered prior to the + last re-initialization of the local network management + subsystem, then this node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - ifLastChange"; + } + + leaf if-index { + if-feature if-mib; + type int32 { + range "1..2147483647"; + } + mandatory true; + status deprecated; + description + "The ifIndex value for the ifEntry represented by this + interface."; + + reference + "RFC 2863: The Interfaces Group MIB - ifIndex"; + } + + leaf phys-address { + type yang:phys-address; + status deprecated; + description + "The interface's address at its protocol sub-layer. For + example, for an 802.x interface, this object normally + contains a Media Access Control (MAC) address. The + interface's media-specific modules must define the bit + and byte ordering and the format of the value of this + object. For interfaces that do not have such an address + (e.g., a serial line), this node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - ifPhysAddress"; + } + + leaf-list higher-layer-if { + type interface-state-ref; + status deprecated; + description + "A list of references to interfaces layered on top of this + interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifStackTable"; + } + + leaf-list lower-layer-if { + type interface-state-ref; + status deprecated; + description + "A list of references to interfaces layered underneath this + interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifStackTable"; + } + + leaf speed { + type yang:gauge64; + units "bits/second"; + status deprecated; + description + "An estimate of the interface's current bandwidth in bits + per second. For interfaces that do not vary in + bandwidth or for those where no accurate estimation can + + be made, this node should contain the nominal bandwidth. + For interfaces that have no concept of bandwidth, this + node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - + ifSpeed, ifHighSpeed"; + } + + container statistics { + status deprecated; + description + "A collection of interface-related statistics objects."; + + leaf discontinuity-time { + type yang:date-and-time; + mandatory true; + status deprecated; + description + "The time on the most recent occasion at which any one or + more of this interface's counters suffered a + discontinuity. If no such discontinuities have occurred + since the last re-initialization of the local management + subsystem, then this node contains the time the local + management subsystem re-initialized itself."; + } + + leaf in-octets { + type yang:counter64; + status deprecated; + description + "The total number of octets received on the interface, + including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInOctets"; + } + + leaf in-unicast-pkts { + type yang:counter64; + status deprecated; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were not addressed to a + multicast or broadcast address at this sub-layer. + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts"; + } + + leaf in-broadcast-pkts { + type yang:counter64; + status deprecated; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a broadcast + address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInBroadcastPkts"; + } + + leaf in-multicast-pkts { + type yang:counter64; + status deprecated; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a multicast + address at this sub-layer. For a MAC-layer protocol, + this includes both Group and Functional addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInMulticastPkts"; + } + + leaf in-discards { + type yang:counter32; + status deprecated; + description + "The number of inbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being deliverable to a higher-layer + protocol. One possible reason for discarding such a + packet could be to free up buffer space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInDiscards"; + } + + leaf in-errors { + type yang:counter32; + status deprecated; + description + "For packet-oriented interfaces, the number of inbound + packets that contained errors preventing them from being + deliverable to a higher-layer protocol. For character- + oriented or fixed-length interfaces, the number of + inbound transmission units that contained errors + preventing them from being deliverable to a higher-layer + protocol. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInErrors"; + } + + leaf in-unknown-protos { + type yang:counter32; + status deprecated; + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } + + leaf out-octets { + type yang:counter64; + status deprecated; + description + "The total number of octets transmitted out of the + interface, including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutOctets"; + } + + leaf out-unicast-pkts { + type yang:counter64; + status deprecated; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were not addressed + to a multicast or broadcast address at this sub-layer, + including those that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts"; + } + + leaf out-broadcast-pkts { + type yang:counter64; + status deprecated; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were addressed to a + broadcast address at this sub-layer, including those + that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutBroadcastPkts"; + } + + leaf out-multicast-pkts { + type yang:counter64; + status deprecated; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were addressed to a + multicast address at this sub-layer, including those + that were discarded or not sent. For a MAC-layer + protocol, this includes both Group and Functional + addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutMulticastPkts"; + } + + leaf out-discards { + type yang:counter32; + status deprecated; + description + "The number of outbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being transmitted. One possible reason + for discarding such a packet could be to free up buffer + space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutDiscards"; + } + + leaf out-errors { + type yang:counter32; + status deprecated; + description + "For packet-oriented interfaces, the number of outbound + packets that could not be transmitted because of errors. + For character-oriented or fixed-length interfaces, the + number of outbound transmission units that could not be + transmitted because of errors. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutErrors"; + } + } + } + } +} diff --git a/models/yang/common/ietf-yang-types.yang b/models/yang/common/ietf-yang-types.yang new file mode 100644 index 0000000000..ee58fa3ab0 --- /dev/null +++ b/models/yang/common/ietf-yang-types.yang @@ -0,0 +1,474 @@ +module ietf-yang-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types"; + prefix "yang"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - yang-identifier + - hex-string + - uuid + - dotted-quad"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of counter and gauge types ***/ + + typedef counter32 { + type uint32; + description + "The counter32 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter32 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter32 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter32. + + In the value set and its semantics, this type is equivalent + to the Counter32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter32 { + type yang:counter32; + default "0"; + description + "The zero-based-counter32 type represents a counter32 + that has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter32 textual convention of the SMIv2."; + reference + "RFC 4502: Remote Network Monitoring Management Information + Base Version 2"; + } + + typedef counter64 { + type uint64; + description + "The counter64 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter64 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter64 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter64. + + In the value set and its semantics, this type is equivalent + to the Counter64 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter64 { + type yang:counter64; + default "0"; + description + "The zero-based-counter64 type represents a counter64 that + has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter64 textual convention of the SMIv2."; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + typedef gauge32 { + type uint32; + description + "The gauge32 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^32-1 (4294967295 decimal), and + the minimum value cannot be smaller than 0. The value of + a gauge32 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge32 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the Gauge32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef gauge64 { + type uint64; + description + "The gauge64 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^64-1 (18446744073709551615), and + the minimum value cannot be smaller than 0. The value of + a gauge64 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge64 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the CounterBasedGauge64 SMIv2 textual convention defined + in RFC 2856"; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + /*** collection of identifier-related types ***/ + + typedef object-identifier { + type string { + pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))' + + '(\.(0|([1-9]\d*)))*'; + } + description + "The object-identifier type represents administratively + assigned names in a registration-hierarchical-name tree. + + Values of this type are denoted as a sequence of numerical + non-negative sub-identifier values. Each sub-identifier + value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers + are separated by single dots and without any intermediate + whitespace. + + The ASN.1 standard restricts the value space of the first + sub-identifier to 0, 1, or 2. Furthermore, the value space + of the second sub-identifier is restricted to the range + 0 to 39 if the first sub-identifier is 0 or 1. Finally, + the ASN.1 standard requires that an object identifier + has always at least two sub-identifiers. The pattern + captures these restrictions. + + Although the number of sub-identifiers is not limited, + module designers should realize that there may be + implementations that stick with the SMIv2 limit of 128 + sub-identifiers. + + This type is a superset of the SMIv2 OBJECT IDENTIFIER type + since it is not restricted to 128 sub-identifiers. Hence, + this type SHOULD NOT be used to represent the SMIv2 OBJECT + IDENTIFIER type; the object-identifier-128 type SHOULD be + used instead."; + reference + "ISO9834-1: Information technology -- Open Systems + Interconnection -- Procedures for the operation of OSI + Registration Authorities: General procedures and top + arcs of the ASN.1 Object Identifier tree"; + } + + typedef object-identifier-128 { + type object-identifier { + pattern '\d*(\.\d*){1,127}'; + } + description + "This type represents object-identifiers restricted to 128 + sub-identifiers. + + In the value set and its semantics, this type is equivalent + to the OBJECT IDENTIFIER type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef yang-identifier { + type string { + length "1..max"; + pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; + pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*'; + } + description + "A YANG identifier string as defined by the 'identifier' + rule in Section 12 of RFC 6020. An identifier must + start with an alphabetic character or an underscore + followed by an arbitrary sequence of alphabetic or + numeric characters, underscores, hyphens, or dots. + + A YANG identifier MUST NOT start with any possible + combination of the lowercase or uppercase character + sequence 'xml'."; + reference + "RFC 6020: YANG - A Data Modeling Language for the Network + Configuration Protocol (NETCONF)"; + } + + /*** collection of types related to date and time***/ + + typedef date-and-time { + type string { + pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' + + '(Z|[\+\-]\d{2}:\d{2})'; + } + description + "The date-and-time type is a profile of the ISO 8601 + standard for representation of dates and times using the + Gregorian calendar. The profile is defined by the + date-time production in Section 5.6 of RFC 3339. + + The date-and-time type is compatible with the dateTime XML + schema type with the following notable exceptions: + + (a) The date-and-time type does not allow negative years. + + (b) The date-and-time time-offset -00:00 indicates an unknown + time zone (see RFC 3339) while -00:00 and +00:00 and Z + all represent the same time zone in dateTime. + + (c) The canonical format (see below) of data-and-time values + differs from the canonical format used by the dateTime XML + schema type, which requires all times to be in UTC using + the time-offset 'Z'. + + This type is not equivalent to the DateAndTime textual + convention of the SMIv2 since RFC 3339 uses a different + separator between full-date and full-time and provides + higher resolution of time-secfrac. + + The canonical format for date-and-time values with a known time + zone uses a numeric time zone offset that is calculated using + the device's configured known offset to UTC time. A change of + the device's offset to UTC time will cause date-and-time values + to change accordingly. Such changes might happen periodically + in case a server follows automatically daylight saving time + (DST) time zone offset changes. The canonical format for + date-and-time values with an unknown time zone (usually + referring to the notion of local time) uses the time-offset + -00:00."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 2579: Textual Conventions for SMIv2 + XSD-TYPES: XML Schema Part 2: Datatypes Second Edition"; + } + + typedef timeticks { + type uint32; + description + "The timeticks type represents a non-negative integer that + represents the time, modulo 2^32 (4294967296 decimal), in + hundredths of a second between two epochs. When a schema + node is defined that uses this type, the description of + the schema node identifies both of the reference epochs. + + In the value set and its semantics, this type is equivalent + to the TimeTicks type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef timestamp { + type yang:timeticks; + description + "The timestamp type represents the value of an associated + timeticks schema node at which a specific occurrence + happened. The specific occurrence must be defined in the + description of any schema node defined using this type. When + the specific occurrence occurred prior to the last time the + associated timeticks attribute was zero, then the timestamp + value is zero. Note that this requires all timestamp values + to be reset to zero when the value of the associated timeticks + attribute reaches 497+ days and wraps around to zero. + + The associated timeticks schema node must be specified + in the description of any schema node using this type. + + In the value set and its semantics, this type is equivalent + to the TimeStamp textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of generic address types ***/ + + typedef phys-address { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + + description + "Represents media- or physical-level addresses represented + as a sequence octets, each octet represented by two hexadecimal + numbers. Octets are separated by colons. The canonical + representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the PhysAddress textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + typedef mac-address { + type string { + pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; + } + description + "The mac-address type represents an IEEE 802 MAC address. + The canonical representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the MacAddress textual convention of the SMIv2."; + reference + "IEEE 802: IEEE Standard for Local and Metropolitan Area + Networks: Overview and Architecture + RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of XML-specific types ***/ + + typedef xpath1.0 { + type string; + description + "This type represents an XPATH 1.0 expression. + + When a schema node is defined that uses this type, the + description of the schema node MUST specify the XPath + context in which the XPath expression is evaluated."; + reference + "XPATH: XML Path Language (XPath) Version 1.0"; + } + + /*** collection of string types ***/ + + typedef hex-string { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "A hexadecimal string with octets represented as hex digits + separated by colons. The canonical representation uses + lowercase characters."; + } + + typedef uuid { + type string { + pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; + } + description + "A Universally Unique IDentifier in the string representation + defined in RFC 4122. The canonical representation uses + lowercase characters. + + The following is an example of a UUID in string representation: + f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + "; + reference + "RFC 4122: A Universally Unique IDentifier (UUID) URN + Namespace"; + } + + typedef dotted-quad { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; + } + description + "An unsigned 32-bit number expressed in the dotted-quad + notation, i.e., four octets written as decimal numbers + and separated with the '.' (full stop) character."; + } +} diff --git a/models/yang/common/openconfig-aaa-radius.yang b/models/yang/common/openconfig-aaa-radius.yang new file mode 100644 index 0000000000..a18b9d68d2 --- /dev/null +++ b/models/yang/common/openconfig-aaa-radius.yang @@ -0,0 +1,186 @@ +submodule openconfig-aaa-radius { + + yang-version "1"; + + belongs-to "openconfig-aaa" { + prefix "oc-aaa"; + } + + // import some basic types + import openconfig-inet-types { prefix oc-inet; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-aaa-types { prefix oc-aaa-types; } + import openconfig-types { prefix oc-types; } + import openconfig-yang-types { prefix oc-yang; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines configuration and operational state data + related to the RADIUS protocol for authentication, + authorization, and accounting."; + + oc-ext:openconfig-version "0.4.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.4.1"; + } + + revision "2017-09-18" { + description + "Updated to use OpenConfig types modules"; + reference "0.3.0"; + } + + revision "2017-07-06" { + description + "Move to oc-inet types, add IETF attribution, add RADIUS + counters, changed password leaf names to indicate hashed"; + reference "0.2.0"; + } + + revision "2017-01-29" { + description + "Initial public release"; + reference "0.1.0"; + } + + // extension statements + + // feature statements + + // identity statements + + identity RADIUS { + base oc-aaa-types:AAA_SERVER_TYPE; + description + "Remote Authentication Dial In User Service (RADIUS) AAA + server"; + reference + "RFC 2865 - Remote Authentication Dial In User Service + (RADIUS)"; + } + + // typedef statements + + // grouping statements + + grouping aaa-radius-server-config { + description + "Configuration data for a RADIUS server"; + + leaf auth-port { + type oc-inet:port-number; + default 1812; + description + "Port number for authentication requests"; + } + + leaf acct-port { + type oc-inet:port-number; + default 1813; + description + "Port number for accounting requests"; + } + + leaf secret-key { + type oc-types:routing-password; + description + "The unencrypted shared key used between the authentication + server and the device."; + } + + leaf source-address { + type oc-inet:ip-address; + description + "Source IP address to use in messages to the RADIUS server"; + } + + leaf retransmit-attempts { + type uint8; + description + "Number of times the system may resend a request to the + RADIUS server when it is unresponsive"; + } + } + + grouping aaa-radius-server-state { + description + "Operational state data for a RADIUS server"; + + container counters { + description + "A collection of RADIUS related state objects."; + + leaf retried-access-requests { + type oc-yang:counter64; + description + "Retransmitted Access-Request messages."; + } + + leaf access-accepts { + type oc-yang:counter64; + description + "Received Access-Accept messages."; + } + + leaf access-rejects { + type oc-yang:counter64; + description + "Received Access-Reject messages."; + } + + leaf timeout-access-requests { + type oc-yang:counter64; + description + "Access-Request messages that have timed-out, + requiring retransmission."; + } + } + } + + grouping aaa-radius-server-top { + description + "Top-level grouping for RADIUS server data"; + + container radius { + description + "Top-level container for RADIUS server data"; + + container config { + description + "Configuration data for RADIUS servers"; + + uses aaa-radius-server-config; + } + + container state { + + config false; + + description + "Operational state data for RADIUS servers"; + + uses aaa-radius-server-config; + uses aaa-radius-server-state; + } + } + } + + // data definition statements + + // augment statements + + // rpc statements + + // notification statements + +} diff --git a/models/yang/common/openconfig-aaa-tacacs.yang b/models/yang/common/openconfig-aaa-tacacs.yang new file mode 100644 index 0000000000..1320bd0cf5 --- /dev/null +++ b/models/yang/common/openconfig-aaa-tacacs.yang @@ -0,0 +1,142 @@ +submodule openconfig-aaa-tacacs { + + yang-version "1"; + + belongs-to "openconfig-aaa" { + prefix "oc-aaa"; + } + + // import some basic types + import openconfig-inet-types { prefix oc-inet; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-aaa-types { prefix oc-aaa-types; } + import openconfig-types { prefix oc-types; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines configuration and operational state data + related to the TACACS+ protocol for authentication, + authorization, and accounting."; + + oc-ext:openconfig-version "0.4.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.4.1"; + } + + revision "2017-09-18" { + description + "Updated to use OpenConfig types modules"; + reference "0.3.0"; + } + + revision "2017-07-06" { + description + "Move to oc-inet types, add IETF attribution, add RADIUS + counters, changed password leaf names to indicate hashed"; + reference "0.2.0"; + } + + revision "2017-01-29" { + description + "Initial public release"; + reference "0.1.0"; + } + + // extension statements + + // feature statements + + // identity statements + + identity TACACS { + base oc-aaa-types:AAA_SERVER_TYPE; + description + "Terminal Access Controller Access Control System (TACACS+) + AAA server"; + reference + "The TACACS+ Protocol (draft-ietf-opsawg-tacacs-05) + RFC 1492 - An Access Control Protocol, Sometimes Called + TACACS"; + } + + // typedef statements + + // grouping statements + + grouping aaa-tacacs-server-config { + description + "Configuration data for a TACACS+ server"; + + leaf port { + type oc-inet:port-number; + default 49; + description + "The port number on which to contact the TACACS server"; + } + + leaf secret-key { + type oc-types:routing-password; + description + "The unencrypted shared key used between the authentication + server and the device."; + } + + leaf source-address { + type oc-inet:ip-address; + description + "Source IP address to use in messages to the TACACS server"; + } + } + + grouping aaa-tacacs-server-state { + description + "Operational state data for a TACACS+ server"; + } + + grouping aaa-tacacs-server-top { + description + "Top-level grouping for TACACS+ sever data"; + + container tacacs { + description + "Top-level container for TACACS+ server data"; + + container config { + description + "Configuration data for TACACS+ server"; + + uses aaa-tacacs-server-config; + } + + container state { + + config false; + + description + "Operational state data for TACACS+ server"; + + uses aaa-tacacs-server-config; + uses aaa-tacacs-server-state; + } + } + } + + // data definition statements + + // augment statements + + // rpc statements + + // notification statements + +} diff --git a/models/yang/common/openconfig-aaa-types.yang b/models/yang/common/openconfig-aaa-types.yang new file mode 100644 index 0000000000..8385eca79e --- /dev/null +++ b/models/yang/common/openconfig-aaa-types.yang @@ -0,0 +1,172 @@ +module openconfig-aaa-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/aaa/types"; + + prefix "oc-aaa-types"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines shared types for data related to AAA + (authentication, authorization, accounting)."; + + oc-ext:openconfig-version "0.4.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.4.1"; + } + + revision "2018-04-12" { + description + "Add when conditions, correct identities"; + reference "0.4.0"; + } + + revision "2017-09-18" { + description + "Updated to use OpenConfig types modules"; + reference "0.3.0"; + } + + revision "2017-07-06" { + description + "Move to oc-inet types, add IETF attribution, add RADIUS + counters, changed password leaf names to indicate hashed"; + reference "0.2.0"; + } + + revision "2017-01-29" { + description + "Initial public release"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // identity statements + + identity AAA_SERVER_TYPE { + description + "Base identity for types of AAA servers"; + } + + + identity SYSTEM_DEFINED_ROLES { + description + "Base identity for system_defined roles that can be assigned + to users."; + } + + identity SYSTEM_ROLE_ADMIN { + base SYSTEM_DEFINED_ROLES; + description + "Built-in role that allows the equivalent of superuser + permission for all configuration and operational commands + on the device."; + } + + identity AAA_ACCOUNTING_EVENT_TYPE { + description + "Base identity for specifying events types that should be + sent to AAA server for accounting"; + } + + identity AAA_ACCOUNTING_EVENT_COMMAND { + base AAA_ACCOUNTING_EVENT_TYPE; + description + "Specifies interactive command events for AAA accounting"; + } + + identity AAA_ACCOUNTING_EVENT_LOGIN { + base AAA_ACCOUNTING_EVENT_TYPE; + description + "Specifies login events for AAA accounting"; + } + + identity AAA_AUTHORIZATION_EVENT_TYPE { + description + "Base identity for specifying activities that should be + sent to AAA server for authorization"; + } + + identity AAA_AUTHORIZATION_EVENT_COMMAND { + base AAA_AUTHORIZATION_EVENT_TYPE; + description + "Specifies interactive command events for AAA authorization"; + } + + identity AAA_AUTHORIZATION_EVENT_CONFIG { + base AAA_AUTHORIZATION_EVENT_TYPE; + description + "Specifies configuration (e.g., EXEC) events for AAA + authorization"; + } + + identity AAA_METHOD_TYPE { + description + "Base identity to define well-known methods for AAA + operations"; + } + + identity TACACS_ALL { + base AAA_METHOD_TYPE; + description + "The group of all TACACS+ servers."; + } + + identity RADIUS_ALL { + base AAA_METHOD_TYPE; + description + "The group of all RADIUS servers."; + } + + identity LOCAL { + base AAA_METHOD_TYPE; + description + "Locally configured method for AAA operations."; + } + + + // typedef statements + + typedef crypt-password-type { + type string; + description + "A password that is hashed based on the hash algorithm + indicated by the prefix in the string. The string + takes the following form, based on the Unix crypt function: + + $[$=(,=)*][$[$]] + + Common hash functions include: + + id | hash function + ---+--------------- + 1 | MD5 + 2a| Blowfish + 2y| Blowfish (correct handling of 8-bit chars) + 5 | SHA-256 + 6 | SHA-512 + + These may not all be supported by a target device."; + } + + +} diff --git a/models/yang/common/openconfig-aaa.yang b/models/yang/common/openconfig-aaa.yang new file mode 100644 index 0000000000..7a2fffa003 --- /dev/null +++ b/models/yang/common/openconfig-aaa.yang @@ -0,0 +1,822 @@ +module openconfig-aaa { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/aaa"; + + prefix "oc-aaa"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + import openconfig-inet-types { prefix oc-inet; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-aaa-types { prefix oc-aaa-types; } + + include openconfig-aaa-tacacs; + include openconfig-aaa-radius; + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines configuration and operational state data + related to authorization, authentication, and accounting (AAA) + management. + + Portions of this model reuse data definitions or structure from + RFC 7317 - A YANG Data Model for System Management"; + + oc-ext:openconfig-version "0.4.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.4.1"; + } + + revision "2018-04-12" { + description + "Add when conditions, correct identities"; + reference "0.4.0"; + } + + revision "2017-09-18" { + description + "Updated to use OpenConfig types modules"; + reference "0.3.0"; + } + + revision "2017-07-06" { + description + "Move to oc-inet types, add IETF attribution, add RADIUS + counters, changed password leaf names to indicate hashed"; + reference "0.2.0"; + } + + revision "2017-01-29" { + description + "Initial public release"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // identity statements + + // grouping statements + grouping aaa-servergroup-common-config { + description + "Configuration data for AAA server groups"; + + leaf name { + type string; + description + "Name for the server group"; + } + + leaf type { + type identityref { + base oc-aaa-types:AAA_SERVER_TYPE; + } + description + "AAA server type -- all servers in the group must be of this + type"; + } + } + + grouping aaa-servergroup-common-state { + description + "Operational state data for AAA server groups"; + + //TODO: add list of group members as opstate + } + + grouping aaa-servergroup-common-top { + description + "Top-level grouping for AAA server groups"; + + container server-groups { + description + "Enclosing container for AAA server groups"; + + list server-group { + key "name"; + description + "List of AAA server groups. All servers in a group + must have the same type as indicated by the server + type."; + + leaf name { + type leafref { + path "../config/name"; + } + description + "Reference to configured name of the server group"; + } + + container config { + description + "Configuration data for each server group"; + + uses aaa-servergroup-common-config; + } + + container state { + config false; + + description + "Operational state data for each server group"; + + uses aaa-servergroup-common-config; + uses aaa-servergroup-common-state; + } + + uses aaa-server-top; + } + } + } + + grouping aaa-server-config { + description + "Common configuration data for AAA servers"; + + leaf name { + type string; + description + "Name assigned to the server"; + } + + + leaf address { + type oc-inet:ip-address; + description "Address of the authentication server"; + } + + leaf timeout { + type uint16; + units seconds; + description + "Set the timeout in seconds on responses from the AAA + server"; + } + } + + grouping aaa-server-state { + description + "Common operational state data for AAA servers"; + + leaf connection-opens { + type oc-yang:counter64; + description + "Number of new connection requests sent to the server, e.g. + socket open"; + } + + leaf connection-closes { + type oc-yang:counter64; + description + "Number of connection close requests sent to the server, e.g. + socket close"; + } + + leaf connection-aborts { + type oc-yang:counter64; + description + "Number of aborted connections to the server. These do + not include connections that are close gracefully."; + } + + leaf connection-failures { + type oc-yang:counter64; + description + "Number of connection failures to the server"; + } + + leaf connection-timeouts { + type oc-yang:counter64; + description + "Number of connection timeouts to the server"; + } + + leaf messages-sent { + type oc-yang:counter64; + description + "Number of messages sent to the server"; + } + + leaf messages-received { + type oc-yang:counter64; + description + "Number of messages received by the server"; + } + + leaf errors-received { + type oc-yang:counter64; + description + "Number of error messages received from the server"; + } + + } + + grouping aaa-server-top { + description + "Top-level grouping for list of AAA servers"; + + container servers { + description + "Enclosing container the list of servers"; + + list server { + key "address"; + description + "List of AAA servers"; + + leaf address { + type leafref { + path "../config/address"; + } + description + "Reference to the configured address of the AAA server"; + } + + container config { + description + "Configuration data "; + + uses aaa-server-config; + } + + container state { + config false; + + description + "Operational state data "; + + uses aaa-server-config; + uses aaa-server-state; + } + + uses aaa-tacacs-server-top { + when "../../config/type = 'oc-aaa-types:TACACS'"; + } + + uses aaa-radius-server-top { + when "../../config/type = 'oc-aaa-types:RADIUS'"; + } + } + } + } + + grouping aaa-admin-config { + description + "Configuration data for the system built-in + administrator / root user account"; + + leaf admin-password { + type string; + oc-ext:openconfig-hashed-value; + description + "The admin/root password, supplied as a cleartext string. + The system should hash and only store the password as a + hashed value."; + } + + leaf admin-password-hashed { + type oc-aaa-types:crypt-password-type; + description + "The admin/root password, supplied as a hashed value + using the notation described in the definition of the + crypt-password-type."; + } + } + + grouping aaa-admin-state { + description + "Operational state data for the root user"; + + leaf admin-username { + type string; + description + "Name of the administrator user account, e.g., admin, root, + etc."; + } + } + + grouping aaa-authentication-admin-top { + description + "Top-level grouping for root user configuration and state + data"; + + container admin-user { + description + "Top-level container for the system root or admin user + configuration and operational state"; + + container config { + description + "Configuration data for the root user account"; + + uses aaa-admin-config; + } + + container state { + config false; + + description + "Operational state data for the root user account"; + + uses aaa-admin-config; + uses aaa-admin-state; + } + } + } + grouping aaa-authentication-user-config { + description + "Configuration data for local users"; + + leaf username { + type string; + description + "Assigned username for this user"; + } + + leaf password { + type string; + oc-ext:openconfig-hashed-value; + description + "The user password, supplied as cleartext. The system + must hash the value and only store the hashed value."; + } + + leaf password-hashed { + type oc-aaa-types:crypt-password-type; + description + "The user password, supplied as a hashed value + using the notation described in the definition of the + crypt-password-type."; + } + + leaf ssh-key { + type string; + description + "SSH public key for the user (RSA or DSA)"; + } + + leaf role { + type union { + type string; + type identityref { + base oc-aaa-types:SYSTEM_DEFINED_ROLES; + } + } + description + "Role assigned to the user. The role may be supplied + as a string or a role defined by the SYSTEM_DEFINED_ROLES + identity."; + } + } + + grouping aaa-authentication-user-state { + description + "Operational state data for local users"; + } + + grouping aaa-authentication-user-top { + description + "Top-level grouping for local users"; + + container users { + description + "Enclosing container list of local users"; + + list user { + key "username"; + description + "List of local users on the system"; + + leaf username { + type leafref { + path "../config/username"; + } + description + "References the configured username for the user"; + } + + container config { + description + "Configuration data for local users"; + + uses aaa-authentication-user-config; + } + + container state { + config false; + + description + "Operational state data for local users"; + + uses aaa-authentication-user-config; + uses aaa-authentication-user-state; + } + } + + } + } + + grouping aaa-accounting-methods-common { + description + "Common definitions for accounting methods"; + + leaf-list accounting-method { + type union { + type identityref { + base oc-aaa-types:AAA_METHOD_TYPE; + } + type string; + //TODO: in YANG 1.1 this should be converted to a leafref to + //point to the server group name. + } + ordered-by user; + description + "An ordered list of methods used for AAA accounting for this + event type. The method is defined by the destination for + accounting data, which may be specified as the group of + all TACACS+/RADIUS servers, a defined server group, or + the local system."; + } + } + + + grouping aaa-accounting-events-config { + description + "Configuration data for AAA accounting events"; + + leaf event-type { + type identityref { + base oc-aaa-types:AAA_ACCOUNTING_EVENT_TYPE; + } + description + "The type of activity to record at the AAA accounting + server"; + } + + leaf record { + type enumeration { + enum START_STOP { + description + "Send START record to the accounting server at the + beginning of the activity, and STOP record at the + end of the activity."; + } + enum STOP { + description + "Send STOP record to the accounting server when the + user activity completes"; + } + } + description + "Type of record to send to the accounting server for this + activity type"; + } + } + + grouping aaa-accounting-events-state { + description + "Operational state data for accounting events"; + } + + grouping aaa-accounting-events-top { + description + "Top-level grouping for accounting events"; + + container events { + description + "Enclosing container for defining handling of events + for accounting"; + + list event { + key "event-type"; + description + "List of events subject to accounting"; + + leaf event-type { + type leafref { + path "../config/event-type"; + } + description + "Reference to the event-type being logged at the + accounting server"; + } + + container config { + description + "Configuration data for accounting events"; + + uses aaa-accounting-events-config; + } + + container state { + config false; + + description + "Operational state data for accounting events"; + + uses aaa-accounting-events-config; + uses aaa-accounting-events-state; + } + } + } + } + + grouping aaa-accounting-config { + description + "Configuration data for event accounting"; + + uses aaa-accounting-methods-common; + + } + + grouping aaa-accounting-state { + description + "Operational state data for event accounting services"; + } + + grouping aaa-accounting-top { + description + "Top-level grouping for user activity accounting"; + + container accounting { + description + "Top-level container for AAA accounting"; + + container config { + description + "Configuration data for user activity accounting."; + + uses aaa-accounting-config; + } + + container state { + config false; + + description + "Operational state data for user accounting."; + + uses aaa-accounting-config; + uses aaa-accounting-state; + } + + uses aaa-accounting-events-top; + + } + } + + grouping aaa-authorization-methods-config { + description + "Common definitions for authorization methods for global + and per-event type"; + + leaf-list authorization-method { + type union { + type identityref { + base oc-aaa-types:AAA_METHOD_TYPE; + } + type string; + } + ordered-by user; + description + "Ordered list of methods for authorizing commands. The first + method that provides a response (positive or negative) should + be used. The list may contain a well-defined method such + as the set of all TACACS or RADIUS servers, or the name of + a defined AAA server group. The system must validate + that the named server group exists."; + } + } + + grouping aaa-authorization-events-config { + description + "Configuration data for AAA authorization events"; + + leaf event-type { + type identityref { + base oc-aaa-types:AAA_AUTHORIZATION_EVENT_TYPE; + } + description + "The type of event to record at the AAA authorization + server"; + } + } + + grouping aaa-authorization-events-state { + description + "Operational state data for AAA authorization events"; + } + + grouping aaa-authorization-events-top { + description + "Top-level grouping for authorization events"; + + container events { + description + "Enclosing container for the set of events subject + to authorization"; + + list event { + key "event-type"; + description + "List of events subject to AAA authorization"; + + leaf event-type { + type leafref { + path "../config/event-type"; + } + description + "Reference to the event-type list key"; + } + + container config { + description + "Configuration data for each authorized event"; + + uses aaa-authorization-events-config; + } + + container state { + config false; + + description + "Operational state data for each authorized activity"; + + uses aaa-authorization-events-config; + uses aaa-authorization-events-state; + } + } + } + } + + grouping aaa-authorization-config { + description + "Configuration data for AAA authorization"; + + uses aaa-authorization-methods-config; + } + + grouping aaa-authorization-state { + description + "Operational state data for AAA authorization"; + } + + grouping aaa-authorization-top { + description + "Top-level grouping for AAA authorization"; + + container authorization { + description + "Top-level container for AAA authorization configuration + and operational state data"; + + container config { + description + "Configuration data for authorization based on AAA + methods"; + + uses aaa-authorization-config; + } + + container state { + config false; + + description + "Operational state data for authorization based on AAA"; + + uses aaa-authorization-config; + uses aaa-authorization-state; + } + + uses aaa-authorization-events-top; + + } + } + + grouping aaa-authentication-config { + description + "Configuration data for global authentication"; + + leaf-list authentication-method { + type union { + type identityref { + base oc-aaa-types:AAA_METHOD_TYPE; + } + type string; + //TODO: string should be a leafref to a defined + //server group. this will be possible in YANG 1.1 + //type leafref { + //path "/aaa/server-groups/server-group/config/name"; + //} + } + ordered-by user; + description + "Ordered list of authentication methods for users. This + can be either a reference to a server group, or a well- + defined designation in the AAA_METHOD_TYPE identity. If + authentication fails with one method, the next defined + method is tried -- failure of all methods results in the + user being denied access."; + } + } + + grouping aaa-authentication-state { + description + "Operational state data for global authentication"; + } + + grouping aaa-authentication-top { + description + "Top-level grouping for top-level authentication"; + + container authentication { + description + "Top-level container for global authentication data"; + + container config { + description + "Configuration data for global authentication services"; + + uses aaa-authentication-config; + } + + container state { + config false; + + description + "Operational state data for global authentication + services"; + + uses aaa-authentication-config; + uses aaa-authentication-state; + } + + uses aaa-authentication-admin-top; + uses aaa-authentication-user-top; + } + } + + grouping aaa-config { + description + "Configuration data for top level AAA"; + } + + grouping aaa-state { + description + "Operational state data for top level AAA"; + } + + grouping aaa-top { + description + "Top-level grouping for AAA services"; + + container aaa { + description + "Top-level container for AAA services"; + + container config { + description + "Configuration data for top level AAA services"; + + uses aaa-config; + } + + container state { + config false; + + description + "Operational state data for top level AAA services "; + + uses aaa-config; + uses aaa-state; + } + + uses aaa-authentication-top; + uses aaa-authorization-top; + uses aaa-accounting-top; + uses aaa-servergroup-common-top; + + } + } + + + + // data definition statements + + +} diff --git a/models/yang/common/openconfig-alarm-types.yang b/models/yang/common/openconfig-alarm-types.yang new file mode 100644 index 0000000000..c4617b5e6b --- /dev/null +++ b/models/yang/common/openconfig-alarm-types.yang @@ -0,0 +1,150 @@ +module openconfig-alarm-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/alarms/types"; + + prefix "oc-alarm-types"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines operational state data related to alarms + that the device is reporting. + + This model reuses some data items defined in the draft IETF + YANG Alarm Module: + https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02 + + Portions of this code were derived from the draft IETF YANG Alarm + Module. Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "0.2.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.2.1"; + } + + revision "2018-01-16" { + description + "Moved alarm identities into separate types module"; + reference "0.2.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // identity statements + identity OPENCONFIG_ALARM_TYPE_ID { + description + "Base identity for alarm type ID profiles"; + } + + identity AIS { + base OPENCONFIG_ALARM_TYPE_ID; + description + "Defines an alarm indication signal type of alarm"; + } + + identity EQPT { + base OPENCONFIG_ALARM_TYPE_ID; + description + "Defines an equipment related type of alarm that is specific + to the physical hardware"; + } + + identity LOS { + base OPENCONFIG_ALARM_TYPE_ID; + description + "Defines a loss of signal type of alarm"; + } + + identity OTS { + base OPENCONFIG_ALARM_TYPE_ID; + description + "Defines a optical transport signal type of alarm"; + } + + identity OPENCONFIG_ALARM_SEVERITY { + description + "Base identity for alarm severity profiles. Derived + identities are based on contents of the draft + IETF YANG Alarm Module"; + reference + "IETF YANG Alarm Module: Draft - typedef severity + https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02"; + + } + + identity UNKNOWN { + base OPENCONFIG_ALARM_SEVERITY; + description + "Indicates that the severity level could not be determined. + This level SHOULD be avoided."; + } + + identity MINOR { + base OPENCONFIG_ALARM_SEVERITY; + description + "Indicates the existence of a non-service affecting fault + condition and that corrective action should be taken in + order to prevent a more serious (for example, service + affecting) fault. Such a severity can be reported, for + example, when the detected alarm condition is not currently + degrading the capacity of the resource"; + } + + identity WARNING { + base OPENCONFIG_ALARM_SEVERITY; + description + "Indicates the detection of a potential or impending service + affecting fault, before any significant effects have been felt. + Action should be taken to further diagnose (if necessary) and + correct the problem in order to prevent it from becoming a more + serious service affecting fault."; + } + + identity MAJOR { + base OPENCONFIG_ALARM_SEVERITY; + description + "Indicates that a service affecting condition has developed + and an urgent corrective action is required. Such a severity + can be reported, for example, when there is a severe + degradation in the capability of the resource and its full + capability must be restored."; + } + + identity CRITICAL { + base OPENCONFIG_ALARM_SEVERITY; + description + "Indicates that a service affecting condition has occurred + and an immediate corrective action is required. Such a + severity can be reported, for example, when a resource becomes + totally out of service and its capability must be restored."; + } + +} \ No newline at end of file diff --git a/models/yang/common/openconfig-alarms.yang b/models/yang/common/openconfig-alarms.yang new file mode 100644 index 0000000000..5bcc563149 --- /dev/null +++ b/models/yang/common/openconfig-alarms.yang @@ -0,0 +1,231 @@ +module openconfig-alarms { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/alarms"; + + prefix "oc-alarms"; + + // import some basic types + import openconfig-alarm-types { prefix oc-alarm-types; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-types { prefix oc-types; } + import openconfig-platform { prefix oc-platform; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines operational state data related to alarms + that the device is reporting. + + This model reuses some data items defined in the draft IETF + YANG Alarm Module: + https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02 + + Portions of this code were derived from the draft IETF YANG Alarm + Module. Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "0.3.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.3.1"; + } + + revision "2018-01-16" { + description + "Moved alarm identities into separate types module"; + reference "0.3.0"; + } + + revision "2018-01-10" { + description + "Make alarms list read only"; + reference "0.2.0"; + } + + revision "2017-08-24" { + description + "Initial public release"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // grouping statements + + grouping alarm-state { + description + "Operational state data for device alarms"; + + leaf id { + type string; + description + "Unique ID for the alarm -- this will not be a + configurable parameter on many implementations"; + } + + leaf resource { + type string; + description + "The item that is under alarm within the device. The + resource may be a reference to an item which is + defined elsewhere in the model. For example, it + may be a platform/component, interfaces/interface, + terminal-device/logical-channels/channel, etc. In this + case the system should match the name of the referenced + item exactly. The referenced item could alternatively be + the path of the item within the model."; + reference + "IETF YANG Alarm Module: Draft - typedef resource + https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02"; + } + + leaf text { + type string; + description + "The string used to inform operators about the alarm. This + MUST contain enough information for an operator to be able + to understand the problem. If this string contains structure, + this format should be clearly documented for programs to be + able to parse that information"; + reference + "IETF YANG Alarm Module: Draft - typedef alarm-text + https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02"; + } + + leaf time-created { + type oc-types:timeticks64; + description + "The time at which the alarm was raised by the system. + This value is expressed as nanoseconds since the Unix Epoch"; + } + + leaf severity { + type identityref { + base oc-alarm-types:OPENCONFIG_ALARM_SEVERITY; + } + description + "The severity level indicating the criticality and impact + of the alarm"; + reference + "IETF YANG Alarm Module: Draft - typedef severity + https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02"; + } + + leaf type-id { + type union { + type string; + type identityref { + base oc-alarm-types:OPENCONFIG_ALARM_TYPE_ID; + } + } + description + "The abbreviated name of the alarm, for example LOS, + EQPT, or OTS. Also referred to in different systems as + condition type, alarm identifier, or alarm mnemonic. It + is recommended to use the OPENCONFIG_ALARM_TYPE_ID + identities where possible and only use the string type + when the desired identityref is not yet defined"; + reference + "IETF YANG Alarm Module: Draft - typedef alarm-type-id + https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02"; + } + } + + grouping alarm-config { + description + "Configuration data for device alarms"; + } + + grouping alarms-top { + description + "Top-level grouping for device alarms"; + + container alarms { + description + "Top-level container for device alarms"; + + config false; + + list alarm { + key "id"; + description + "List of alarms, keyed by a unique id"; + + leaf id { + type leafref { + path "../state/id"; + } + + description + "References the unique alarm id"; + } + + container config { + description + "Configuration data for each alarm"; + + uses alarm-config; + } + + container state { + config false; + + description + "Operational state data for a device alarm"; + + uses alarm-config; + uses alarm-state; + } + } + } + } + + + // augments + + augment "/oc-platform:components/oc-platform:component/oc-platform:state" { + description + "Adds specific alarms related to a component."; + + leaf equipment-failure { + type boolean; + default "false"; + description + "If true, the hardware indicates that the component's physical equipment + has failed"; + } + + leaf equipment-mismatch { + type boolean; + default "false"; + description + "If true, the hardware indicates that the component inserted into the + affected component's physical location is of a different type than what + is configured"; + } + } + +} diff --git a/models/yang/common/openconfig-extensions.yang b/models/yang/common/openconfig-extensions.yang new file mode 100644 index 0000000000..361e55426d --- /dev/null +++ b/models/yang/common/openconfig-extensions.yang @@ -0,0 +1,175 @@ +module openconfig-extensions { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/openconfig-ext"; + + prefix "oc-ext"; + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module provides extensions to the YANG language to allow + OpenConfig specific functionality and meta-data to be defined."; + + revision "2018-10-17" { + description + "Add extension for regular expression type."; + reference "0.4.0"; + } + + revision "2017-04-11" { + description + "rename password type to 'hashed' and clarify description"; + reference "0.3.0"; + } + + revision "2017-01-29" { + description + "Added extension for annotating encrypted values."; + reference "0.2.0"; + } + + revision "2015-10-09" { + description + "Initial OpenConfig public release"; + reference "0.1.0"; + } + + + // extension statements + extension openconfig-version { + argument "semver" { + yin-element false; + } + description + "The OpenConfig version number for the module. This is + expressed as a semantic version number of the form: + x.y.z + where: + * x corresponds to the major version, + * y corresponds to a minor version, + * z corresponds to a patch version. + This version corresponds to the model file within which it is + defined, and does not cover the whole set of OpenConfig models. + Where several modules are used to build up a single block of + functionality, the same module version is specified across each + file that makes up the module. + + A major version number of 0 indicates that this model is still + in development (whether within OpenConfig or with industry + partners), and is potentially subject to change. + + Following a release of major version 1, all modules will + increment major revision number where backwards incompatible + changes to the model are made. + + The minor version is changed when features are added to the + model that do not impact current clients use of the model. + + The patch-level version is incremented when non-feature changes + (such as bugfixes or clarifications to human-readable + descriptions that do not impact model functionality) are made + that maintain backwards compatibility. + + The version number is stored in the module meta-data."; + } + + extension openconfig-hashed-value { + description + "This extension provides an annotation on schema nodes to + indicate that the corresponding value should be stored and + reported in hashed form. + + Hash algorithms are by definition not reversible. Clients + reading the configuration or applied configuration for the node + should expect to receive only the hashed value. Values written + in cleartext will be hashed. This annotation may be used on + nodes such as secure passwords in which the device never reports + a cleartext value, even if the input is provided as cleartext."; + } + + extension regexp-posix { + description + "This extension indicates that the regular expressions included + within the YANG module specified are conformant with the POSIX + regular expression format rather than the W3C standard that is + specified by RFC6020 and RFC7950."; + } + + extension telemetry-on-change { + description + "The telemetry-on-change annotation is specified in the context + of a particular subtree (container, or list) or leaf within the + YANG schema. Where specified, it indicates that the value stored + by the nodes within the context change their value only in response + to an event occurring. The event may be local to the target, for + example - a configuration change, or external - such as the failure + of a link. + + When a telemetry subscription allows the target to determine whether + to export the value of a leaf in a periodic or event-based fashion + (e.g., TARGET_DEFINED mode in gNMI), leaves marked as + telemetry-on-change should only be exported when they change, + i.e., event-based."; + } + + extension telemetry-atomic { + description + "The telemetry-atomic annotation is specified in the context of + a subtree (containre, or list), and indicates that all nodes + within the subtree are always updated together within the data + model. For example, all elements under the subtree may be updated + as a result of a new alarm being raised, or the arrival of a new + protocol message. + + Transport protocols may use the atomic specification to determine + optimisations for sending or storing the corresponding data."; + } + + extension operational { + description + "The operational annotation is specified in the context of a + grouping, leaf, or leaf-list within a YANG module. It indicates + that the nodes within the context are derived state on the device. + + OpenConfig data models divide nodes into the following three categories: + + - intended configuration - these are leaves within a container named + 'config', and are the writable configuration of a target. + - applied configuration - these are leaves within a container named + 'state' and are the currently running value of the intended configuration. + - derived state - these are the values within the 'state' container which + are not part of the applied configuration of the device. Typically, they + represent state values reflecting underlying operational counters, or + protocol statuses."; + } + + extension catalog-organization { + argument "org" { + yin-element false; + } + description + "This extension specifies the organization name that should be used within + the module catalogue on the device for the specified YANG module. It stores + a pithy string where the YANG organization statement may contain more + details."; + } + + extension origin { + argument "origin" { + yin-element false; + } + description + "This extension specifies the name of the origin that the YANG module + falls within. This allows multiple overlapping schema trees to be used + on a single network element without requiring module based prefixing + of paths."; + } +} diff --git a/models/yang/common/openconfig-if-aggregate.yang b/models/yang/common/openconfig-if-aggregate.yang new file mode 100644 index 0000000000..a8f18f7f82 --- /dev/null +++ b/models/yang/common/openconfig-if-aggregate.yang @@ -0,0 +1,232 @@ +module openconfig-if-aggregate { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/interfaces/aggregate"; + + prefix "oc-lag"; + + // import some basic types + import openconfig-interfaces { prefix oc-if; } + import openconfig-if-ethernet { prefix oc-eth; } + import iana-if-type { prefix ift; } + import openconfig-if-types { prefix oc-ift; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "Model for managing aggregated (aka bundle, LAG) interfaces."; + + oc-ext:openconfig-version "2.3.2"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "2.3.2"; + } + + revision "2018-03-23" { + description + "Fix/cleanup when statements in aggregates model."; + reference "2.3.1"; + } + + revision "2018-01-05" { + description + "Add logical loopback to interface."; + reference "2.3.0"; + } + + revision "2017-12-22" { + description + "Add IPv4 proxy ARP configuration."; + reference "2.2.0"; + } + + revision "2017-12-21" { + description + "Added IPv6 router advertisement configuration."; + reference "2.1.0"; + } + + revision "2017-07-14" { + description + "Added Ethernet/IP state data; Add dhcp-client; + migrate to OpenConfig types modules; Removed or + renamed opstate values"; + reference "2.0.0"; + } + + revision "2016-12-22" { + description + "Fixes to Ethernet interfaces model"; + reference "1.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // extension statements + + // feature statements + + // identity statements + + // typedef statements + + typedef aggregation-type { + type enumeration { + enum LACP { + description "LAG managed by LACP"; + } + enum STATIC { + description "Statically configured bundle / LAG"; + } + } + description + "Type to define the lag-type, i.e., how the LAG is + defined and managed"; + } + + // grouping statements + + + grouping aggregation-logical-config { + description + "Configuration data for aggregate interfaces"; + + + leaf lag-type { + type aggregation-type; + description + "Sets the type of LAG, i.e., how it is + configured / maintained"; + } + + leaf min-links { + type uint16; + description + "Specifies the mininum number of member + interfaces that must be active for the aggregate interface + to be available"; + } + } + + grouping aggregation-logical-state { + description + "Operational state data for aggregate interfaces"; + + leaf lag-speed { + type uint32; + units Mbps; + description + "Reports effective speed of the aggregate interface, + based on speed of active member interfaces"; + } + + leaf-list member { + when "../../config/lag-type = 'STATIC'" { + description + "The simple list of member interfaces is active + when the aggregate is statically configured"; + } + type oc-if:base-interface-ref; + description + "List of current member interfaces for the aggregate, + expressed as references to existing interfaces"; + } + } + + grouping aggregation-logical-top { + description "Top-level data definitions for LAGs"; + + container aggregation { + + description + "Options for logical interfaces representing + aggregates"; + + container config { + description + "Configuration variables for logical aggregate / + LAG interfaces"; + + uses aggregation-logical-config; + } + + container state { + + config false; + description + "Operational state variables for logical + aggregate / LAG interfaces"; + + uses aggregation-logical-config; + uses aggregation-logical-state; + + } + } + } + + grouping ethernet-if-aggregation-config { + description + "Adds configuration items for Ethernet interfaces + belonging to a logical aggregate / LAG"; + + leaf aggregate-id { + type leafref { + path "/oc-if:interfaces/oc-if:interface/oc-if:name"; + } + description + "Specify the logical aggregate interface to which + this interface belongs"; + } + } + + // data definition statements + + // augment statements + + augment "/oc-if:interfaces/oc-if:interface" { + + description "Adds LAG configuration to the interface module"; + + uses aggregation-logical-top { + when "oc-if:state/oc-if:type = 'ift:ieee8023adLag' or " + + "oc-if:state/oc-if:type = 'oc-ift:IF_AGGREGATE'" { + description + "active when the interface is set to type LAG"; + } + } + } + + augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" + + "oc-eth:config" { + description + "Adds LAG settings to individual Ethernet interfaces"; + + uses ethernet-if-aggregation-config; + } + + augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" + + "oc-eth:state" { + description + "Adds LAG settings to individual Ethernet interfaces"; + + uses ethernet-if-aggregation-config; + } + + // rpc statements + + // notification statements + +} diff --git a/models/yang/common/openconfig-if-ethernet-ext.yang b/models/yang/common/openconfig-if-ethernet-ext.yang new file mode 100644 index 0000000000..f64773b22d --- /dev/null +++ b/models/yang/common/openconfig-if-ethernet-ext.yang @@ -0,0 +1,117 @@ +module openconfig-if-ethernet-ext { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/interfaces/ethernet-ext"; + + prefix "oc-eth-ext"; + + // import some basic types + import openconfig-interfaces { prefix oc-if; } + import openconfig-if-ethernet { prefix oc-eth; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-extensions { prefix oc-ext; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module adds extensions to the base ethernet configuration + and operational state model to support additional use cases."; + + oc-ext:openconfig-version "0.1.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.1.1"; + } + + revision "2018-07-10" { + description + "Initial version of Ethernet extensions module to add frame + size distribution stats"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + grouping ethernet-in-frames-size-dist { + description + "Grouping for defining the size distribution of the frames + received"; + + container in-distribution { + description + "The size distribution of the received frames."; + + leaf in-frames-64-octets { + type oc-yang:counter64; + description + "Number of packets (including bad packets) received that + were 64 bytes in length (excluding framing bits but + including FCS bytes)."; + } + + leaf in-frames-65-127-octets { + type oc-yang:counter64; + description + "Number of good and bad packets received that were + between 65 and 127 bytes in length (excluding framing bits + but including FCS bytes)."; + } + + leaf in-frames-128-255-octets { + type oc-yang:counter64; + description + "Number of good and bad packets received that were + between 128 and 255 bytes in length inclusive + (excluding framing bits but including FCS bytes)."; + } + + leaf in-frames-256-511-octets { + type oc-yang:counter64; + description + "Number of good and bad packets received that were + between 256 and 511 bytes in length inclusive + (excluding framing bits but including FCS bytes)."; + } + + leaf in-frames-512-1023-octets { + type oc-yang:counter64; + description + "Number of good and bad packets received that were + between 512 and 1023 bytes in length inclusive + (excluding framing bits but including FCS bytes)."; + } + + leaf in-frames-1024-1518-octets { + type oc-yang:counter64; + description + "Number of good and bad packets received that were + between 1024 and 1518 bytes in length inclusive + (excluding framing bits but including FCS bytes)."; + } + } + } + + // augment statements + + augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" + + "oc-eth:state/oc-eth:counters" { + description + "Adds size distribution to the ethernet counters"; + + uses ethernet-in-frames-size-dist; + } + +} \ No newline at end of file diff --git a/models/yang/common/openconfig-if-ip-ext.yang b/models/yang/common/openconfig-if-ip-ext.yang new file mode 100644 index 0000000000..2f28934971 --- /dev/null +++ b/models/yang/common/openconfig-if-ip-ext.yang @@ -0,0 +1,179 @@ +module openconfig-if-ip-ext { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/interfaces/ip-ext"; + + prefix "oc-ip-ext"; + + import openconfig-interfaces { prefix oc-if; } + import openconfig-if-ip { prefix oc-ip; } + import openconfig-extensions { prefix oc-ext; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module adds extensions to the base IP configuration and + operational state model to support additional use cases."; + + oc-ext:openconfig-version "2.3.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "2.3.1"; + } + + revision "2018-01-05" { + description + "Add logical loopback to interface."; + reference "2.3.0"; + } + + revision "2017-12-21" { + description + "Added IPv6 router advertisement configuration."; + reference "2.1.0"; + } + + revision "2017-07-14" { + description + "Added Ethernet/IP state data; Add dhcp-client; + migrate to OpenConfig types modules; Removed or + renamed opstate values"; + reference "2.0.0"; + } + + revision "2016-12-22" { + description + "Fixes to Ethernet interfaces model"; + reference "1.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // grouping statements + + grouping ipv6-autoconf-config { + description + "Configuration data for IPv6 address autoconfiguration"; + + leaf create-global-addresses { + type boolean; + default true; + description + "[adapted from IETF IP model RFC 7277] + + If enabled, the host creates global addresses as + described in RFC 4862."; + reference + "RFC 4862: IPv6 Stateless Address Autoconfiguration + Section 5.5"; + } + leaf create-temporary-addresses { + type boolean; + default false; + description + "[adapted from IETF IP model RFC 7277] + + If enabled, the host creates temporary addresses as + described in RFC 4941."; + reference + "RFC 4941: Privacy Extensions for Stateless Address + Autoconfiguration in IPv6"; + } + + leaf temporary-valid-lifetime { + type uint32; + units "seconds"; + default 604800; + description + "[adapted from IETF IP model RFC 7277] + + The time period during which the temporary address + is valid."; + reference + "RFC 4941: Privacy Extensions for Stateless Address + Autoconfiguration in IPv6 + - TEMP_VALID_LIFETIME"; + } + + leaf temporary-preferred-lifetime { + type uint32; + units "seconds"; + default 86400; + description + "[adapted from IETF IP model RFC 7277] + + The time period during which the temporary address is + preferred."; + reference + "RFC 4941: Privacy Extensions for Stateless Address + Autoconfiguration in IPv6 + - TEMP_PREFERRED_LIFETIME"; + } + } + + grouping ipv6-autoconf-state { + description + "Operational state data for IPv6 address autoconfiguration"; + + //TODO: placeholder for additional opstate for IPv6 autoconf + } + + grouping ipv6-autoconf-top { + description + "Top-level grouping for IPv6 address autoconfiguration"; + + container autoconf { + description + "Top-level container for IPv6 autoconf"; + + container config { + description + "[adapted from IETF IP model RFC 7277] + + Parameters to control the autoconfiguration of IPv6 + addresses, as described in RFC 4862."; + reference + "RFC 4862: IPv6 Stateless Address Autoconfiguration"; + + uses ipv6-autoconf-config; + } + + container state { + + config false; + + description + "Operational state data "; + + uses ipv6-autoconf-config; + uses ipv6-autoconf-state; + } + } + } + + // data definition statements + + // augment statements + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface/oc-ip:ipv6" { + description + "Adds address autoconfiguration to the base IP model"; + + uses ipv6-autoconf-top; + } + +} diff --git a/models/yang/common/openconfig-if-poe.yang b/models/yang/common/openconfig-if-poe.yang new file mode 100644 index 0000000000..7758ea3186 --- /dev/null +++ b/models/yang/common/openconfig-if-poe.yang @@ -0,0 +1,110 @@ +module openconfig-if-poe { + + yang-version "1"; + + namespace "http://openconfig.net/yang/poe"; + + prefix "oc-poe"; + + import openconfig-if-ethernet { prefix oc-eth; } + import openconfig-interfaces { prefix oc-if; } + import openconfig-extensions { prefix oc-ext; } + + organization "OpenConfig working group"; + + contact + "Openconfig working group + www.openconfig.net"; + + description + "This module defines configuration and state data for + Power over Ethernet (PoE) based on the IEEE 802.3af + standard."; + + oc-ext:openconfig-version "0.1.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.1.1"; + } + + revision "2017-09-14" { + description + "Initial public revision"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + grouping poe-ethernet-config { + description + "PoE ethernet config grouping"; + + leaf enabled { + type boolean; + default "true"; + description + "Enable or disable PoE in the ethernet interface."; + } + } + + grouping poe-ethernet-state { + description + "PoE ethernet state grouping"; + + leaf power-used { + type decimal64 { + fraction-digits 2; + } + units Watts; + description + "Power used by the ethernet interface in Watts."; + } + + leaf power-class { + type uint8; + description + "IEEE 802.3af Power class detected for this ethernet + interface."; + } + } + + grouping poe-ethernet-top { + description + "Ethernet top level grouping"; + + container poe { + description + "Top-level container for PoE configuration and state data"; + + container config { + description + "Configuration data for PoE"; + + uses poe-ethernet-config; + } + + container state { + config false; + + description + "Operational state data for PoE"; + + uses poe-ethernet-config; + uses poe-ethernet-state; + } + } + } + + augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet" { + description + "Adds PoE to the ethernet model."; + + uses poe-ethernet-top; + } + +} diff --git a/models/yang/common/openconfig-if-tunnel.yang b/models/yang/common/openconfig-if-tunnel.yang new file mode 100644 index 0000000000..3003699d52 --- /dev/null +++ b/models/yang/common/openconfig-if-tunnel.yang @@ -0,0 +1,120 @@ +module openconfig-if-tunnel { + yang-version "1"; + + namespace "http://openconfig.net/yang/interfaces/tunnel"; + + prefix "oc-tun"; + + import openconfig-interfaces { prefix oc-if; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-inet-types { prefix oc-inet; } + import openconfig-if-ip { prefix oc-ip; } + + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This model adds extensions to the OpenConfig interfaces + model to configure tunnel interfaces on a network + device."; + + oc-ext:openconfig-version "0.1.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.1.1"; + } + + revision "2018-01-05" { + description + "Initial tunnel model"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + grouping tunnel-top { + description + "Top-level grouping for parameters related to + a tunnel interface."; + + container tunnel { + description + "In the case that the interface is logical tunnel + interface, the parameters for the tunnel are + specified within this subtree. Tunnel interfaces + have only a single logical subinterface associated + with them."; + + container config { + description + "Configuration parameters associated with the + tunnel interface"; + uses tunnel-config; + } + + container state { + config false; + description + "Operational state parameters associated with + the tunnel interface."; + uses tunnel-config; + } + + uses oc-ip:ipv4-top; + uses oc-ip:ipv6-top; + } + } + + grouping tunnel-config { + description + "Configuraton parameters relating to a tunnel + interface."; + + leaf src { + type oc-inet:ip-address; + description + "The source address that should be used for the + tunnel."; + } + + leaf dst { + type oc-inet:ip-address; + description + "The destination address for the tunnel."; + } + + leaf ttl { + type uint8 { + range "1..255"; + } + description + "The time-to-live (or hop limit) that should be utilised + for the IP packets used for the tunnel transport."; + } + + leaf gre-key { + type uint32; + description + "The GRE key to be specified for the tunnel. The + key is used to identify a traffic flow within + a tunnel."; + reference + "RFC2890: Key and Sequence Number Extensions to GRE"; + } + } + + augment "/oc-if:interfaces/oc-if:interface" { + description + "Augment to add tunnel configuration to interfaces"; + uses tunnel-top; + } +} diff --git a/models/yang/common/openconfig-if-types.yang b/models/yang/common/openconfig-if-types.yang new file mode 100644 index 0000000000..27d2dc1d89 --- /dev/null +++ b/models/yang/common/openconfig-if-types.yang @@ -0,0 +1,108 @@ +module openconfig-if-types { + yang-version "1"; + + namespace "http://openconfig.net/yang/openconfig-if-types"; + + prefix "oc-ift"; + + // import statements + import openconfig-extensions { prefix oc-ext; } + + // meta + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module contains a set of interface type definitions that + are used across OpenConfig models. These are generally physical + or logical interfaces, distinct from hardware ports (which are + described by the OpenConfig platform model)."; + + oc-ext:openconfig-version "0.2.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.2.1"; + } + + revision "2018-01-05" { + description + "Add tunnel types into the INTERFACE_TYPE identity."; + reference "0.2.0"; + } + + revision "2016-11-14" { + description + "Initial version"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + identity INTERFACE_TYPE { + description + "Base identity from which interface types are derived."; + } + + identity IF_ETHERNET { + base INTERFACE_TYPE; + description + "Ethernet interfaces based on IEEE 802.3 standards, as well + as FlexEthernet"; + reference + "IEEE 802.3-2015 - IEEE Standard for Ethernet + OIF Flex Ethernet Implementation Agreement 1.0"; + } + + identity IF_AGGREGATE { + base INTERFACE_TYPE; + description + "An aggregated, or bonded, interface forming a + Link Aggregation Group (LAG), or bundle, most often based on + the IEEE 802.1AX (or 802.3ad) standard."; + reference + "IEEE 802.1AX-2008"; + } + + identity IF_LOOPBACK { + base INTERFACE_TYPE; + description + "A virtual interface designated as a loopback used for + various management and operations tasks."; + } + + identity IF_ROUTED_VLAN { + base INTERFACE_TYPE; + description + "A logical interface used for routing services on a VLAN. + Such interfaces are also known as switch virtual interfaces + (SVI) or integrated routing and bridging interfaces (IRBs)."; + } + + identity IF_SONET { + base INTERFACE_TYPE; + description + "SONET/SDH interface"; + } + + identity IF_TUNNEL_GRE4 { + base INTERFACE_TYPE; + description + "A GRE tunnel over IPv4 transport."; + } + + identity IF_TUNNEL_GRE6 { + base INTERFACE_TYPE; + description + "A GRE tunnel over IPv6 transport."; + } + +} diff --git a/models/yang/common/openconfig-inet-types.yang b/models/yang/common/openconfig-inet-types.yang new file mode 100644 index 0000000000..7c23d2b38b --- /dev/null +++ b/models/yang/common/openconfig-inet-types.yang @@ -0,0 +1,343 @@ +module openconfig-inet-types { + + yang-version "1"; + namespace "http://openconfig.net/yang/types/inet"; + prefix "oc-inet"; + + import openconfig-extensions { prefix "oc-ext"; } + + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module contains a set of Internet address related + types for use in OpenConfig modules. + + Portions of this code were derived from IETF RFC 6021. + Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "0.3.2"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.3.2"; + } + + revision 2017-08-24 { + description + "Minor formatting fixes."; + reference "0.3.1"; + } + + revision 2017-07-06 { + description + "Add domain-name and host typedefs"; + reference "0.3.0"; + } + + revision 2017-04-03 { + description + "Add ip-version typedef."; + reference "0.2.0"; + } + + revision 2017-04-03 { + description + "Update copyright notice."; + reference "0.1.1"; + } + + revision 2017-01-26 { + description + "Initial module for inet types"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // IPv4 and IPv6 types. + + typedef ipv4-address { + type string { + pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|' + + '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]' + + '[0-9]|25[0-5])$'; + } + description + "An IPv4 address in dotted quad notation using the default + zone."; + } + + typedef ipv4-address-zoned { + type string { + pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|' + + '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]' + + '[0-9]|25[0-5])(%[a-zA-Z0-9_]+)$'; + } + description + "An IPv4 address in dotted quad notation. This type allows + specification of a zone index to disambiguate identical + address values. For link-local addresses, the index is + typically the interface index or interface name."; + } + + typedef ipv6-address { + type string { + pattern + // Must support compression through different lengths + // therefore this regexp is complex. + '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,7}:|' + + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' + + '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' + + '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' + + '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' + + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' + + ':((:[0-9a-fA-F]{1,4}){1,7}|:)' + + ')$'; + } + description + "An IPv6 address represented as either a full address; shortened + or mixed-shortened formats, using the default zone."; + } + + typedef ipv6-address-zoned { + type string { + pattern + // Must support compression through different lengths + // therefore this regexp is complex. + '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,7}:|' + + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' + + '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' + + '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' + + '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' + + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' + + ':((:[0-9a-fA-F]{1,4}){1,7}|:)' + + ')(%[a-zA-Z0-9_]+)$'; + } + description + "An IPv6 address represented as either a full address; shortened + or mixed-shortened formats. This type allows specification of + a zone index to disambiguate identical address values. For + link-local addresses, the index is typically the interface + index or interface name."; + } + + typedef ipv4-prefix { + type string { + pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|' + + '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]' + + '[0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))$'; + } + description + "An IPv4 prefix represented in dotted quad notation followed by + a slash and a CIDR mask (0 <= mask <= 32)."; + } + + typedef ipv6-prefix { + type string { + pattern + '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,7}:|' + + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}' + + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' + + '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' + + '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' + + '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' + + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' + + ':((:[0-9a-fA-F]{1,4}){1,7}|:)' + + ')/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])$'; + } + description + "An IPv6 prefix represented in full, shortened, or mixed + shortened format followed by a slash and CIDR mask + (0 <= mask <= 128)."; + } + + typedef ip-address { + type union { + type ipv4-address; + type ipv6-address; + } + description + "An IPv4 or IPv6 address with no prefix specified."; + } + + typedef ip-prefix { + type union { + type ipv4-prefix; + type ipv6-prefix; + } + description + "An IPv4 or IPv6 prefix."; + } + + typedef ip-version { + type enumeration { + enum UNKNOWN { + value 0; + description + "An unknown or unspecified version of the Internet + protocol."; + } + enum IPV4 { + value 4; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum IPV6 { + value 6; + description + "The IPv6 protocol as defined in RFC 2460."; + } + } + description + "This value represents the version of the IP protocol. + Note that integer representation of the enumerated values + are not specified, and are not required to follow the + InetVersion textual convention in SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef domain-name { + type string { + length "1..253"; + pattern + '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' + + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' + + '|\.'; + } + description + "The domain-name type represents a DNS domain name. + Fully quallified left to the models which utilize this type. + + Internet domain names are only loosely specified. Section + 3.5 of RFC 1034 recommends a syntax (modified in Section + 2.1 of RFC 1123). The pattern above is intended to allow + for current practice in domain name use, and some possible + future expansion. It is designed to hold various types of + domain names, including names used for A or AAAA records + (host names) and other records, such as SRV records. Note + that Internet host names have a stricter syntax (described + in RFC 952) than the DNS recommendations in RFCs 1034 and + 1123, and that systems that want to store host names in + schema nodes using the domain-name type are recommended to + adhere to this stricter standard to ensure interoperability. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be encoded in punycode as described in RFC + 3492"; + } + + typedef host { + type union { + type ip-address; + type domain-name; + } + description + "The host type represents either an unzoned IP address or a DNS + domain name."; + } + + typedef as-number { + type uint32; + description + "A numeric identifier for an autonomous system (AS). An AS is a + single domain, under common administrative control, which forms + a unit of routing policy. Autonomous systems can be assigned a + 2-byte identifier, or a 4-byte identifier which may have public + or private scope. Private ASNs are assigned from dedicated + ranges. Public ASNs are assigned from ranges allocated by IANA + to the regional internet registries (RIRs)."; + reference + "RFC 1930 Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271 A Border Gateway Protocol 4 (BGP-4)"; + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "A differentiated services code point (DSCP) marking within the + IP header."; + reference + "RFC 2474 Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers"; + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The IPv6 flow-label is a 20-bit value within the IPv6 header + which is optionally used by the source of the IPv6 packet to + label sets of packets for which special handling may be + required."; + reference + "RFC 2460 Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef port-number { + type uint16; + description + "A 16-bit port number used by a transport protocol such as TCP + or UDP."; + reference + "RFC 768 User Datagram Protocol + RFC 793 Transmission Control Protocol"; + } + + typedef uri { + type string; + description + "An ASCII-encoded Uniform Resource Identifier (URI) as defined + in RFC 3986."; + reference + "RFC 3986 Uniform Resource Identifier (URI): Generic Syntax"; + } + + typedef url { + type string; + description + "An ASCII-encoded Uniform Resource Locator (URL) as defined + in RFC 3986, section 1.1.3"; + reference + "RFC 3986, paragraph 1.1.3"; + } + +} diff --git a/models/yang/common/openconfig-lldp-types.yang b/models/yang/common/openconfig-lldp-types.yang new file mode 100644 index 0000000000..6c4a0ac172 --- /dev/null +++ b/models/yang/common/openconfig-lldp-types.yang @@ -0,0 +1,306 @@ +module openconfig-lldp-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/lldp/types"; + + prefix "oc-lldp-types"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines types related to the LLDP protocol model."; + + oc-ext:openconfig-version "0.1.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.1.1"; + } + + revision "2016-05-16" { + description + "Initial public revision"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // identity statements + + identity LLDP_SYSTEM_CAPABILITY { + description + "Base identity for standard LLDP system capabilities. + The system capabilities field contains a bit-map of the + capabilities that define the primary function(s) of + the system. A system may advertise more than one capability."; + reference + "Table 8-4 System Capabilities, IEEE 802.1AB-2009"; + } + + identity OTHER { + base LLDP_SYSTEM_CAPABILITY; + description + "Other capability not specified; bit position 1"; + } + + identity REPEATER { + base LLDP_SYSTEM_CAPABILITY; + description + "Repeater capability; bit position 2"; + reference + "IETF RFC 2108"; + } + + identity MAC_BRIDGE { + base LLDP_SYSTEM_CAPABILITY; + description + "MAC bridge capability; bit position 3"; + reference + "IEEE Std 802.1D"; + } + + identity WLAN_ACCESS_POINT { + base LLDP_SYSTEM_CAPABILITY; + description + "WLAN access point capability; bit position 4"; + reference + "IEEE Std 802.11 MIB"; + } + + identity ROUTER { + base LLDP_SYSTEM_CAPABILITY; + description + "Router; bit position 5"; + reference + "IETF RFC 1812"; + } + + identity TELEPHONE { + base LLDP_SYSTEM_CAPABILITY; + description + "Telephone capability; bit position 6"; + reference + "IETF RFC 4293"; + } + + identity DOCSIS_CABLE_DEVICE { + base LLDP_SYSTEM_CAPABILITY; + description + "DOCSIS cable device; bit position 7"; + reference + "IETF RFC 4639 and IETF RFC 4546"; + } + + identity STATION_ONLY { + base LLDP_SYSTEM_CAPABILITY; + description + "Station only capability, for devices that implement only an + end station capability, and for which none of the other + capabilities apply; bit position 8"; + reference + "IETF RFC 4293"; + } + + identity C_VLAN { + base LLDP_SYSTEM_CAPABILITY; + description + "C-VLAN component of a VLAN Bridge; bit position 9"; + reference + "IEEE Std 802.1Q"; + } + + identity S_VLAN { + base LLDP_SYSTEM_CAPABILITY; + description + "S-VLAN component of a VLAN Bridge; bit position 10"; + reference + "IEEE Std 802.1Q"; + } + + identity TWO_PORT_MAC_RELAY { + base LLDP_SYSTEM_CAPABILITY; + description + "Two-port MAC Relay (TPMR) capability; bit position 11"; + reference + "IEEE Std 802.1Q"; + } + + identity LLDP_TLV { + description + "A base identity which describes the TLVs in LLDP"; + } + + identity CHASSIS_ID { + base LLDP_TLV; + description + "The chassis identifier of the device associated with + the transmitting LLDP agent"; + reference "IEEE Std 802.1AB"; + } + + identity PORT_ID { + base LLDP_TLV; + description + "The port identifier associated with the interface + on with the LLDP agent is transmitting"; + reference "IEEE Std 802.1AB"; + } + + identity PORT_DESCRIPTION { + base LLDP_TLV; + description + "The description of the port that is associated with + the interface on which the LLDP agent is transmitting"; + reference "IEEE Std 802.1AB"; + } + + identity SYSTEM_NAME { + base LLDP_TLV; + description + "The assigned name (sysName or hostname) of the device + which is transmitting the LLDP PDU"; + reference "IEEE Std 802.1AB"; + } + + identity SYSTEM_DESCRIPTION { + base LLDP_TLV; + description + "The description (sysDescr) of the device which is + transmitting the LLDP PDU"; + reference "IEEE Std 802.1AB"; + } + + identity SYSTEM_CAPABILITIES { + base LLDP_TLV; + description + "The primary functions of the device transmitting the + LLDP PDU and their administrative status"; + reference "IEEE Std 802.1AB"; + } + + identity MANAGEMENT_ADDRESS { + base LLDP_TLV; + description + "The address associated with the device transmitting the + LLDP PDU which can be used for higher-layer network + management"; + reference "IEEE Std 802.1AB"; + } + + // typedef statements + + typedef chassis-id-type { + type enumeration { + enum CHASSIS_COMPONENT { + description + "Chassis identifier based on the value of entPhysicalAlias + object defined in IETF RFC 2737"; + } + enum INTERFACE_ALIAS { + description + "Chassis identifier based on the value of ifAlias object + defined in IETF RFC 2863"; + } + enum PORT_COMPONENT { + description + "Chassis identifier based on the value of entPhysicalAlias + object defined in IETF RFC 2737 for a port or backplane + component"; + } + enum MAC_ADDRESS { + description + "Chassis identifier based on the value of a unicast source + address (encoded in network byte order and IEEE 802.3 + canonical bit order), of a port on the containing chassis + as defined in IEEE Std 802-2001"; + } + enum NETWORK_ADDRESS { + description + "Chassis identifier based on a network address, + associated with a particular chassis. The encoded address + is composed of two fields. The first field is a single + octet, representing the IANA AddressFamilyNumbers value + for the specific address type, and the second field is the + network address value"; + } + enum INTERFACE_NAME { + description + "Chassis identifier based on the name of the interface, + e.g., the value of ifName object defined in IETF RFC 2863"; + } + enum LOCAL { + description + "Chassis identifier based on a locally defined value"; + } + } + description + "Type definition with enumerations describing the source of + the chassis identifier"; + reference + "IEEE 802.1AB LLDP MIB"; + } + + typedef port-id-type { + type enumeration { + enum INTERFACE_ALIAS { + description + "Chassis identifier based on the value of ifAlias object + defined in IETF RFC 2863"; + } + enum PORT_COMPONENT { + description + "Port identifier based on the value of entPhysicalAlias + object defined in IETF RFC 2737 for a port component"; + } + enum MAC_ADDRESS { + description + "Port identifier based on the value of a unicast source + address (encoded in network byte order and IEEE 802.3 + canonical bit order) associated with a port"; + } + enum NETWORK_ADDRESS { + description + "Port identifier based on a network address, + associated with a particular port"; + } + enum INTERFACE_NAME { + description + "Port identifier based on the name of the interface, + e.g., the value of ifName object defined in IETF RFC 2863"; + } + enum AGENT_CIRCUIT_ID { + description + "Port identifer based on the circuit id in the DHCP + relay agent information option as defined in IETF + RFC 3046"; + } + enum LOCAL { + description + "Port identifier based on a locally defined alphanumeric + string"; + } + } + description + "Type definition with enumerations describing the basis of + the port identifier"; + reference + "IEEE 802.1AB LLDP MIB"; + } + + +} \ No newline at end of file diff --git a/models/yang/common/openconfig-messages.yang b/models/yang/common/openconfig-messages.yang new file mode 100644 index 0000000000..894704479d --- /dev/null +++ b/models/yang/common/openconfig-messages.yang @@ -0,0 +1,221 @@ +module openconfig-messages { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/messages"; + + prefix "oc-messages"; + + // import some basic types + import openconfig-extensions { prefix "oc-ext"; } + import openconfig-system-logging { prefix "oc-log"; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines configuration and operational state data + related to Syslog messages that a device may generate. + + These messages are historically obtained through the Syslog + transport, however this module allows for obtaining them through + an alternative transport, such as a Subscribe operation over an + RPC. + + This module does not usurp traditional syslog servers, which may + still be configured through the + /yang/system/openconfig-system.yang model, rather it provies the + Operator with an alternative method of consuming messages."; + + oc-ext:openconfig-version "0.0.1"; + + revision "2018-08-13" { + description + "Initial draft."; + reference "0.0.1"; + } + + // identity statements + + identity DEBUG_SERVICE { + description + "Base identity for debug services. Identities within this base + identity are to be augmented in by vendors."; + } + + // grouping statements + + grouping messages-config { + description + "Configuration data for defining Syslog message severity."; + + leaf severity { + type oc-log:syslog-severity; + description + "Specifies that only messages of the given severity (or + greater severity) are sent over the RPC. + + This is analogous to differentiating which severity is to be + sent to legacy Syslog servers, as opposed to local buffer or + files."; + } + } + + grouping messages-state { + description + "Operational state data for Syslog messages."; + + container message { + oc-ext:telemetry-atomic; + config false; + description + "Syslog messages the client is Subscribing to. This is all + messages currently configured to be sent according to + syslog-severity."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + + // Decide if it is OK to include ALL in this leaf. + leaf msg { + type string; + description + "Message payload. If other leafs within this container not + supported, this leaf MAY include the entire message, + inclding pri, procid, app-name etc.."; + } + + leaf priority { + type uint8; + description + "The Priority value (PRIVAL) represents both the + Facility and Severity."; + reference + "IETF RFC 5424, Section 6.2.1"; + } + + leaf app-name { + type string; + description + "The APP-NAME field SHOULD identify the device or + application that originated the message."; + reference + "IETF RFC 5424, Section 6.2.5."; + } + + leaf procid { + type string; + description + "PROCID is a value that is included in the message, having + no interoperable meaning, except that a change in the value + indicates there has been a discontinuity in syslog + reporting."; + reference + "IETF RFC 5424, Section 6.2.6."; + } + + leaf msgid { + type string; + description + "The MSGID SHOULD identify the type of message. For + example, a firewall might use the MSGID 'TCPIN' for + incoming TCP traffic and the MSGID 'TCPOUT' for outgoing + TCP traffic."; + reference + "IETF RFC 5424, Section 6.2.7."; + } + } + } + + grouping debug-messages-config { + description + "Configuration data for enabling debug messages."; + + leaf service { + type identityref { + base DEBUG_SERVICE; + } + description + "Enumeration of all services which can have debugging enabled. + Vendors are to augment this base identity with their platform + or OS specific debug options."; + } + + leaf enabled { + type boolean; + default false; + description + "Enable and disable debugging."; + } + } + + grouping debug-messages-top { + description + "Configuration data for enabling Syslog debug messages."; + + container debug-entries { + description + "Enclosing container for list of debugs to enable."; + + list debug-service { + key "service"; + description + "List of debugging entries."; + + leaf service { + type leafref { + path "../config/service"; + } + description + "Reference to the debug-enable service key."; + } + + container config { + description + "Configuration data for debug service entries."; + + uses debug-messages-config; + } + + container state { + config false; + description + "Operational state data for enabled debugs."; + uses debug-messages-config; + } + } + } + } + + grouping messages-top { + description + "Top-level grouping for Syslog messages."; + + container messages { + description + "Top-level container for Syslog messages."; + + container config { + description + "Configuration data for Syslog messages."; + + uses messages-config; + } + + container state { + config false; + description + "Operational state data for a Syslog messages."; + + uses messages-config; + uses messages-state; + } + uses debug-messages-top; + } + } + uses messages-top; +} diff --git a/models/yang/common/openconfig-packet-match-types.yang b/models/yang/common/openconfig-packet-match-types.yang new file mode 100644 index 0000000000..1b93d52059 --- /dev/null +++ b/models/yang/common/openconfig-packet-match-types.yang @@ -0,0 +1,309 @@ +module openconfig-packet-match-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/packet-match-types"; + + prefix "oc-pkt-match-types"; + + // import some basic types + import openconfig-inet-types { prefix oc-inet; } + import openconfig-extensions { prefix oc-ext; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines common types for use in models requiring + data definitions related to packet matches."; + + oc-ext:openconfig-version "1.0.2"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "1.0.2"; + } + + revision "2018-04-15" { + description + "Corrected description and range for ethertype typedef"; + reference "1.0.1"; + } + + revision "2017-05-26" { + description + "Separated IP matches into AFs"; + reference "1.0.0"; + } + + revision "2016-08-08" { + description + "OpenConfig public release"; + reference "0.2.0"; + } + + revision "2016-04-27" { + description + "Initial revision"; + reference "TBD"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + + // extension statements + + // feature statements + + // identity statements + + + //TODO: should replace this with an official IEEE module + // when available. Only a select number of types are + // defined in this identity. + identity ETHERTYPE { + description + "Base identity for commonly used Ethertype values used + in packet header matches on Ethernet frames. The Ethertype + indicates which protocol is encapsulated in the Ethernet + payload."; + reference + "IEEE 802.3"; + } + + identity ETHERTYPE_IPV4 { + base ETHERTYPE; + description + "IPv4 protocol (0x0800)"; + } + + identity ETHERTYPE_ARP { + base ETHERTYPE; + description + "Address resolution protocol (0x0806)"; + } + + identity ETHERTYPE_VLAN { + base ETHERTYPE; + description + "VLAN-tagged frame (as defined by IEEE 802.1q) (0x8100). Note + that this value is also used to represent Shortest Path + Bridging (IEEE 801.1aq) frames."; + } + + identity ETHERTYPE_IPV6 { + base ETHERTYPE; + description + "IPv6 protocol (0x86DD)"; + } + + identity ETHERTYPE_MPLS { + base ETHERTYPE; + description + "MPLS unicast (0x8847)"; + } + + identity ETHERTYPE_LLDP { + base ETHERTYPE; + description + "Link Layer Discovery Protocol (0x88CC)"; + } + + identity ETHERTYPE_ROCE { + base ETHERTYPE; + description + "RDMA over Converged Ethernet (0x8915)"; + } + + + //TODO: should replace this with an official IANA module when + //available. Only a select set of protocols are defined with + //this identity. + identity IP_PROTOCOL { + description + "Base identity for commonly used IP protocols used in + packet header matches"; + reference + "IANA Assigned Internet Protocol Numbers"; + } + + identity IP_TCP { + base IP_PROTOCOL; + description + "Transmission Control Protocol (6)"; + } + + identity IP_UDP { + base IP_PROTOCOL; + description + "User Datagram Protocol (17)"; + } + + identity IP_ICMP { + base IP_PROTOCOL; + description + "Internet Control Message Protocol (1)"; + } + + identity IP_IGMP { + base IP_PROTOCOL; + description + "Internet Group Membership Protocol (2)"; + } + + identity IP_PIM { + base IP_PROTOCOL; + description + "Protocol Independent Multicast (103)"; + } + + identity IP_RSVP { + base IP_PROTOCOL; + description + "Resource Reservation Protocol (46)"; + } + + identity IP_GRE { + base IP_PROTOCOL; + description + "Generic Routing Encapsulation (47)"; + } + + identity IP_AUTH { + base IP_PROTOCOL; + description + "Authentication header, e.g., for IPSEC (51)"; + } + + identity IP_L2TP { + base IP_PROTOCOL; + description + "Layer Two Tunneling Protocol v.3 (115)"; + } + + + + identity TCP_FLAGS { + description + "Common TCP flags used in packet header matches"; + reference + "IETF RFC 793 - Transmission Control Protocol + IETF RFC 3168 - The Addition of Explicit Congestion + Notification (ECN) to IP"; + } + + identity TCP_SYN { + base TCP_FLAGS; + description + "TCP SYN flag"; + } + + identity TCP_FIN { + base TCP_FLAGS; + description + "TCP FIN flag"; + } + + identity TCP_RST { + base TCP_FLAGS; + description + "TCP RST flag"; + } + + identity TCP_PSH { + base TCP_FLAGS; + description + "TCP push flag"; + } + + identity TCP_ACK { + base TCP_FLAGS; + description + "TCP ACK flag"; + } + + identity TCP_URG { + base TCP_FLAGS; + description + "TCP urgent flag"; + } + + identity TCP_ECE { + base TCP_FLAGS; + description + "TCP ECN-Echo flag. If the SYN flag is set, indicates that + the TCP peer is ECN-capable, otherwise indicates that a + packet with Congestion Experienced flag in the IP header + is set"; + } + + identity TCP_CWR { + base TCP_FLAGS; + description + "TCP Congestion Window Reduced flag"; + } + + // typedef statements + + typedef port-num-range { + type union { + type string { + pattern '^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?' + + '[0-9]?)\.\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?' + + '[0-9]?[0-9]?)$'; + } + type oc-inet:port-number; + type enumeration { + enum ANY { + description + "Indicates any valid port number (e.g., wildcard)"; + } + } + } + description + "Port numbers may be represented as a single value, + an inclusive range as .., or as ANY to + indicate a wildcard."; + } + + typedef ip-protocol-type { + type union { + type uint8 { + range 0..254; + } + type identityref { + base IP_PROTOCOL; + } + } + description + "The IP protocol number may be expressed as a valid protocol + number (integer) or using a protocol type defined by the + IP_PROTOCOL identity"; + } + + typedef ethertype-type { + type union { + type uint16 { + range 1536..65535; + } + type identityref { + base ETHERTYPE; + } + } + description + "The Ethertype value may be expressed as a 16-bit number in + decimal notation, or using a type defined by the + ETHERTYPE identity"; + } + +} diff --git a/models/yang/common/openconfig-packet-match.yang b/models/yang/common/openconfig-packet-match.yang new file mode 100644 index 0000000000..510bc57686 --- /dev/null +++ b/models/yang/common/openconfig-packet-match.yang @@ -0,0 +1,371 @@ +module openconfig-packet-match { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/header-fields"; + + prefix "oc-pkt-match"; + + // import some basic types + import openconfig-inet-types { prefix oc-inet; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-packet-match-types { prefix oc-pkt-match-types; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines data related to packet header fields + used in matching operations, for example in ACLs. When a + field is omitted from a match expression, the effect is a + wildcard ('any') for that field."; + + oc-ext:openconfig-version "1.1.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "1.1.1"; + } + + revision "2017-12-15" { + description + "Add MPLS packet field matches"; + reference "1.1.0"; + } + + revision "2017-05-26" { + description + "Separated IP matches into AFs"; + reference "1.0.0"; + } + + revision "2016-08-08" { + description + "OpenConfig public release"; + reference "0.2.0"; + } + + revision "2016-04-27" { + description + "Initial revision"; + reference "TBD"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + + // Physical Layer fields + // ethernet-header + grouping ethernet-header-config { + description + "Configuration data of fields in Ethernet header."; + + leaf source-mac { + type oc-yang:mac-address; + description + "Source IEEE 802 MAC address."; + } + + leaf source-mac-mask { + type oc-yang:mac-address; + description + "Source IEEE 802 MAC address mask."; + } + + leaf destination-mac { + type oc-yang:mac-address; + description + "Destination IEEE 802 MAC address."; + } + + leaf destination-mac-mask { + type oc-yang:mac-address; + description + "Destination IEEE 802 MAC address mask."; + } + + leaf ethertype { + type oc-pkt-match-types:ethertype-type; + description + "Ethertype field to match in Ethernet packets"; + } + } + + grouping ethernet-header-state { + description + "State information of fields in Ethernet header."; + } + + grouping ethernet-header-top { + description + "Top level container for fields in Ethernet header."; + + container l2 { + description + "Ethernet header fields"; + + container config { + description + "Configuration data"; + uses ethernet-header-config; + } + + container state { + config false; + description + "State Information."; + uses ethernet-header-config; + uses ethernet-header-state; + } + } + } + + grouping mpls-header-top { + description + "Top-level container for fields in an MPLS header."; + + container mpls { + description + "MPLS header fields"; + + container config { + description + "Configuration parameters relating to fields within + the MPLS header."; + uses mpls-header-config; + } + + container state { + config false; + description + "Operational state parameters relating to fields + within the MPLS header"; + uses mpls-header-config; + } + } + } + + grouping mpls-header-config { + description + "Configuration parameters relating to matches within + MPLS header fields."; + + leaf traffic-class { + type uint8 { + range "0..7"; + } + description + "The value of the MPLS traffic class (TC) bits, + formerly known as the EXP bits."; + } + } + + grouping ip-protocol-fields-common-config { + description + "IP protocol fields common to IPv4 and IPv6"; + + leaf dscp { + type oc-inet:dscp; + description + "Value of diffserv codepoint."; + } + + leaf protocol { + type oc-pkt-match-types:ip-protocol-type; + description + "The protocol carried in the IP packet, expressed either + as its IP protocol number, or by a defined identity."; + } + + leaf hop-limit { + type uint8 { + range 0..255; + } + description + "The IP packet's hop limit -- known as TTL (in hops) in + IPv4 packets, and hop limit in IPv6"; + } + } + + // IP Layer + // ip-protocol-fields + grouping ipv4-protocol-fields-config { + description + "Configuration data of IP protocol fields + for IPv4"; + + leaf source-address { + type oc-inet:ipv4-prefix; + description + "Source IPv4 address prefix."; + } + + leaf destination-address { + type oc-inet:ipv4-prefix; + description + "Destination IPv4 address prefix."; + } + + uses ip-protocol-fields-common-config; + + } + + grouping ipv4-protocol-fields-state { + description + "State information of IP header fields for IPv4"; + } + + grouping ipv4-protocol-fields-top { + description + "IP header fields for IPv4"; + + container ipv4 { + description + "Top level container for IPv4 match field data"; + + container config { + description + "Configuration data for IPv4 match fields"; + uses ipv4-protocol-fields-config; + } + + container state { + config false; + description + "State information for IPv4 match fields"; + uses ipv4-protocol-fields-config; + uses ipv4-protocol-fields-state; + } + } + } + + grouping ipv6-protocol-fields-config { + description + "Configuration data for IPv6 match fields"; + + leaf source-address { + type oc-inet:ipv6-prefix; + description + "Source IPv6 address prefix."; + } + + leaf source-flow-label { + type oc-inet:ipv6-flow-label; + description + "Source IPv6 Flow label."; + } + + leaf destination-address { + type oc-inet:ipv6-prefix; + description + "Destination IPv6 address prefix."; + } + + leaf destination-flow-label { + type oc-inet:ipv6-flow-label; + description + "Destination IPv6 Flow label."; + } + + uses ip-protocol-fields-common-config; + } + + grouping ipv6-protocol-fields-state { + description + "Operational state data for IPv6 match fields"; + } + + grouping ipv6-protocol-fields-top { + description + "Top-level grouping for IPv6 match fields"; + + container ipv6 { + description + "Top-level container for IPv6 match field data"; + + container config { + description + "Configuration data for IPv6 match fields"; + + uses ipv6-protocol-fields-config; + } + + container state { + + config false; + + description + "Operational state data for IPv6 match fields"; + + uses ipv6-protocol-fields-config; + uses ipv6-protocol-fields-state; + } + } + } + + // Transport fields + grouping transport-fields-config { + description + "Configuration data of transport-layer packet fields"; + + leaf source-port { + type oc-pkt-match-types:port-num-range; + description + "Source port or range"; + } + + leaf destination-port { + type oc-pkt-match-types:port-num-range; + description + "Destination port or range"; + } + + leaf-list tcp-flags { + type identityref { + base oc-pkt-match-types:TCP_FLAGS; + } + description + "List of TCP flags to match"; + } + } + + grouping transport-fields-state { + description + "State data of transport-fields"; + } + + grouping transport-fields-top { + description + "Destination transport-fields top level grouping"; + + container transport { + description + "Transport fields container"; + + container config { + description + "Configuration data"; + uses transport-fields-config; + } + + container state { + config false; + description + "State data"; + uses transport-fields-config; + uses transport-fields-state; + } + } + } + +} diff --git a/models/yang/common/openconfig-platform-types.yang b/models/yang/common/openconfig-platform-types.yang new file mode 100644 index 0000000000..8dc3ffc1fd --- /dev/null +++ b/models/yang/common/openconfig-platform-types.yang @@ -0,0 +1,347 @@ +module openconfig-platform-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/platform-types"; + + prefix "oc-platform-types"; + + import openconfig-types { prefix oc-types; } + import openconfig-extensions { prefix oc-ext; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines data types (e.g., YANG identities) + to support the OpenConfig component inventory model."; + + oc-ext:openconfig-version "1.0.0"; + + revision "2019-06-03" { + description + "Add OpenConfig component operating system patch type."; + reference "1.0.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.10.1"; + } + + revision "2018-11-16" { + description + "Added FEC_MODE_TYPE and FEC_STATUS_TYPE"; + reference "0.10.0"; + } + + revision "2018-05-05" { + description + "Added min-max-time to + avg-min-max-instant-stats-precision1-celsius, + added new CONTROLLER_CARD identity"; + reference "0.9.0"; + } + + revision "2018-01-16" { + description + "Added new per-component common data; add temp alarm"; + reference "0.8.0"; + } + + revision "2017-12-14" { + description + "Added anchor containers for component data, added new + component types"; + reference "0.7.0"; + } + + revision "2017-08-16" { + description + "Added power state enumerated type"; + reference "0.6.0"; + } + + revision "2016-12-22" { + description + "Added temperature state variable to component"; + reference "0.5.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // grouping statements + + + grouping avg-min-max-instant-stats-precision1-celsius { + description + "Common grouping for recording temperature values in + Celsius with 1 decimal precision. Values include the + instantaneous, average, minimum, and maximum statistics"; + + leaf instant { + type decimal64 { + fraction-digits 1; + } + units celsius; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 1; + } + units celsius; + description + "The arithmetic mean value of the statistic over the + sampling period."; + } + + leaf min { + type decimal64 { + fraction-digits 1; + } + units celsius; + description + "The minimum value of the statistic over the sampling + period"; + } + + leaf max { + type decimal64 { + fraction-digits 1; + } + units celsius; + description + "The maximum value of the statistic over the sampling + period"; + } + + uses oc-types:stat-interval-state; + uses oc-types:min-max-time; + } + + // identity statements + + identity OPENCONFIG_HARDWARE_COMPONENT { + description + "Base identity for hardware related components in a managed + device. Derived identities are partially based on contents + of the IANA Entity MIB."; + reference + "IANA Entity MIB and RFC 6933"; + } + + + identity OPENCONFIG_SOFTWARE_COMPONENT { + description + "Base identity for software-related components in a managed + device"; + } + + // hardware types + + identity CHASSIS { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Chassis component, typically with multiple slots / shelves"; + } + + identity BACKPLANE { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Backplane component for aggregating traffic, typically + contained in a chassis component"; + } + + identity FABRIC { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Interconnect between ingress and egress ports on the + device (e.g., a crossbar switch)."; + } + + identity POWER_SUPPLY { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Component that is supplying power to the device"; + } + + identity FAN { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Cooling fan, or could be some other heat-reduction component"; + } + + identity SENSOR { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Physical sensor, e.g., a temperature sensor in a chassis"; + } + + identity FRU { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Replaceable hardware component that does not have a more + specific defined schema."; + } + + identity LINECARD { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Linecard component, typically inserted into a chassis slot"; + } + + identity CONTROLLER_CARD { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "A type of linecard whose primary role is management or control + rather than data forwarding."; + } + + identity PORT { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Physical port, e.g., for attaching pluggables and networking + cables"; + } + + identity TRANSCEIVER { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Pluggable module present in a port"; + } + + identity CPU { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Processing unit, e.g., a management processor"; + } + + identity STORAGE { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "A storage subsystem on the device (disk, SSD, etc.)"; + } + + identity INTEGRATED_CIRCUIT { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "A special purpose processing unit, typically for traffic + switching/forwarding (e.g., switching ASIC, NPU, forwarding + chip, etc.)"; + } + + identity OPERATING_SYSTEM { + base OPENCONFIG_SOFTWARE_COMPONENT; + description + "Operating system running on a component"; + } + + identity OPERATING_SYSTEM_UPDATE { + base OPENCONFIG_SOFTWARE_COMPONENT; + description + "An operating system update - which should be a subcomponent + of the `OPERATING_SYSTEM` running on a component. An update is + defined to be a set of software changes that are atomically + installed (and uninstalled) together. Multiple updates may be + present for the Operating System. A system should not list all + installed software packages using this type -- but rather + updates that are bundled together as a single installable + item"; + } + + identity COMPONENT_OPER_STATUS { + description + "Current operational status of a platform component"; + } + + identity ACTIVE { + base COMPONENT_OPER_STATUS; + description + "Component is enabled and active (i.e., up)"; + } + + identity INACTIVE { + base COMPONENT_OPER_STATUS; + description + "Component is enabled but inactive (i.e., down)"; + } + + identity DISABLED { + base COMPONENT_OPER_STATUS; + description + "Component is administratively disabled."; + } + + identity FEC_MODE_TYPE { + description + "Base identity for FEC operational modes."; + } + + identity FEC_ENABLED { + base FEC_MODE_TYPE; + description + "FEC is administratively enabled."; + } + + identity FEC_DISABLED { + base FEC_MODE_TYPE; + description + "FEC is administratively disabled."; + } + + identity FEC_AUTO { + base FEC_MODE_TYPE; + description + "System will determine whether to enable or disable + FEC on a transceiver."; + } + + identity FEC_STATUS_TYPE { + description + "Base identity for FEC operational statuses."; + } + + identity FEC_STATUS_LOCKED { + base FEC_STATUS_TYPE; + description + "FEC is operationally locked."; + } + + identity FEC_STATUS_UNLOCKED { + base FEC_STATUS_TYPE; + description + "FEC is operationally unlocked."; + } + + // typedef statements + + typedef component-power-type { + type enumeration { + enum POWER_ENABLED { + description + "Enable power on the component"; + } + enum POWER_DISABLED { + description + "Disable power on the component"; + } + } + description + "A generic type reflecting whether a hardware component + is powered on or off"; + } + +} diff --git a/models/yang/common/openconfig-procmon.yang b/models/yang/common/openconfig-procmon.yang new file mode 100644 index 0000000000..3c1013f47b --- /dev/null +++ b/models/yang/common/openconfig-procmon.yang @@ -0,0 +1,175 @@ +module openconfig-procmon { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/system/procmon"; + + prefix "oc-proc"; + + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + import openconfig-types { prefix oc-types; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module provides data definitions for process health + monitoring of one or more processes running on the system."; + + oc-ext:openconfig-version "0.3.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.3.1"; + } + + revision "2017-09-18" { + description + "Updated to use OpenConfig types modules"; + reference "0.3.0"; + } + + revision "2017-07-06" { + description + "Move to oc-inet types, add IETF attribution, add RADIUS + counters, changed password leaf names to indicate hashed"; + reference "0.2.0"; + } + + revision "2017-01-29" { + description + "Initial public release"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // grouping statements + + grouping procmon-processes-top { + description + "Top level grouping for attributes for processes."; + + container processes { + description + "Parameters related to all monitored processes"; + + list process { + key "pid"; + config false; + description + "List of monitored processes"; + + leaf pid { + type leafref { + path "../state/pid"; + } + description + "Reference to the process pid key"; + } + + container state { + config false; + description + "State parameters related to monitored processes"; + + uses procmon-process-attributes-state; + } + } + } + } + + grouping procmon-process-attributes-state { + description + "Attributes state definitions for a process"; + + leaf pid { + type uint64; + description + "The process pid"; + } + + leaf name { + type string; + description + "The process name"; + } + + leaf-list args { + type string; + description + "Current process command line arguments. Arguments with + a parameter (e.g., --option 10 or -option=10) should be + represented as a single element of the list with the + argument name and parameter together. Flag arguments, i.e., + those without a parameter should also be in their own list + element."; + } + + leaf start-time { + type uint64; + units "ns"; + description + "The time at which this process started, + reported as nanoseconds since the UNIX epoch. The + system must be synchronized such that the start-time + can be reported accurately, otherwise it should not be + reported."; + } + + leaf uptime { + type oc-types:timeticks64; + description + "Amount of time elapsed since this process started."; + } + + leaf cpu-usage-user { + type oc-types:timeticks64; + description + "CPU time consumed by this process in user mode."; + } + + leaf cpu-usage-system { + type oc-types:timeticks64; + description + "CPU time consumed by this process in kernel mode."; + } + + leaf cpu-utilization { + type oc-types:percentage; + description + "The percentage of CPU that is being used by the process."; + } + + leaf memory-usage { + type uint64; + units "bytes"; + description + "Bytes allocated and still in use by the process"; + } + + leaf memory-utilization { + type oc-types:percentage; + description + "The percentage of RAM that is being used by the process."; + } + } + + // augment statements + + // rpc statements + + // notification statements +} diff --git a/models/yang/common/openconfig-system-logging.yang b/models/yang/common/openconfig-system-logging.yang new file mode 100644 index 0000000000..1602cb1c66 --- /dev/null +++ b/models/yang/common/openconfig-system-logging.yang @@ -0,0 +1,503 @@ +module openconfig-system-logging { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/system/logging"; + + prefix "oc-log"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + import openconfig-inet-types { prefix oc-inet; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines configuration and operational state data + for common logging facilities on network systems."; + + oc-ext:openconfig-version "0.3.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.3.1"; + } + + revision "2017-09-18" { + description + "Updated to use OpenConfig types modules"; + reference "0.3.0"; + } + + revision "2017-07-06" { + description + "Move to oc-inet types, add IETF attribution, add RADIUS + counters, changed password leaf names to indicate hashed"; + reference "0.2.0"; + } + + revision "2017-01-29" { + description + "Initial public release"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // extension statements + + // feature statements + + // identity statements + + identity SYSLOG_FACILITY { + description + "Base identity for Syslog message facilities."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity ALL { + base SYSLOG_FACILITY; + description + "All supported facilities"; + } + + identity KERNEL { + base SYSLOG_FACILITY; + description + "The facility for kernel messages"; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity USER { + base SYSLOG_FACILITY; + description + "The facility for user-level messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity MAIL { + base SYSLOG_FACILITY; + description + "The facility for the mail system."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity SYSTEM_DAEMON { + base SYSLOG_FACILITY; + description + "The facility for the system daemons."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity AUTH { + base SYSLOG_FACILITY; + description + "The facility for security/authorization messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity SYSLOG { + base SYSLOG_FACILITY; + description + "The facility for messages generated internally by syslogd + facility."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity AUTHPRIV { + base SYSLOG_FACILITY; + description + "The facility for privileged security/authorization messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + + identity NTP { + base SYSLOG_FACILITY; + description + "The facility for the NTP subsystem."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity AUDIT { + base SYSLOG_FACILITY; + description + "The facility for log audit messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity CONSOLE { + base SYSLOG_FACILITY; + description + "The facility for log alert messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity LOCAL0 { + base SYSLOG_FACILITY; + description + "The facility for local use 0 messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity LOCAL1 { + base SYSLOG_FACILITY; + description + "The facility for local use 1 messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity LOCAL2 { + base SYSLOG_FACILITY; + description + "The facility for local use 2 messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity LOCAL3 { + base SYSLOG_FACILITY; + description + "The facility for local use 3 messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity LOCAL4 { + base SYSLOG_FACILITY; + description + "The facility for local use 4 messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity LOCAL5 { + base SYSLOG_FACILITY; + description + "The facility for local use 5 messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity LOCAL6 { + base SYSLOG_FACILITY; + description + "The facility for local use 6 messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity LOCAL7 { + base SYSLOG_FACILITY; + description + "The facility for local use 7 messages."; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + identity LOG_DESTINATION_TYPE { + description + "Base identity for destination for logging messages"; + } + + identity DEST_CONSOLE { + base LOG_DESTINATION_TYPE; + description + "Directs log messages to the console"; + } + + identity DEST_BUFFER { + base LOG_DESTINATION_TYPE; + description + "Directs log messages to and in-memory circular buffer"; + } + + identity DEST_FILE { + base LOG_DESTINATION_TYPE; + description + "Directs log messages to a local file"; + } + + identity DEST_REMOTE { + base LOG_DESTINATION_TYPE; + description + "Directs log messages to a remote syslog server"; + } + + // typedef statements + + typedef syslog-severity { + type enumeration { + enum EMERGENCY { + description + "Emergency: system is unusable (0)"; + } + enum ALERT { + description + "Alert: action must be taken immediately (1)"; + } + enum CRITICAL { + description + "Critical: critical conditions (2)"; + } + enum ERROR { + description + "Error: error conditions (3)"; + } + enum WARNING { + description + "Warning: warning conditions (4)"; + } + enum NOTICE { + description + "Notice: normal but significant condition(5)"; + } + enum INFORMATIONAL { + description + "Informational: informational messages (6)"; + } + enum DEBUG { + description + "Debug: debug-level messages (7)"; + } + } + description + "Syslog message severities"; + reference + "IETF RFC 5424 - The Syslog Protocol"; + } + + // grouping statements + + grouping logging-selectors-config { + description + "Configuration data for logging selectors"; + + leaf facility { + type identityref { + base SYSLOG_FACILITY; + } + description + "Specifies the facility, or class of messages to log"; + } + + leaf severity { + type syslog-severity; + description + "Specifies that only messages of the given severity (or + greater severity) for the corresonding facility are logged"; + } + } + + grouping logging-selectors-state { + description + "Operational state data for logging selectors"; + } + + grouping logging-selectors-top { + description + "Top-level grouping for the logging selector list"; + + container selectors { + description + "Enclosing container "; + + list selector { + key "facility severity"; + description + "List of selectors for log messages"; + + leaf facility { + type leafref { + path "../config/facility"; + } + description + "Reference to facility list key"; + } + + leaf severity { + type leafref { + path "../config/severity"; + } + description + "Reference to severity list key"; + } + + container config { + description + "Configuration data "; + + uses logging-selectors-config; + } + + container state { + + config false; + + description + "Operational state data "; + + uses logging-selectors-config; + uses logging-selectors-state; + } + } + } + } + + grouping logging-console-config { + description + "Configuration data for console logging"; + } + + grouping logging-console-state { + description + "Operational state data for console logging"; + } + + grouping logging-console-top { + description + "Top-level grouping for console logging data"; + + container console { + description + "Top-level container for data related to console-based + logging"; + + container config { + description + "Configuration data for console logging"; + + uses logging-console-config; + } + + container state { + + config false; + + description + "Operational state data for console logging"; + + uses logging-console-config; + uses logging-console-state; + } + + uses logging-selectors-top; + } + } + + grouping logging-remote-config { + description + "Configuration data for remote log servers"; + + leaf host { + type oc-inet:host; + description + "IP address or hostname of the remote log server"; + } + + leaf source-address { + type oc-inet:ip-address; + description + "Source IP address for packets to the log server"; + } + + leaf remote-port { + type oc-inet:port-number; + default 514; + description + "Sets the destination port number for syslog UDP messages to + the server. The default for syslog is 514."; + } + } + + grouping logging-remote-state { + description + "Operational state data for remote log servers"; + } + + grouping logging-remote-top { + description + "Top-level grouping for remote log servers"; + + container remote-servers { + description + "Enclosing container for the list of remote log servers"; + + list remote-server { + key "host"; + description + "List of remote log servers"; + + leaf host { + type leafref { + path "../config/host"; + } + description + "Reference to the host list key"; + } + + container config { + description + "Configuration data for remote log servers"; + + uses logging-remote-config; + } + + container state { + + config false; + + description + "Operational state data for remote log servers"; + + uses logging-remote-config; + uses logging-remote-state; + } + uses logging-selectors-top; + } + } + } + + grouping logging-top { + description + "Top-level grouping for logging data"; + + container logging { + description + "Top-level container for data related to logging / syslog"; + + uses logging-console-top; + uses logging-remote-top; + } + } + // data definition statements + + // augment statements + + +} \ No newline at end of file diff --git a/models/yang/common/openconfig-system-management.yang b/models/yang/common/openconfig-system-management.yang new file mode 100644 index 0000000000..00494b7a76 --- /dev/null +++ b/models/yang/common/openconfig-system-management.yang @@ -0,0 +1,138 @@ +module openconfig-system-management { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/system/management"; + + prefix "oc-sys-mgmt"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + import openconfig-inet-types { prefix oc-inet; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines configuration and operational state data + related to management services."; + + oc-ext:openconfig-version "0.1.2"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.1.2"; + } + + revision "2018-08-28" { + description + "Update description of the ANY enum."; + reference "0.1.1"; + } + + revision "2018-07-26" { + description + "Initial public release"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // identity statements + + // typedef statements + + // grouping statements + + grouping system-grpc-server-config { + description + "Configuration data for the gRPC server"; + + leaf enable { + type boolean; + default true; + description + "Enables the gRPC server. The gRPC server is enabled by + default"; + } + + leaf port { + type oc-inet:port-number; + default 9339; + description + "TCP port on which the gRPC server should listen"; + } + + leaf transport-security { + type boolean; + description + "Enables gRPC transport security (e.g., TLS or SSL)"; + } + + leaf certificate-id { + type string; + description + "The certificate ID to be used for authentication"; + } + + leaf-list listen-addresses { + type union { + type oc-inet:ip-address; + type enumeration { + enum ANY { + description + "The gRPC daemon should listen on any address + bound to an interface on the system."; + } + } + } + description + "The IP addresses that the gRPC server should listen + on. This may be an IPv4 or an IPv6 address"; + } + } + + grouping system-grpc-server-top { + description + "Top-level grouping for system gRPC server data"; + + container grpc-server { + description + "Top-level container for the gRPC server"; + + container config { + description + "Configuration data for the system gRPC server"; + + uses system-grpc-server-config; + } + + container state { + config false; + + description + "Operational state data for the system gRPC server"; + + uses system-grpc-server-config; + } + } + } + + // data definition statements + + // augment statements + + // rpc statements + + // notification statements + +} diff --git a/models/yang/common/openconfig-system-terminal.yang b/models/yang/common/openconfig-system-terminal.yang new file mode 100644 index 0000000000..b34811c999 --- /dev/null +++ b/models/yang/common/openconfig-system-terminal.yang @@ -0,0 +1,249 @@ +module openconfig-system-terminal { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/system/terminal"; + + prefix "oc-sys-term"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines configuration and operational state data + related to remote terminal services such as ssh and telnet."; + + oc-ext:openconfig-version "0.3.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.3.1"; + } + + revision "2017-09-18" { + description + "Updated to use OpenConfig types modules"; + reference "0.3.0"; + } + + revision "2017-07-06" { + description + "Move to oc-inet types, add IETF attribution, add RADIUS + counters, changed password leaf names to indicate hashed"; + reference "0.2.0"; + } + + revision "2017-01-29" { + description + "Initial public release"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // identity statements + + // typedef statements + + // grouping statements + + grouping system-terminal-common-config { + description + "Common configuration data for terminal services"; + + leaf timeout { + type uint16; + units seconds; + description + "Set the idle timeout in seconds on terminal connections to + the system for the protocol."; + } + + leaf rate-limit { + type uint16; + units "conn/min"; + description + "Set a limit on the number of connection attempts per + minute to the system for the protocol."; + } + + leaf session-limit { + type uint16; + description + "Set a limit on the number of simultaneous active terminal + sessions to the system for the protocol (e.g., ssh, + telnet, ...) "; + } + } + + grouping system-terminal-common-state { + description + "Common operational state data for terminal services"; + } + + grouping system-terminal-common-top { + description + "Top-level grouping for common terminal service data"; + + container terminal-servers { + description + "Top-level container for terminal services"; + + container config { + description + "Configuration data for terminal services"; + + uses system-terminal-common-config; + } + + container state { + + config false; + + description + "Operational state data "; + + uses system-terminal-common-config; + uses system-terminal-common-state; + } + } + } + + grouping system-ssh-server-config { + description + "Configuration data for system ssh configuration"; + + leaf enable { + type boolean; + default true; + description + "Enables the ssh server. The ssh server is enabled by + default."; + } + + leaf protocol-version { + type enumeration { + enum V2 { + description + "Use SSH v2 only"; + } + enum V1 { + description + "Use SSH v1 only"; + } + enum V1_V2 { + description + "Use either SSH v1 or v2"; + } + } + default V2; + description + "Set the protocol version for SSH connections to the system"; + } + + uses system-terminal-common-config; + } + + grouping system-ssh-server-state { + description + "Operational state data for ssh server"; + } + + grouping system-ssh-server-top { + description + "Top-level grouping for ssh server data"; + + container ssh-server { + description + "Top-level container for ssh server"; + + container config { + description + "Configuration data for the system ssh server"; + + uses system-ssh-server-config; + } + + container state { + + config false; + + description + "Operational state data for the system ssh server"; + + uses system-ssh-server-config; + uses system-ssh-server-state; + } + } + } + + grouping system-telnet-server-config { + description + "Configuration data for telnet server"; + + leaf enable { + type boolean; + default false; + description + "Enables the telnet server. Telnet is disabled by + default"; + } + uses system-terminal-common-config; + + } + + grouping system-telnet-server-state { + description + "Operational state data for telnet server"; + } + + grouping system-telnet-server-top { + description + "Top-level grouping for telnet server "; + + container telnet-server { + description + "Top-level container for telnet terminal servers"; + + container config { + description + "Configuration data for telnet"; + + uses system-telnet-server-config; + } + + container state { + + config false; + + description + "Operational state data for telnet"; + + uses system-telnet-server-config; + uses system-telnet-server-state; + } + } + } + + // data definition statements + + // augment statements + + // rpc statements + + // notification statements + +} \ No newline at end of file diff --git a/models/yang/common/openconfig-types.yang b/models/yang/common/openconfig-types.yang new file mode 100644 index 0000000000..a7ba45d91b --- /dev/null +++ b/models/yang/common/openconfig-types.yang @@ -0,0 +1,466 @@ +module openconfig-types { + yang-version "1"; + + namespace "http://openconfig.net/yang/openconfig-types"; + + prefix "oc-types"; + + // import statements + import openconfig-extensions { prefix oc-ext; } + + // meta + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module contains a set of general type definitions that + are used across OpenConfig models. It can be imported by modules + that make use of these types."; + + oc-ext:openconfig-version "0.5.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.5.1"; + } + + revision "2018-05-05" { + description + "Add grouping of min-max-time and + included them to all stats with min/max/avg"; + reference "0.5.0"; + } + + revision "2018-01-16" { + description + "Add interval to min/max/avg stats; add percentage stat"; + reference "0.4.0"; + } + + revision "2017-08-16" { + description + "Apply fix for ieetfloat32 length parameter"; + reference "0.3.3"; + } + + revision "2017-01-13" { + description + "Add ADDRESS_FAMILY identity"; + reference "0.3.2"; + } + + revision "2016-11-14" { + description + "Correct length of ieeefloat32"; + reference "0.3.1"; + } + + revision "2016-11-11" { + description + "Additional types - ieeefloat32 and routing-password"; + reference "0.3.0"; + } + + revision "2016-05-31" { + description + "OpenConfig public release"; + reference "0.2.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + typedef percentage { + type uint8 { + range "0..100"; + } + description + "Integer indicating a percentage value"; + } + + typedef std-regexp { + type string; + description + "This type definition is a placeholder for a standard + definition of a regular expression that can be utilised in + OpenConfig models. Further discussion is required to + consider the type of regular expressions that are to be + supported. An initial proposal is POSIX compatible."; + } + + typedef timeticks64 { + type uint64; + description + "This type is based on the timeticks type defined in + RFC 6991, but with 64-bit width. It represents the time, + modulo 2^64, in hundredths of a second between two epochs."; + reference + "RFC 6991 - Common YANG Data Types"; + } + + typedef ieeefloat32 { + type binary { + length "4"; + } + description + "An IEEE 32-bit floating point number. The format of this number + is of the form: + 1-bit sign + 8-bit exponent + 23-bit fraction + The floating point value is calculated using: + (-1)**S * 2**(Exponent-127) * (1+Fraction)"; + } + + typedef routing-password { + type string; + description + "This type is indicative of a password that is used within + a routing protocol which can be returned in plain text to the + NMS by the local system. Such passwords are typically stored + as encrypted strings. Since the encryption used is generally + well known, it is possible to extract the original value from + the string - and hence this format is not considered secure. + Leaves specified with this type should not be modified by + the system, and should be returned to the end-user in plain + text. This type exists to differentiate passwords, which + may be sensitive, from other string leaves. It could, for + example, be used by the NMS to censor this data when + viewed by particular users."; + } + + typedef stat-interval { + type uint64; + units nanoseconds; + description + "A time interval over which a set of statistics is computed. + A common usage is to report the interval over which + avg/min/max stats are computed and reported."; + } + + grouping stat-interval-state { + description + "Reusable leaf definition for stats computation interval"; + + leaf interval { + type oc-types:stat-interval; + description + "If supported by the system, this reports the time interval + over which the min/max/average statistics are computed by + the system."; + } + } + + grouping min-max-time { + description + "Common grouping for recording the absolute time at which + the minimum and maximum values occurred in the statistics"; + + leaf min-time { + type oc-types:timeticks64; + description + "The absolute time at which the minimum value occurred. + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + } + + leaf max-time { + type oc-types:timeticks64; + description + "The absolute time at which the maximum value occurred. + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + } + } + + grouping avg-min-max-stats-precision1 { + description + "Common nodes for recording average, minimum, and + maximum values for a statistic. These values all have + fraction-digits set to 1. Statistics are computed + and reported based on a moving time interval (e.g., the last + 30s). If supported by the device, the time interval over which + the statistics are computed is also reported."; + + leaf avg { + type decimal64 { + fraction-digits 1; + } + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 1; + } + description + "The minimum value of the statistic over the time + interval."; + } + + leaf max { + type decimal64 { + fraction-digits 1; + } + description + "The maximum value of the statitic over the time + interval."; + } + + uses stat-interval-state; + uses min-max-time; + } + + grouping avg-min-max-instant-stats-precision1 { + description + "Common grouping for recording an instantaneous statistic value + in addition to avg-min-max stats"; + + leaf instant { + type decimal64 { + fraction-digits 1; + } + description + "The instantaneous value of the statistic."; + } + + uses avg-min-max-stats-precision1; + } + + grouping avg-min-max-instant-stats-precision2-dB { + description + "Common grouping for recording dB values with 2 decimal + precision. Values include the instantaneous, average, + minimum, and maximum statistics. Statistics are computed + and reported based on a moving time interval (e.g., the last + 30s). If supported by the device, the time interval over which + the statistics are computed, and the times at which the minimum + and maximum values occurred, are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units dB; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units dB; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units dB; + description + "The minimum value of the statistic over the time interval."; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units dB; + description + "The maximum value of the statistic over the time + interval."; + } + + uses stat-interval-state; + uses min-max-time; + } + + grouping avg-min-max-instant-stats-precision2-dBm { + description + "Common grouping for recording dBm values with 2 decimal + precision. Values include the instantaneous, average, + minimum, and maximum statistics. Statistics are computed + and reported based on a moving time interval (e.g., the last + 30s). If supported by the device, the time interval over which + the statistics are computed, and the times at which the minimum + and maximum values occurred, are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "The minimum value of the statistic over the time + interval."; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "The maximum value of the statistic over the time interval."; + } + + uses stat-interval-state; + uses min-max-time; + } + + grouping avg-min-max-instant-stats-precision2-mA { + description + "Common grouping for recording mA values with 2 decimal + precision. Values include the instantaneous, average, + minimum, and maximum statistics. Statistics are computed + and reported based on a moving time interval (e.g., the last + 30s). If supported by the device, the time interval over which + the statistics are computed, and the times at which the minimum + and maximum values occurred, are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units mA; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units mA; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units mA; + description + "The minimum value of the statistic over the time + interval."; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units mA; + description + "The maximum value of the statistic over the time + interval."; + } + + uses stat-interval-state; + uses min-max-time; + } + + grouping avg-min-max-instant-stats-pct { + description + "Common grouping for percentage statistics. + Values include the instantaneous, average, + minimum, and maximum statistics. Statistics are computed + and reported based on a moving time interval (e.g., the last + 30s). If supported by the device, the time interval over which + the statistics are computed, and the times at which the minimum + and maximum values occurred, are also reported."; + + leaf instant { + type oc-types:percentage; + description + "The instantaneous percentage value."; + } + + leaf avg { + type oc-types:percentage; + description + "The arithmetic mean value of the percentage measure of the + statistic over the time interval."; + } + + leaf min { + type oc-types:percentage; + description + "The minimum value of the percentage measure of the + statistic over the time interval."; + } + + leaf max { + type oc-types:percentage; + description + "The maximum value of the percentage measure of the + statistic over the time interval."; + } + + uses stat-interval-state; + uses min-max-time; + } + + identity ADDRESS_FAMILY { + description + "A base identity for all address families"; + } + + identity IPV4 { + base ADDRESS_FAMILY; + description + "The IPv4 address family"; + } + + identity IPV6 { + base ADDRESS_FAMILY; + description + "The IPv6 address family"; + } + + identity MPLS { + base ADDRESS_FAMILY; + description + "The MPLS address family"; + } + + identity L2_ETHERNET { + base ADDRESS_FAMILY; + description + "The 802.3 Ethernet address family"; + } + +} diff --git a/models/yang/common/openconfig-vlan-types.yang b/models/yang/common/openconfig-vlan-types.yang new file mode 100644 index 0000000000..7778e19f0b --- /dev/null +++ b/models/yang/common/openconfig-vlan-types.yang @@ -0,0 +1,206 @@ +module openconfig-vlan-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/vlan-types"; + + prefix "oc-vlan-types"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module defines configuration and state variables for VLANs, + in addition to VLAN parameters associated with interfaces"; + + oc-ext:openconfig-version "3.0.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "3.0.1"; + } + + revision "2018-02-14" { + description + "Fix bug with name of 802.1ad identity."; + reference "3.0.0"; + } + + revision "2017-07-14" { + description + "Move top-level vlan data to network-instance; Update + identities to comply to style guide; fixed pattern + quoting; corrected trunk vlan types; added TPID config to + base interface."; + reference "2.0.0"; + } + + revision "2016-05-26" { + description + "OpenConfig public release"; + reference "1.0.2"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // extension statements + + // feature statements + + // identity statements + + identity TPID_TYPES { + description + "Base identity for TPID values that can override the VLAN + ethertype value"; + } + + identity TPID_0X8100 { + base TPID_TYPES; + description + "Default TPID value for 802.1q single-tagged VLANs."; + } + + identity TPID_0X88A8 { + base TPID_TYPES; + description + "TPID value for 802.1ad provider bridging, QinQ or + stacked VLANs."; + } + + identity TPID_0X9100 { + base TPID_TYPES; + description + "Alternate TPID value"; + } + + identity TPID_0X9200 { + base TPID_TYPES; + description + "Alternate TPID value"; + } + + // typedef statements + + // TODO: typedefs should be defined in a vlan-types.yang file. + typedef vlan-id { + type uint16 { + range 1..4094; + } + description + "Type definition representing a single-tagged VLAN"; + } + + typedef vlan-range { + type string { + // range specified as [lower]..[upper] + pattern '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.\.(409[0-4]|' + + '40[0-8][0-9]|[1-3][0-9]{3}|[1-9][0-9]{1,2}|' + + '[1-9])$'; + } + description + "Type definition representing a range of single-tagged + VLANs. A range is specified as x..y where x and y are + valid VLAN IDs (1 <= vlan-id <= 4094). The range is + assumed to be inclusive, such that any VLAN-ID matching + x <= VLAN-ID <= y falls within the range."; + } + + typedef qinq-id { + type string { + pattern + '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.' + + '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])|\*)$'; + } + description + "Type definition representing a single double-tagged/QinQ VLAN + identifier. The format of a QinQ VLAN-ID is x.y where X is the + 'outer' VLAN identifier, and y is the 'inner' VLAN identifier. + Both x and y must be valid VLAN IDs (1 <= vlan-id <= 4094) + with the exception that y may be equal to a wildcard (*). In + cases where y is set to the wildcard, this represents all inner + VLAN identifiers where the outer VLAN identifier is equal to + x"; + } + + typedef qinq-id-range { + type union { + type string { + // match cases where the range is specified as x..y.z + pattern + '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.\.' + + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.' + + '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])|\*)$'; + } + type string { + // match cases where the range is specified as x.y..z + pattern + '^(\*|(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9]))\.' + + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.\.' + + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])$'; + } + } + description + "A type definition representing a range of double-tagged/QinQ + VLAN identifiers. The format of a QinQ VLAN-ID range can be + specified in three formats. Where the range is outer VLAN IDs + the range is specified as x..y.z. In this case outer VLAN + identifiers meeting the criteria x <= outer-vlan-id <= y are + accepted iff the inner VLAN-ID is equal to y - or any inner-tag + if the wildcard is specified. Alternatively the range can be + specified as x.y..z. In this case only VLANs with an + outer-vlan-id qual to x are accepted (x may again be the + wildcard). Inner VLANs are accepted if they meet the inequality + y <= inner-vlan-id <= z."; + } + + typedef vlan-mode-type { + type enumeration { + enum ACCESS { + description "Access mode VLAN interface (No 802.1q header)"; + } + enum TRUNK { + description "Trunk mode VLAN interface"; + } + } + description + "VLAN interface mode (trunk or access)"; + } + + typedef vlan-ref { + type union { + type vlan-id; + type string; + // TODO: string should be changed to leafref to reference + // an existing VLAN. this is not allowed in YANG 1.0 but + // is expected to be in YANG 1.1. + // type leafref { + // path "vlan:vlans/vlan:vlan/vlan:config/vlan:name"; + // } + } + description + "Reference to a VLAN by name or id"; + } + +} diff --git a/models/yang/common/openconfig-vlan.yang b/models/yang/common/openconfig-vlan.yang new file mode 100644 index 0000000000..1cae824760 --- /dev/null +++ b/models/yang/common/openconfig-vlan.yang @@ -0,0 +1,449 @@ +module openconfig-vlan { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/vlan"; + + prefix "oc-vlan"; + + // import some basic types + import openconfig-vlan-types { prefix oc-vlan-types; } + import openconfig-interfaces { prefix oc-if; } + import openconfig-if-ethernet { prefix oc-eth; } + import openconfig-if-aggregate { prefix oc-lag; } + import iana-if-type { prefix ift; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module defines configuration and state variables for VLANs, + in addition to VLAN parameters associated with interfaces"; + + oc-ext:openconfig-version "3.0.2"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "3.0.2"; + } + + revision "2018-06-05" { + description + "Fix bugs in when statements."; + reference "3.0.1"; + } + + revision "2018-02-14" { + description + "Fix bug with name of 802.1ad identity."; + reference "3.0.0"; + } + + revision "2017-07-14" { + description + "Move top-level vlan data to network-instance; Update + identities to comply to style guide; fixed pattern + quoting; corrected trunk vlan types; added TPID config to + base interface."; + reference "2.0.0"; + } + + revision "2016-05-26" { + description + "OpenConfig public release"; + reference "1.0.2"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // grouping statements + + grouping vlan-config { + description "VLAN configuration container."; + + leaf vlan-id { + type oc-vlan-types:vlan-id; + description "Interface VLAN id."; + } + + leaf name { + type string; + description "Interface VLAN name."; + } + + leaf status { + type enumeration { + enum ACTIVE { + description "VLAN is active"; + } + enum SUSPENDED { + description "VLAN is inactive / suspended"; + } + } + default ACTIVE; + description "Admin state of the VLAN"; + } + + } + + grouping vlan-state { + description "State variables for VLANs"; + + // placeholder + + } + + grouping vlan-tpid-config { + description + "TPID configuration for dot1q-enabled interfaces"; + + leaf tpid { + type identityref { + base oc-vlan-types:TPID_TYPES; + } + default oc-vlan-types:TPID_0X8100; + description + "Optionally set the tag protocol identifier field (TPID) that + is accepted on the VLAN"; + } + } + + grouping vlan-tpid-state { + description + "TPID opstate for dot1q-enabled interfaces"; + + // placeholder + + } + + grouping vlan-members-state { + description + "List of interfaces / subinterfaces belonging to the VLAN."; + + container members { + description + "Enclosing container for list of member interfaces"; + + list member { + config false; + description + "List of references to interfaces / subinterfaces + associated with the VLAN."; + + uses oc-if:base-interface-ref-state; + } + } + } + + grouping vlan-switched-config { + description + "VLAN related configuration that is part of the physical + Ethernet interface."; + + leaf interface-mode { + type oc-vlan-types:vlan-mode-type; + description + "Set the interface to access or trunk mode for + VLANs"; + } + + leaf native-vlan { + when "../interface-mode = 'TRUNK'" { + description + "Native VLAN is valid for trunk mode interfaces"; + } + type oc-vlan-types:vlan-id; + description + "Set the native VLAN id for untagged frames arriving on + a trunk interface. Tagged frames sent on an interface + configured with a native VLAN should have their tags + stripped prior to transmission. This configuration is only + valid on a trunk interface."; + } + + leaf access-vlan { + when "../interface-mode = 'ACCESS'" { + description + "Access VLAN assigned to the interfaces"; + } + type oc-vlan-types:vlan-id; + description + "Assign the access vlan to the access port."; + } + + leaf-list trunk-vlans { + when "../interface-mode = 'TRUNK'" { + description + "Allowed VLANs may be specified for trunk mode + interfaces."; + } + type union { + type oc-vlan-types:vlan-id; + type oc-vlan-types:vlan-range; + } + description + "Specify VLANs, or ranges thereof, that the interface may + carry when in trunk mode. If not specified, all VLANs are + allowed on the interface. Ranges are specified in the form + x..y, where x.'"; + } + } + + grouping acl-interfaces-state { + description + "Operational state data for interface references"; + } + + grouping acl-interfaces-top { + description + "Top-level grouping for interface-specific ACL data"; + + container interfaces { + description + "Enclosing container for the list of interfaces on which + ACLs are set"; + + list interface { + key "id"; + description + "List of interfaces on which ACLs are set"; + + leaf id { + type leafref { + path "../config/id"; + } + description + "Reference to the interface id list key"; + } + + container config { + description + "Configuration for ACL per-interface data"; + + uses acl-interfaces-config; + } + + container state { + + config false; + + description + "Operational state for ACL per-interface data"; + + uses acl-interfaces-config; + uses acl-interfaces-state; + } + + uses oc-if:interface-ref; + uses interface-ingress-acl-top; + uses interface-egress-acl-top; + } + } + } + + grouping acl-config { + description + "Global configuration data for ACLs"; + } + + grouping acl-state { + description + "Global operational state data for ACLs"; + + leaf counter-capability { + type identityref { + base ACL_COUNTER_CAPABILITY; + } + description + "System reported indication of how ACL counters are reported + by the target"; + } + } + grouping acl-top { + description + "Top level grouping for ACL data and structure"; + + container acl { + description + "Top level enclosing container for ACL model config + and operational state data"; + + container config { + description + "Global config data for ACLs"; + + uses acl-config; + } + + container state { + + config false; + + description + "Global operational state data for ACLs"; + + uses acl-config; + uses acl-state; + } + + uses acl-set-top; + uses acl-interfaces-top; + } + } + + // data definition statements + uses acl-top; + + // augment statements + + +} diff --git a/models/yang/openconfig-if-ethernet.yang b/models/yang/openconfig-if-ethernet.yang new file mode 100644 index 0000000000..e917bba4d7 --- /dev/null +++ b/models/yang/openconfig-if-ethernet.yang @@ -0,0 +1,438 @@ +module openconfig-if-ethernet { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/interfaces/ethernet"; + + prefix "oc-eth"; + + // import some basic types + import openconfig-interfaces { prefix oc-if; } + import iana-if-type { prefix ift; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "Model for managing Ethernet interfaces -- augments the OpenConfig + model for interface configuration and state."; + + oc-ext:openconfig-version "2.6.2"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "2.6.2"; + } + + revision "2018-09-04" { + description + "Remove in-crc-align-errors as it is a duplicate of + in-crc-errors"; + reference "2.6.1"; + } + + revision "2018-08-28" { + description + "Add Ethernet counter in-block-errors"; + reference "2.6.0"; + } + + revision "2018-07-02" { + description + "Add new ethernet counters of in-undersize-frames, + in-crc-align-errors and the distribution container"; + reference "2.5.0"; + } + + revision "2018-04-10" { + description + "Add identities for 2.5 and 5 Gbps."; + reference "2.4.0"; + } + + revision "2018-01-05" { + description + "Add logical loopback to interface."; + reference "2.3.0"; + } + + revision "2017-12-21" { + description + "Added IPv6 router advertisement configuration."; + reference "2.1.0"; + } + + revision "2017-07-14" { + description + "Added Ethernet/IP state data; Add dhcp-client; + migrate to OpenConfig types modules; Removed or + renamed opstate values"; + reference "2.0.0"; + } + + revision "2016-12-22" { + description + "Fixes to Ethernet interfaces model"; + reference "1.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // identity statements + + identity ETHERNET_SPEED { + description "base type to specify available Ethernet link + speeds"; + } + + identity SPEED_10MB { + base ETHERNET_SPEED; + description "10 Mbps Ethernet"; + } + + identity SPEED_100MB { + base ETHERNET_SPEED; + description "100 Mbps Ethernet"; + } + + identity SPEED_1GB { + base ETHERNET_SPEED; + description "1 Gbps Ethernet"; + } + + identity SPEED_2500MB { + base ETHERNET_SPEED; + description "2.5 Gbps Ethernet"; + } + + identity SPEED_5GB { + base ETHERNET_SPEED; + description "5 Gbps Ethernet"; + } + + identity SPEED_10GB { + base ETHERNET_SPEED; + description "10 Gbps Ethernet"; + } + + identity SPEED_25GB { + base ETHERNET_SPEED; + description "25 Gbps Ethernet"; + } + + identity SPEED_40GB { + base ETHERNET_SPEED; + description "40 Gbps Ethernet"; + } + + identity SPEED_50GB { + base ETHERNET_SPEED; + description "50 Gbps Ethernet"; + } + + identity SPEED_100GB { + base ETHERNET_SPEED; + description "100 Gbps Ethernet"; + } + + identity SPEED_UNKNOWN { + base ETHERNET_SPEED; + description + "Interface speed is unknown. Systems may report + speed UNKNOWN when an interface is down or unpopuplated (e.g., + pluggable not present)."; + } + + // typedef statements + + + // grouping statements + + grouping ethernet-interface-config { + description "Configuration items for Ethernet interfaces"; + + leaf mac-address { + type oc-yang:mac-address; + description + "Assigns a MAC address to the Ethernet interface. If not + specified, the corresponding operational state leaf is + expected to show the system-assigned MAC address."; + } + + leaf auto-negotiate { + type boolean; + default true; + description + "Set to TRUE to request the interface to auto-negotiate + transmission parameters with its peer interface. When + set to FALSE, the transmission parameters are specified + manually."; + reference + "IEEE 802.3-2012 auto-negotiation transmission parameters"; + } + + leaf duplex-mode { + type enumeration { + enum FULL { + description "Full duplex mode"; + } + enum HALF { + description "Half duplex mode"; + } + } + description + "When auto-negotiate is TRUE, this optionally sets the + duplex mode that will be advertised to the peer. If + unspecified, the interface should negotiate the duplex mode + directly (typically full-duplex). When auto-negotiate is + FALSE, this sets the duplex mode on the interface directly."; + } + + leaf port-speed { + type identityref { + base ETHERNET_SPEED; + } + description + "When auto-negotiate is TRUE, this optionally sets the + port-speed mode that will be advertised to the peer for + negotiation. If unspecified, it is expected that the + interface will select the highest speed available based on + negotiation. When auto-negotiate is set to FALSE, sets the + link speed to a fixed value -- supported values are defined + by ETHERNET_SPEED identities"; + } + + leaf enable-flow-control { + type boolean; + default false; + description + "Enable or disable flow control for this interface. + Ethernet flow control is a mechanism by which a receiver + may send PAUSE frames to a sender to stop transmission for + a specified time. + + This setting should override auto-negotiated flow control + settings. If left unspecified, and auto-negotiate is TRUE, + flow control mode is negotiated with the peer interface."; + reference + "IEEE 802.3x"; + } + } + + grouping ethernet-interface-state-counters { + description + "Ethernet-specific counters and statistics"; + + // ingress counters + + leaf in-mac-control-frames { + type oc-yang:counter64; + description + "MAC layer control frames received on the interface"; + } + + leaf in-mac-pause-frames { + type oc-yang:counter64; + description + "MAC layer PAUSE frames received on the interface"; + } + + leaf in-oversize-frames { + type oc-yang:counter64; + description + "The total number of frames received that were + longer than 1518 octets (excluding framing bits, + but including FCS octets) and were otherwise + well formed."; + } + + leaf in-undersize-frames { + type oc-yang:counter64; + description + "The total number of frames received that were + less than 64 octets long (excluding framing bits, + but including FCS octets) and were otherwise well + formed."; + reference + "RFC 2819: Remote Network Monitoring MIB - + etherStatsUndersizePkts"; + } + + leaf in-jabber-frames { + type oc-yang:counter64; + description + "Number of jabber frames received on the + interface. Jabber frames are typically defined as oversize + frames which also have a bad CRC. Implementations may use + slightly different definitions of what constitutes a jabber + frame. Often indicative of a NIC hardware problem."; + } + + leaf in-fragment-frames { + type oc-yang:counter64; + description + "The total number of frames received that were less than + 64 octets in length (excluding framing bits but including + FCS octets) and had either a bad Frame Check Sequence + (FCS) with an integral number of octets (FCS Error) or a + bad FCS with a non-integral number of octets (Alignment + Error)."; + } + + leaf in-8021q-frames { + type oc-yang:counter64; + description + "Number of 802.1q tagged frames received on the interface"; + } + + leaf in-crc-errors { + type oc-yang:counter64; + description + "The total number of frames received that + had a length (excluding framing bits, but + including FCS octets) of between 64 and 1518 + octets, inclusive, but had either a bad + Frame Check Sequence (FCS) with an integral + number of octets (FCS Error) or a bad FCS with + a non-integral number of octets (Alignment Error)"; + reference + "RFC 2819: Remote Network Monitoring MIB - + etherStatsCRCAlignErrors"; + } + + leaf in-block-errors { + type oc-yang:counter64; + description + "The number of received errored blocks. Error detection codes + are capable of detecting whether one or more errors have + occurred in a given sequence of bits – the block. It is + normally not possible to determine the exact number of errored + bits within the block"; + } + + // egress counters + + leaf out-mac-control-frames { + type oc-yang:counter64; + description + "MAC layer control frames sent on the interface"; + } + + leaf out-mac-pause-frames { + type oc-yang:counter64; + description + "MAC layer PAUSE frames sent on the interface"; + } + + leaf out-8021q-frames { + type oc-yang:counter64; + description + "Number of 802.1q tagged frames sent on the interface"; + } + } + + grouping ethernet-interface-state { + description + "Grouping for defining Ethernet-specific operational state"; + + leaf hw-mac-address { + type oc-yang:mac-address; + description + "Represenets the 'burned-in', or system-assigned, MAC + address for the Ethernet interface."; + } + + leaf negotiated-duplex-mode { + type enumeration { + enum FULL { + description "Full duplex mode"; + } + enum HALF { + description "Half duplex mode"; + } + } + description + "When auto-negotiate is set to TRUE, and the interface has + completed auto-negotiation with the remote peer, this value + shows the duplex mode that has been negotiated."; + } + + leaf negotiated-port-speed { + type identityref { + base ETHERNET_SPEED; + } + description + "When auto-negotiate is set to TRUE, and the interface has + completed auto-negotiation with the remote peer, this value + shows the interface speed that has been negotiated."; + } + + container counters { + description "Ethernet interface counters"; + + uses ethernet-interface-state-counters; + + } + + } + + // data definition statements + + grouping ethernet-top { + description "top-level Ethernet config and state containers"; + + container ethernet { + description + "Top-level container for ethernet configuration + and state"; + + container config { + description "Configuration data for ethernet interfaces"; + + uses ethernet-interface-config; + + } + + container state { + + config false; + description "State variables for Ethernet interfaces"; + + uses ethernet-interface-config; + uses ethernet-interface-state; + + } + + } + } + + // augment statements + + augment "/oc-if:interfaces/oc-if:interface" { + description "Adds addtional Ethernet-specific configuration to + interfaces model"; + + uses ethernet-top { + when "oc-if:state/oc-if:type = 'ift:ethernetCsmacd'" { + description "Additional interface configuration parameters when + the interface type is Ethernet"; + } + } + } + + // rpc statements + + // notification statements + +} diff --git a/models/yang/openconfig-if-ip.yang b/models/yang/openconfig-if-ip.yang new file mode 100644 index 0000000000..df89662f83 --- /dev/null +++ b/models/yang/openconfig-if-ip.yang @@ -0,0 +1,1322 @@ +module openconfig-if-ip { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/interfaces/ip"; + + prefix "oc-ip"; + + // import some basic types + import openconfig-inet-types { prefix oc-inet; } + import openconfig-interfaces { prefix oc-if; } + import openconfig-vlan { prefix oc-vlan; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This model defines data for managing configuration and + operational state on IP (IPv4 and IPv6) interfaces. + + This model reuses data items defined in the IETF YANG model for + interfaces described by RFC 7277 with an alternate structure + (particularly for operational state data) and with + additional configuration items. + + Portions of this code were derived from IETF RFC 7277. + Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "2.3.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "2.3.1"; + } + + revision "2018-01-05" { + description + "Add logical loopback to interface."; + reference "2.3.0"; + } + + revision "2017-12-21" { + description + "Added IPv6 router advertisement configuration."; + reference "2.1.0"; + } + + revision "2017-07-14" { + description + "Added Ethernet/IP state data; Add dhcp-client; + migrate to OpenConfig types modules; Removed or + renamed opstate values"; + reference "2.0.0"; + } + + revision "2017-04-03"{ + description + "Update copyright notice."; + reference "1.1.1"; + } + + revision "2016-12-22" { + description + "Fixes to Ethernet interfaces model"; + reference "1.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // typedef statements + + typedef ip-address-origin { + type enumeration { + enum OTHER { + description + "None of the following."; + } + enum STATIC { + description + "Indicates that the address has been statically + configured - for example, using NETCONF or a Command Line + Interface."; + } + enum DHCP { + description + "Indicates an address that has been assigned to this + system by a DHCP server."; + } + enum LINK_LAYER { + description + "Indicates an address created by IPv6 stateless + autoconfiguration that embeds a link-layer address in its + interface identifier."; + } + enum RANDOM { + description + "Indicates an address chosen by the system at + random, e.g., an IPv4 address within 169.254/16, an + RFC 4941 temporary address, or an RFC 7217 semantically + opaque address."; + reference + "RFC 4941: Privacy Extensions for Stateless Address + Autoconfiguration in IPv6 + RFC 7217: A Method for Generating Semantically Opaque + Interface Identifiers with IPv6 Stateless + Address Autoconfiguration (SLAAC)"; + } + } + description + "The origin of an address."; + } + + typedef neighbor-origin { + type enumeration { + enum OTHER { + description + "None of the following."; + } + enum STATIC { + description + "Indicates that the mapping has been statically + configured - for example, using NETCONF or a Command Line + Interface."; + } + enum DYNAMIC { + description + "Indicates that the mapping has been dynamically resolved + using, e.g., IPv4 ARP or the IPv6 Neighbor Discovery + protocol."; + } + } + description + "The origin of a neighbor entry."; + } + + // grouping statements + + grouping ip-common-global-config { + description + "Shared configuration data for IPv4 or IPv6 assigned + globally on an interface."; + + leaf dhcp-client { + type boolean; + default false; + description + "Enables a DHCP client on the interface in order to request + an address"; + } + } + + grouping ip-common-counters-state { + description + "Operational state for IP traffic statistics for IPv4 and + IPv6"; + + container counters { + description + "Packet and byte counters for IP transmission and + reception for the address family."; + + + leaf in-pkts { + type oc-yang:counter64; + description + "The total number of IP packets received for the specified + address family, including those received in error"; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-octets { + type oc-yang:counter64; + description + "The total number of octets received in input IP packets + for the specified address family, including those received + in error."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-error-pkts { + // TODO: this counter combines several error conditions -- + // could consider breaking them out to separate leaf nodes + type oc-yang:counter64; + description + "Number of IP packets discarded due to errors for the + specified address family, including errors in the IP + header, no route found to the IP destination, invalid + address, unknown protocol, etc."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-forwarded-pkts { + type oc-yang:counter64; + description + "The number of input packets for which the device was not + their final IP destination and for which the device + attempted to find a route to forward them to that final + destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-forwarded-octets { + type oc-yang:counter64; + description + "The number of octets received in input IP packets + for the specified address family for which the device was + not their final IP destination and for which the + device attempted to find a route to forward them to that + final destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-discarded-pkts { + type oc-yang:counter64; + description + "The number of input IP packets for the + specified address family, for which no problems were + encountered to prevent their continued processing, but + were discarded (e.g., for lack of buffer space)."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-pkts { + type oc-yang:counter64; + description + "The total number of IP packets for the + specified address family that the device supplied + to the lower layers for transmission. This includes + packets generated locally and those forwarded by the + device."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-octets { + type oc-yang:counter64; + description + "The total number of octets in IP packets for the + specified address family that the device + supplied to the lower layers for transmission. This + includes packets generated locally and those forwarded by + the device."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-error-pkts { + // TODO: this counter combines several error conditions -- + // could consider breaking them out to separate leaf nodes + type oc-yang:counter64; + description + "Number of IP packets for the specified address family + locally generated and discarded due to errors, including + no route found to the IP destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-forwarded-pkts { + type oc-yang:counter64; + description + "The number of packets for which this entity was not their + final IP destination and for which it was successful in + finding a path to their final destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-forwarded-octets { + type oc-yang:counter64; + description + "The number of octets in packets for which this entity was + not their final IP destination and for which it was + successful in finding a path to their final destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-discarded-pkts { + type oc-yang:counter64; + description + "The number of output IP packets for the + specified address family for which no problem was + encountered to prevent their transmission to their + destination, but were discarded (e.g., for lack of + buffer space)."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + } + + } + + + + grouping ipv4-global-config { + description + "Configuration data for IPv4 interfaces across + all addresses assigned to the interface"; + + leaf enabled { + type boolean; + default true; + description + "Controls whether IPv4 is enabled or disabled on this + interface. When IPv4 is enabled, this interface is + connected to an IPv4 stack, and the interface can send + and receive IPv4 packets."; + } + + leaf mtu { + type uint16 { + range "68..max"; + } + units octets; + description + "The size, in octets, of the largest IPv4 packet that the + interface will send and receive. + + The server may restrict the allowed values for this leaf, + depending on the interface's type. + + If this leaf is not configured, the operationally used MTU + depends on the interface's type."; + reference + "RFC 791: Internet Protocol"; + } + + uses ip-common-global-config; + + + } + + grouping ipv4-address-config { + + description + "Per IPv4 adresss configuration data for the + interface."; + + leaf ip { + type oc-inet:ipv4-address; + description + "The IPv4 address on the interface."; + } + + leaf prefix-length { + type uint8 { + range "0..32"; + } + description + "The length of the subnet prefix."; + } + } + + grouping ipv4-neighbor-config { + description + "Per IPv4 neighbor configuration data. Neighbor + entries are analagous to static ARP entries, i.e., they + create a correspondence between IP and link-layer addresses"; + + leaf ip { + type oc-inet:ipv4-address; + description + "The IPv4 address of the neighbor node."; + } + leaf link-layer-address { + type oc-yang:phys-address; + mandatory true; + description + "The link-layer address of the neighbor node."; + } + } + + grouping ipv4-address-state { + description + "State variables for IPv4 addresses on the interface"; + + leaf origin { + type ip-address-origin; + description + "The origin of this address, e.g., statically configured, + assigned by DHCP, etc.."; + } + } + + grouping ipv4-neighbor-state { + description + "State variables for IPv4 neighbor entries on the interface."; + + leaf origin { + type neighbor-origin; + description + "The origin of this neighbor entry, static or dynamic."; + } + } + + grouping ipv6-global-config { + description + "Configuration data at the global level for each + IPv6 interface"; + + leaf enabled { + type boolean; + default true; + description + "Controls whether IPv6 is enabled or disabled on this + interface. When IPv6 is enabled, this interface is + connected to an IPv6 stack, and the interface can send + and receive IPv6 packets."; + } + + leaf mtu { + type uint32 { + range "1280..max"; + } + units octets; + description + "The size, in octets, of the largest IPv6 packet that the + interface will send and receive. + + The server may restrict the allowed values for this leaf, + depending on the interface's type. + + If this leaf is not configured, the operationally used MTU + depends on the interface's type."; + reference + "RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + Section 5"; + } + + leaf dup-addr-detect-transmits { + type uint32; + default 1; + description + "The number of consecutive Neighbor Solicitation messages + sent while performing Duplicate Address Detection on a + tentative address. A value of zero indicates that + Duplicate Address Detection is not performed on + tentative addresses. A value of one indicates a single + transmission with no follow-up retransmissions."; + reference + "RFC 4862: IPv6 Stateless Address Autoconfiguration"; + } + + uses ip-common-global-config; + } + + grouping ipv6-address-config { + description "Per-address configuration data for IPv6 interfaces"; + + leaf ip { + type oc-inet:ipv6-address; + description + "The IPv6 address on the interface."; + } + + leaf prefix-length { + type uint8 { + range "0..128"; + } + mandatory true; + description + "The length of the subnet prefix."; + } + } + + grouping ipv6-address-state { + description + "Per-address operational state data for IPv6 interfaces"; + + leaf origin { + type ip-address-origin; + description + "The origin of this address, e.g., static, dhcp, etc."; + } + + leaf status { + type enumeration { + enum PREFERRED { + description + "This is a valid address that can appear as the + destination or source address of a packet."; + } + enum DEPRECATED { + description + "This is a valid but deprecated address that should + no longer be used as a source address in new + communications, but packets addressed to such an + address are processed as expected."; + } + enum INVALID { + description + "This isn't a valid address, and it shouldn't appear + as the destination or source address of a packet."; + } + enum INACCESSIBLE { + description + "The address is not accessible because the interface + to which this address is assigned is not + operational."; + } + enum UNKNOWN { + description + "The status cannot be determined for some reason."; + } + enum TENTATIVE { + description + "The uniqueness of the address on the link is being + verified. Addresses in this state should not be + used for general communication and should only be + used to determine the uniqueness of the address."; + } + enum DUPLICATE { + description + "The address has been determined to be non-unique on + the link and so must not be used."; + } + enum OPTIMISTIC { + description + "The address is available for use, subject to + restrictions, while its uniqueness on a link is + being verified."; + } + } + description + "The status of an address. Most of the states correspond + to states from the IPv6 Stateless Address + Autoconfiguration protocol."; + reference + "RFC 4293: Management Information Base for the + Internet Protocol (IP) + - IpAddressStatusTC + RFC 4862: IPv6 Stateless Address Autoconfiguration"; + } + } + + grouping ipv6-neighbor-config { + description + "Per-neighbor configuration data for IPv6 interfaces"; + + leaf ip { + type oc-inet:ipv6-address; + description + "The IPv6 address of the neighbor node."; + } + + leaf link-layer-address { + type oc-yang:phys-address; + mandatory true; + description + "The link-layer address of the neighbor node."; + } + } + + grouping ipv6-neighbor-state { + description "Per-neighbor state variables for IPv6 interfaces"; + + leaf origin { + type neighbor-origin; + description + "The origin of this neighbor entry."; + } + leaf is-router { + type empty; + description + "Indicates that the neighbor node acts as a router."; + } + leaf neighbor-state { + type enumeration { + enum INCOMPLETE { + description + "Address resolution is in progress, and the link-layer + address of the neighbor has not yet been + determined."; + } + enum REACHABLE { + description + "Roughly speaking, the neighbor is known to have been + reachable recently (within tens of seconds ago)."; + } + enum STALE { + description + "The neighbor is no longer known to be reachable, but + until traffic is sent to the neighbor no attempt + should be made to verify its reachability."; + } + enum DELAY { + description + "The neighbor is no longer known to be reachable, and + traffic has recently been sent to the neighbor. + Rather than probe the neighbor immediately, however, + delay sending probes for a short while in order to + give upper-layer protocols a chance to provide + reachability confirmation."; + } + enum PROBE { + description + "The neighbor is no longer known to be reachable, and + unicast Neighbor Solicitation probes are being sent + to verify reachability."; + } + } + description + "The Neighbor Unreachability Detection state of this + entry."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + Section 7.3.2"; + } + } + + grouping ip-vrrp-ipv6-config { + description + "IPv6-specific configuration data for VRRP on IPv6 + interfaces"; + + leaf virtual-link-local { + type oc-inet:ip-address; + description + "For VRRP on IPv6 interfaces, sets the virtual link local + address"; + } + } + + grouping ip-vrrp-ipv6-state { + description + "IPv6-specific operational state for VRRP on IPv6 interfaces"; + + uses ip-vrrp-ipv6-config; + } + + grouping ip-vrrp-tracking-config { + description + "Configuration data for tracking interfaces + in a VRRP group"; + + leaf-list track-interface { + type leafref { + path "/oc-if:interfaces/oc-if:interface/oc-if:name"; + } + // TODO: we may need to add some restriction to ethernet + // or IP interfaces. + description + "Sets a list of one or more interfaces that should + be tracked for up/down events to dynamically change the + priority state of the VRRP group, and potentially + change the mastership if the tracked interface going + down lowers the priority sufficiently. Any of the tracked + interfaces going down will cause the priority to be lowered. + Some implementations may only support a single + tracked interface."; + } + + leaf priority-decrement { + type uint8 { + range 0..254; + } + default 0; + description "Set the value to subtract from priority when + the tracked interface goes down"; + } + } + + grouping ip-vrrp-tracking-state { + description + "Operational state data for tracking interfaces in a VRRP + group"; + } + + grouping ip-vrrp-tracking-top { + description + "Top-level grouping for VRRP interface tracking"; + + container interface-tracking { + description + "Top-level container for VRRP interface tracking"; + + container config { + description + "Configuration data for VRRP interface tracking"; + + uses ip-vrrp-tracking-config; + } + + container state { + + config false; + + description + "Operational state data for VRRP interface tracking"; + + uses ip-vrrp-tracking-config; + uses ip-vrrp-tracking-state; + } + } + } + + grouping ip-vrrp-config { + description + "Configuration data for VRRP on IP interfaces"; + + leaf virtual-router-id { + type uint8 { + range 1..255; + } + description + "Set the virtual router id for use by the VRRP group. This + usually also determines the virtual MAC address that is + generated for the VRRP group"; + } + + leaf-list virtual-address { + type oc-inet:ip-address; + description + "Configure one or more virtual addresses for the + VRRP group"; + } + + leaf priority { + type uint8 { + range 1..254; + } + default 100; + description + "Specifies the sending VRRP interface's priority + for the virtual router. Higher values equal higher + priority"; + } + + leaf preempt { + type boolean; + default true; + description + "When set to true, enables preemption by a higher + priority backup router of a lower priority master router"; + } + + leaf preempt-delay { + type uint16 { + range 0..3600; + } + default 0; + description + "Set the delay the higher priority router waits + before preempting"; + } + + leaf accept-mode { + type boolean; + // TODO: should we adopt the RFC default given the common + // operational practice of setting to true? + default false; + description + "Configure whether packets destined for + virtual addresses are accepted even when the virtual + address is not owned by the router interface"; + } + + leaf advertisement-interval { + type uint16 { + range 1..4095; + } + // TODO this range is theoretical -- needs to be validated + // against major implementations. + units "centiseconds"; + default 100; + description + "Sets the interval between successive VRRP + advertisements -- RFC 5798 defines this as a 12-bit + value expressed as 0.1 seconds, with default 100, i.e., + 1 second. Several implementation express this in units of + seconds"; + } + } + + grouping ip-vrrp-state { + description + "Operational state data for VRRP on IP interfaces"; + + leaf current-priority { + type uint8; + description "Operational value of the priority for the + interface in the VRRP group"; + } + } + + grouping ip-vrrp-top { + description + "Top-level grouping for Virtual Router Redundancy Protocol"; + + container vrrp { + description + "Enclosing container for VRRP groups handled by this + IP interface"; + + reference "RFC 5798 - Virtual Router Redundancy Protocol + (VRRP) Version 3 for IPv4 and IPv6"; + + list vrrp-group { + key "virtual-router-id"; + description + "List of VRRP groups, keyed by virtual router id"; + + leaf virtual-router-id { + type leafref { + path "../config/virtual-router-id"; + } + description + "References the configured virtual router id for this + VRRP group"; + } + + container config { + description + "Configuration data for the VRRP group"; + + uses ip-vrrp-config; + } + + container state { + + config false; + + description + "Operational state data for the VRRP group"; + + uses ip-vrrp-config; + uses ip-vrrp-state; + } + + uses ip-vrrp-tracking-top; + } + } + } + + grouping ipv6-ra-config { + description + "Configuration parameters for IPv6 router advertisements."; + + leaf interval { + type uint32; + units seconds; + description + "The interval between periodic router advertisement neighbor + discovery messages sent on this interface expressed in + seconds."; + } + + leaf lifetime { + type uint32; + units seconds; + description + "The lifetime advertised in the router advertisement neighbor + discovery message on this interface."; + } + + leaf suppress { + type boolean; + default false; + description + "When set to true, router advertisement neighbor discovery + messages are not transmitted on this interface."; + } + } + + grouping ipv4-proxy-arp-config { + description + "Configuration parameters for IPv4 proxy ARP"; + + leaf mode { + type enumeration { + enum DISABLE { + description + "The system should not respond to ARP requests that + do not specify an IP address configured on the local + subinterface as the target address."; + } + enum REMOTE_ONLY { + description + "The system responds to ARP requests only when the + sender and target IP addresses are in different + subnets."; + } + enum ALL { + description + "The system responds to ARP requests where the sender + and target IP addresses are in different subnets, as well + as those where they are in the same subnet."; + } + } + default "DISABLE"; + description + "When set to a value other than DISABLE, the local system should + respond to ARP requests that are for target addresses other than + those that are configured on the local subinterface using its own + MAC address as the target hardware address. If the REMOTE_ONLY + value is specified, replies are only sent when the target address + falls outside the locally configured subnets on the interface, + whereas with the ALL value, all requests, regardless of their + target address are replied to."; + reference "RFC1027: Using ARP to Implement Transparent Subnet Gateways"; + } + } + + grouping ipv4-top { + description "Top-level configuration and state for IPv4 + interfaces"; + + container ipv4 { + description + "Parameters for the IPv4 address family."; + + container addresses { + description + "Enclosing container for address list"; + + list address { + key "ip"; + description + "The list of configured IPv4 addresses on the interface."; + + leaf ip { + type leafref { + path "../config/ip"; + } + description "References the configured IP address"; + } + + container config { + description "Configuration data for each configured IPv4 + address on the interface"; + + uses ipv4-address-config; + + } + + container state { + + config false; + description "Operational state data for each IPv4 address + configured on the interface"; + + uses ipv4-address-config; + uses ipv4-address-state; + } + + } + } + + container proxy-arp { + description + "Configuration and operational state parameters + relating to proxy ARP. This functionality allows a + system to respond to ARP requests that are not + explicitly destined to the local system."; + + container config { + description + "Configuration parameters for proxy ARP"; + uses ipv4-proxy-arp-config; + } + + container state { + config false; + description + "Operational state parameters for proxy ARP"; + uses ipv4-proxy-arp-config; + } + } + + container neighbors { + description + "Enclosing container for neighbor list"; + + list neighbor { + key "ip"; + description + "A list of mappings from IPv4 addresses to + link-layer addresses. + + Entries in this list are used as static entries in the + ARP Cache."; + reference + "RFC 826: An Ethernet Address Resolution Protocol"; + + leaf ip { + type leafref { + path "../config/ip"; + } + description "References the configured IP address"; + } + + container config { + description "Configuration data for each configured IPv4 + address on the interface"; + + uses ipv4-neighbor-config; + + } + + container state { + + config false; + description "Operational state data for each IPv4 address + configured on the interface"; + + uses ipv4-neighbor-config; + uses ipv4-neighbor-state; + } + } + } + + uses oc-if:sub-unnumbered-top; + + container config { + description + "Top-level IPv4 configuration data for the interface"; + + uses ipv4-global-config; + } + + container state { + + config false; + description + "Top level IPv4 operational state data"; + + uses ipv4-global-config; + uses ip-common-counters-state; + } + } + } + + grouping ipv6-top { + description + "Top-level configuration and state for IPv6 interfaces"; + + container ipv6 { + description + "Parameters for the IPv6 address family."; + + container addresses { + description + "Enclosing container for address list"; + + list address { + key "ip"; + description + "The list of configured IPv6 addresses on the interface."; + + leaf ip { + type leafref { + path "../config/ip"; + } + description "References the configured IP address"; + } + + container config { + description + "Configuration data for each IPv6 address on + the interface"; + + uses ipv6-address-config; + + } + + container state { + + config false; + description + "State data for each IPv6 address on the + interface"; + + uses ipv6-address-config; + uses ipv6-address-state; + } + } + } + + container router-advertisement { + description + "Configuration and operational state parameters relating to + router advertisements."; + + container config { + description + "Configuration parameters relating to router advertisements + for IPv6."; + uses ipv6-ra-config; + } + + container state { + config false; + description + "Operational state parameters relating to router + advertisements for IPv6."; + uses ipv6-ra-config; + } + } + + container neighbors { + description + "Enclosing container for list of IPv6 neighbors"; + + list neighbor { + key "ip"; + description + "List of IPv6 neighbors"; + + leaf ip { + type leafref { + path "../config/ip"; + } + description + "References the configured IP neighbor address"; + } + + container config { + description "Configuration data for each IPv6 address on + the interface"; + + uses ipv6-neighbor-config; + + } + + container state { + + config false; + description "State data for each IPv6 address on the + interface"; + + uses ipv6-neighbor-config; + uses ipv6-neighbor-state; + } + } + } + uses oc-if:sub-unnumbered-top; + + container config { + description "Top-level config data for the IPv6 interface"; + + uses ipv6-global-config; + } + + container state { + config false; + description + "Top-level operational state data for the IPv6 interface"; + + uses ipv6-global-config; + uses ip-common-counters-state; + + } + } + } + + // augment statements + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface" { + description + "IPv4 address family configuration for + interfaces"; + + uses ipv4-top; + + } + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface" { + description + "IPv6 address family configuration for + interfaces"; + + uses ipv6-top; + + } + + // VRRP for IPv4 interfaces + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface/oc-ip:ipv4/oc-ip:addresses/oc-ip:address" { + + description + "Additional IP addr family configuration for + interfaces"; + + uses ip-vrrp-top; + + } + + // VRRP for IPv6 interfaces + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address" { + description + "Additional IP addr family configuration for + interfaces"; + + uses ip-vrrp-top; + + } + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address/" + + "vrrp/vrrp-group/config" { + description + "Additional VRRP data for IPv6 interfaces"; + + uses ip-vrrp-ipv6-config; + } + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/" + + "vrrp-group/state" { + description + "Additional VRRP data for IPv6 interfaces"; + + uses ip-vrrp-ipv6-state; + } + + // Augments for for routed VLANs + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan" { + description + "IPv4 address family configuration for + interfaces"; + + uses ipv4-top; + } + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan" { + description + "IPv6 address family configuration for + interfaces"; + + uses ipv6-top; + } + + // VRRP for routed VLAN interfaces + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" + + "oc-ip:ipv4/oc-ip:addresses/oc-ip:address" { + description + "Additional IP addr family configuration for + interfaces"; + + uses ip-vrrp-top; + + } + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" + + "oc-ip:ipv6/oc-ip:addresses/oc-ip:address" { + description + "Additional IP addr family configuration for + interfaces"; + + uses ip-vrrp-top; + + } + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" + + "oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/vrrp-group/config" { + description + "Additional VRRP data for IPv6 interfaces"; + + uses ip-vrrp-ipv6-config; + } + + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" + + "oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/vrrp-group/state" { + description + "Additional VRRP data for IPv6 interfaces"; + + uses ip-vrrp-ipv6-state; + } + + // rpc statements + + // notification statements +} diff --git a/models/yang/openconfig-interfaces.yang b/models/yang/openconfig-interfaces.yang new file mode 100644 index 0000000000..f3e0feeace --- /dev/null +++ b/models/yang/openconfig-interfaces.yang @@ -0,0 +1,1067 @@ +module openconfig-interfaces { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/interfaces"; + + prefix "oc-if"; + + // import some basic types + import ietf-interfaces { prefix ietf-if; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-types { prefix oc-types; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "Model for managing network interfaces and subinterfaces. This + module also defines convenience types / groupings for other + models to create references to interfaces: + + base-interface-ref (type) - reference to a base interface + interface-ref (grouping) - container for reference to a + interface + subinterface + interface-ref-state (grouping) - container for read-only + (opstate) reference to interface + subinterface + + This model reuses data items defined in the IETF YANG model for + interfaces described by RFC 7223 with an alternate structure + (particularly for operational state data) and with + additional configuration items. + + Portions of this code were derived from IETF RFC 7223. + Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "2.4.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "2.4.1"; + } + + revision "2018-08-07" { + description + "Add leaf to indicate whether an interface is physical or + logical."; + reference "2.4.0"; + } + + revision "2018-07-02" { + description + "Add in-pkts and out-pkts in counters"; + reference "2.3.2"; + } + + revision "2018-04-24" { + description + "Clarified behavior of last-change state leaf"; + reference "2.3.1"; + } + + revision "2018-01-05" { + description + "Add logical loopback to interface."; + reference "2.3.0"; + } + + revision "2017-12-22" { + description + "Add IPv4 proxy ARP configuration."; + reference "2.2.0"; + } + + revision "2017-12-21" { + description + "Added IPv6 router advertisement configuration."; + reference "2.1.0"; + } + + revision "2017-07-14" { + description + "Added Ethernet/IP state data; Add dhcp-client; + migrate to OpenConfig types modules; Removed or + renamed opstate values"; + reference "2.0.0"; + } + + revision "2017-04-03" { + description + "Update copyright notice."; + reference "1.1.1"; + } + + revision "2016-12-22" { + description + "Fixes to Ethernet interfaces model"; + reference "1.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // typedef statements + + typedef base-interface-ref { + type leafref { + path "/oc-if:interfaces/oc-if:interface/oc-if:name"; + } + description + "Reusable type for by-name reference to a base interface. + This type may be used in cases where ability to reference + a subinterface is not required."; + } + + typedef interface-id { + type string; + description + "User-defined identifier for an interface, generally used to + name a interface reference. The id can be arbitrary but a + useful convention is to use a combination of base interface + name and subinterface index."; + } + + // grouping statements + + grouping interface-ref-common { + description + "Reference leafrefs to interface / subinterface"; + + leaf interface { + type leafref { + path "/oc-if:interfaces/oc-if:interface/oc-if:name"; + } + description + "Reference to a base interface. If a reference to a + subinterface is required, this leaf must be specified + to indicate the base interface."; + } + + leaf subinterface { + type leafref { + path "/oc-if:interfaces/" + + "oc-if:interface[oc-if:name=current()/../interface]/" + + "oc-if:subinterfaces/oc-if:subinterface/oc-if:index"; + } + description + "Reference to a subinterface -- this requires the base + interface to be specified using the interface leaf in + this container. If only a reference to a base interface + is requuired, this leaf should not be set."; + } + } + + grouping interface-ref-state-container { + description + "Reusable opstate w/container for a reference to an + interface or subinterface"; + + container state { + config false; + description + "Operational state for interface-ref"; + + uses interface-ref-common; + } + } + + grouping interface-ref { + description + "Reusable definition for a reference to an interface or + subinterface"; + + container interface-ref { + description + "Reference to an interface or subinterface"; + + container config { + description + "Configured reference to interface / subinterface"; + oc-ext:telemetry-on-change; + + uses interface-ref-common; + } + + uses interface-ref-state-container; + } + } + + grouping interface-ref-state { + description + "Reusable opstate w/container for a reference to an + interface or subinterface"; + + container interface-ref { + description + "Reference to an interface or subinterface"; + + uses interface-ref-state-container; + } + } + + grouping base-interface-ref-state { + description + "Reusable opstate w/container for a reference to a + base interface (no subinterface)."; + + container state { + config false; + description + "Operational state for base interface reference"; + + leaf interface { + type base-interface-ref; + description + "Reference to a base interface."; + } + } + } + + + grouping interface-common-config { + description + "Configuration data data nodes common to physical interfaces + and subinterfaces"; + + leaf description { + type string; + description + "A textual description of the interface. + + A server implementation MAY map this leaf to the ifAlias + MIB object. Such an implementation needs to use some + mechanism to handle the differences in size and characters + allowed between this leaf and ifAlias. The definition of + such a mechanism is outside the scope of this document. + + Since ifAlias is defined to be stored in non-volatile + storage, the MIB implementation MUST map ifAlias to the + value of 'description' in the persistently stored + datastore. + + Specifically, if the device supports ':startup', when + ifAlias is read the device MUST return the value of + 'description' in the 'startup' datastore, and when it is + written, it MUST be written to the 'running' and 'startup' + datastores. Note that it is up to the implementation to + + decide whether to modify this single leaf in 'startup' or + perform an implicit copy-config from 'running' to + 'startup'. + + If the device does not support ':startup', ifAlias MUST + be mapped to the 'description' leaf in the 'running' + datastore."; + reference + "RFC 2863: The Interfaces Group MIB - ifAlias"; + } + + leaf enabled { + type boolean; + default "true"; + description + "This leaf contains the configured, desired state of the + interface. + + Systems that implement the IF-MIB use the value of this + leaf in the 'running' datastore to set + IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry + has been initialized, as described in RFC 2863. + + Changes in this leaf in the 'running' datastore are + reflected in ifAdminStatus, but if ifAdminStatus is + changed over SNMP, this leaf is not affected."; + reference + "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; + } + + } + + grouping interface-phys-config { + description + "Configuration data for physical interfaces"; + + leaf name { + type string; + description + "The name of the interface. + + A device MAY restrict the allowed values for this leaf, + possibly depending on the type of the interface. + For system-controlled interfaces, this leaf is the + device-specific name of the interface. The 'config false' + list interfaces/interface[name]/state contains the currently + existing interfaces on the device. + + If a client tries to create configuration for a + system-controlled interface that is not present in the + corresponding state list, the server MAY reject + the request if the implementation does not support + pre-provisioning of interfaces or if the name refers to + an interface that can never exist in the system. A + NETCONF server MUST reply with an rpc-error with the + error-tag 'invalid-value' in this case. + + The IETF model in RFC 7223 provides YANG features for the + following (i.e., pre-provisioning and arbitrary-names), + however they are omitted here: + + If the device supports pre-provisioning of interface + configuration, the 'pre-provisioning' feature is + advertised. + + If the device allows arbitrarily named user-controlled + interfaces, the 'arbitrary-names' feature is advertised. + + When a configured user-controlled interface is created by + the system, it is instantiated with the same name in the + /interfaces/interface[name]/state list."; + } + + leaf type { + type identityref { + base ietf-if:interface-type; + } + mandatory true; + description + "The type of the interface. + + When an interface entry is created, a server MAY + initialize the type leaf with a valid value, e.g., if it + is possible to derive the type from the name of the + interface. + + If a client tries to set the type of an interface to a + value that can never be used by the system, e.g., if the + type is not supported or if the type does not match the + name of the interface, the server MUST reject the request. + A NETCONF server MUST reply with an rpc-error with the + error-tag 'invalid-value' in this case."; + reference + "RFC 2863: The Interfaces Group MIB - ifType"; + } + + leaf mtu { + type uint16; + description + "Set the max transmission unit size in octets + for the physical interface. If this is not set, the mtu is + set to the operational default -- e.g., 1514 bytes on an + Ethernet interface."; + } + + leaf loopback-mode { + type boolean; + default false; + description + "When set to true, the interface is logically looped back, + such that packets that are forwarded via the interface + are received on the same interface."; + } + + uses interface-common-config; + } + + grouping interface-phys-holdtime-config { + description + "Configuration data for interface hold-time settings -- + applies to physical interfaces."; + + leaf up { + type uint32; + units milliseconds; + default 0; + description + "Dampens advertisement when the interface + transitions from down to up. A zero value means dampening + is turned off, i.e., immediate notification."; + } + + leaf down { + type uint32; + units milliseconds; + default 0; + description + "Dampens advertisement when the interface transitions from + up to down. A zero value means dampening is turned off, + i.e., immediate notification."; + } + } + + grouping interface-phys-holdtime-state { + description + "Operational state data for interface hold-time."; + } + + grouping interface-phys-holdtime-top { + description + "Top-level grouping for setting link transition + dampening on physical and other types of interfaces."; + + container hold-time { + description + "Top-level container for hold-time settings to enable + dampening advertisements of interface transitions."; + + container config { + description + "Configuration data for interface hold-time settings."; + oc-ext:telemetry-on-change; + + uses interface-phys-holdtime-config; + } + + container state { + + config false; + + description + "Operational state data for interface hold-time."; + + uses interface-phys-holdtime-config; + uses interface-phys-holdtime-state; + } + } + } + + grouping interface-common-state { + description + "Operational state data (in addition to intended configuration) + at the global level for this interface"; + + oc-ext:operational; + + leaf ifindex { + type uint32; + description + "System assigned number for each interface. Corresponds to + ifIndex object in SNMP Interface MIB"; + reference + "RFC 2863 - The Interfaces Group MIB"; + oc-ext:telemetry-on-change; + } + + leaf admin-status { + type enumeration { + enum UP { + description + "Ready to pass packets."; + } + enum DOWN { + description + "Not ready to pass packets and not in some test mode."; + } + enum TESTING { + //TODO: This is generally not supported as a configured + //admin state, though it's in the standard interfaces MIB. + //Consider removing it. + description + "In some test mode."; + } + } + //TODO:consider converting to an identity to have the + //flexibility to remove some values defined by RFC 7223 that + //are not used or not implemented consistently. + mandatory true; + description + "The desired state of the interface. In RFC 7223 this leaf + has the same read semantics as ifAdminStatus. Here, it + reflects the administrative state as set by enabling or + disabling the interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; + oc-ext:telemetry-on-change; + } + + leaf oper-status { + type enumeration { + enum UP { + value 1; + description + "Ready to pass packets."; + } + enum DOWN { + value 2; + description + "The interface does not pass any packets."; + } + enum TESTING { + value 3; + description + "In some test mode. No operational packets can + be passed."; + } + enum UNKNOWN { + value 4; + description + "Status cannot be determined for some reason."; + } + enum DORMANT { + value 5; + description + "Waiting for some external event."; + } + enum NOT_PRESENT { + value 6; + description + "Some component (typically hardware) is missing."; + } + enum LOWER_LAYER_DOWN { + value 7; + description + "Down due to state of lower-layer interface(s)."; + } + } + //TODO:consider converting to an identity to have the + //flexibility to remove some values defined by RFC 7223 that + //are not used or not implemented consistently. + mandatory true; + description + "The current operational state of the interface. + + This leaf has the same semantics as ifOperStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifOperStatus"; + oc-ext:telemetry-on-change; + } + + leaf last-change { + type oc-types:timeticks64; + units nanoseconds; + description + "This timestamp indicates the absolute time of the last + state change of the interface (e.g., up-to-down transition). + This is different than the SNMP ifLastChange object in the + standard interface MIB in that it is not relative to the + system boot time (i.e,. sysUpTime). + + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + oc-ext:telemetry-on-change; + } + + leaf logical { + type boolean; + description + "When set to true, the interface is a logical interface + which does not have an associated physical port or + channel on the system."; + oc-ext:telemetry-on-change; + } + } + + + grouping interface-counters-state { + description + "Operational state representing interface counters + and statistics."; + + //TODO: we may need to break this list of counters into those + //that would appear for physical vs. subinterface or logical + //interfaces. For now, just replicating the full stats + //grouping to both interface and subinterface. + + oc-ext:operational; + + container counters { + description + "A collection of interface-related statistics objects."; + + leaf in-octets { + type oc-yang:counter64; + description + "The total number of octets received on the interface, + including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInOctets"; + } + + leaf in-pkts { + type oc-yang:counter64; + description + "The total number of packets received on the interface, + including all unicast, multicast, broadcast and bad packets + etc."; + reference + "RFC 2819: Remote Network Monitoring Management Information + Base"; + } + + leaf in-unicast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were not addressed to a + multicast or broadcast address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts"; + } + + leaf in-broadcast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a broadcast + address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInBroadcastPkts"; + } + + leaf in-multicast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a multicast + address at this sub-layer. For a MAC-layer protocol, + this includes both Group and Functional addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInMulticastPkts"; + } + + leaf in-discards { + type oc-yang:counter64; + description + "The number of inbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being deliverable to a higher-layer + protocol. One possible reason for discarding such a + packet could be to free up buffer space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + + + reference + "RFC 2863: The Interfaces Group MIB - ifInDiscards"; + } + + leaf in-errors { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of inbound + packets that contained errors preventing them from being + deliverable to a higher-layer protocol. For character- + oriented or fixed-length interfaces, the number of + inbound transmission units that contained errors + preventing them from being deliverable to a higher-layer + protocol. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInErrors"; + } + + leaf in-unknown-protos { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } + + leaf in-fcs-errors { + type oc-yang:counter64; + description + "Number of received packets which had errors in the + frame check sequence (FCS), i.e., framing errors. + + Discontinuities in the value of this counter can occur + when the device is re-initialization as indicated by the + value of 'last-clear'."; + } + + leaf out-octets { + type oc-yang:counter64; + description + "The total number of octets transmitted out of the + interface, including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutOctets"; + } + + leaf out-pkts { + type oc-yang:counter64; + description + "The total number of packets transmitted out of the + interface, including all unicast, multicast, broadcast, + and bad packets etc."; + reference + "RFC 2819: Remote Network Monitoring Management Information + Base"; + } + + leaf out-unicast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were not addressed + to a multicast or broadcast address at this sub-layer, + including those that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts"; + } + + leaf out-broadcast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were addressed to a + broadcast address at this sub-layer, including those + that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutBroadcastPkts"; + } + + + leaf out-multicast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were addressed to a + multicast address at this sub-layer, including those + that were discarded or not sent. For a MAC-layer + protocol, this includes both Group and Functional + addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutMulticastPkts"; + } + + leaf out-discards { + type oc-yang:counter64; + description + "The number of outbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being transmitted. One possible reason + for discarding such a packet could be to free up buffer + space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutDiscards"; + } + + leaf out-errors { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of outbound + packets that could not be transmitted because of errors. + For character-oriented or fixed-length interfaces, the + number of outbound transmission units that could not be + transmitted because of errors. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutErrors"; + } + + leaf carrier-transitions { + type oc-yang:counter64; + description + "Number of times the interface state has transitioned + between up and down since the time the device restarted + or the last-clear time, whichever is most recent."; + oc-ext:telemetry-on-change; + } + + leaf last-clear { + type oc-types:timeticks64; + units nanoseconds; + description + "Timestamp of the last time the interface counters were + cleared. + + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + oc-ext:telemetry-on-change; + } + } + } + + // data definition statements + + grouping sub-unnumbered-config { + description + "Configuration data for unnumbered subinterfaces"; + + leaf enabled { + type boolean; + default false; + description + "Indicates that the subinterface is unnumbered. By default + the subinterface is numbered, i.e., expected to have an + IP address configuration."; + } + } + + grouping sub-unnumbered-state { + description + "Operational state data unnumbered subinterfaces"; + } + + grouping sub-unnumbered-top { + description + "Top-level grouping unnumbered subinterfaces"; + + container unnumbered { + description + "Top-level container for setting unnumbered interfaces. + Includes reference the interface that provides the + address information"; + + container config { + description + "Configuration data for unnumbered interface"; + oc-ext:telemetry-on-change; + + uses sub-unnumbered-config; + } + + container state { + + config false; + + description + "Operational state data for unnumbered interfaces"; + + uses sub-unnumbered-config; + uses sub-unnumbered-state; + } + + uses oc-if:interface-ref; + } + } + + grouping subinterfaces-config { + description + "Configuration data for subinterfaces"; + + leaf index { + type uint32; + default 0; + description + "The index of the subinterface, or logical interface number. + On systems with no support for subinterfaces, or not using + subinterfaces, this value should default to 0, i.e., the + default subinterface."; + } + + uses interface-common-config; + + } + + grouping subinterfaces-state { + description + "Operational state data for subinterfaces"; + + oc-ext:operational; + + leaf name { + type string; + description + "The system-assigned name for the sub-interface. This MAY + be a combination of the base interface name and the + subinterface index, or some other convention used by the + system."; + oc-ext:telemetry-on-change; + } + + uses interface-common-state; + uses interface-counters-state; + } + + grouping subinterfaces-top { + description + "Subinterface data for logical interfaces associated with a + given interface"; + + container subinterfaces { + description + "Enclosing container for the list of subinterfaces associated + with a physical interface"; + + list subinterface { + key "index"; + + description + "The list of subinterfaces (logical interfaces) associated + with a physical interface"; + + leaf index { + type leafref { + path "../config/index"; + } + description + "The index number of the subinterface -- used to address + the logical interface"; + } + + container config { + description + "Configurable items at the subinterface level"; + oc-ext:telemetry-on-change; + + uses subinterfaces-config; + } + + container state { + + config false; + description + "Operational state data for logical interfaces"; + + uses subinterfaces-config; + uses subinterfaces-state; + } + } + } + } + + grouping interfaces-top { + description + "Top-level grouping for interface configuration and + operational state data"; + + container interfaces { + description + "Top level container for interfaces, including configuration + and state data."; + + + list interface { + key "name"; + + description + "The list of named interfaces on the device."; + + leaf name { + type leafref { + path "../config/name"; + } + description + "References the configured name of the interface"; + //TODO: need to consider whether this should actually + //reference the name in the state subtree, which + //presumably would be the system-assigned name, or the + //configured name. Points to the config/name now + //because of YANG 1.0 limitation that the list + //key must have the same "config" as the list, and + //also can't point to a non-config node. + } + + container config { + description + "Configurable items at the global, physical interface + level"; + oc-ext:telemetry-on-change; + + uses interface-phys-config; + } + + container state { + + config false; + description + "Operational state data at the global interface level"; + + uses interface-phys-config; + uses interface-common-state; + uses interface-counters-state; + } + + uses interface-phys-holdtime-top; + uses subinterfaces-top; + } + } + } + + uses interfaces-top; + +} diff --git a/models/yang/openconfig-lldp.yang b/models/yang/openconfig-lldp.yang new file mode 100644 index 0000000000..e687b7c61b --- /dev/null +++ b/models/yang/openconfig-lldp.yang @@ -0,0 +1,660 @@ +module openconfig-lldp { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/lldp"; + + prefix "oc-lldp"; + + import openconfig-lldp-types { prefix oc-lldp-types; } + import openconfig-interfaces { prefix oc-if; } + import ietf-yang-types { prefix yang; } + import openconfig-extensions { prefix oc-ext; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines configuration and operational state data + for the LLDP protocol."; + + oc-ext:openconfig-version "0.2.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.2.1"; + } + + revision "2018-07-17" { + description + "Adds ttl to lldp-neighbor-state"; + reference "0.2.0"; + } + + revision "2016-05-16" { + description + "Initial public revision"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // identity statements + + + // grouping statements + + grouping lldp-common-counters { + description + "Definition of global and per-interface counters"; + + leaf frame-in { + type yang:counter64; + description + "The number of lldp frames received."; + } + + leaf frame-out { + type yang:counter64; + description + "The number of frames transmitted out."; + } + + leaf frame-error-in { + type yang:counter64; + description + "The number of LLDP frames received with errors."; + } + + leaf frame-discard { + type yang:counter64; + description + "The number of LLDP frames received and discarded."; + } + + leaf tlv-discard { + type yang:counter64; + description + "The number of TLV frames received and discarded."; + } + + leaf tlv-unknown { + type yang:counter64; + description + "The number of frames received with unknown TLV."; + } + + leaf last-clear { + type yang:date-and-time; + description + "Indicates the last time the counters were + cleared."; + } + } + + grouping lldp-global-counters { + description + "Definition of global LLDP counters"; + + uses lldp-common-counters; + + leaf tlv-accepted { + type yang:counter64; + description + "The number of valid TLVs received."; + } + + leaf entries-aged-out { + type yang:counter64; + description + "The number of entries aged out due to timeout."; + } + + } + + grouping lldp-interface-counters { + description + "Definition of per-interface LLDP counters"; + + uses lldp-common-counters; + + leaf frame-error-out { + type yang:counter64; + description + "The number of frame transmit errors on the + interface."; + } + } + + grouping lldp-system-info-config { + description + "Configuration data for system-level local and remote + LLDP information"; + + leaf system-name { + type string { + length 0..255; + } + description + "The system name field shall contain an alpha-numeric string + that indicates the system's administratively assigned name. + The system name should be the system's fully qualified domain + name. If implementations support IETF RFC 3418, the sysName + object should be used for this field."; + } + + leaf system-description { + type string { + length 0..255; + } + description + "The system description field shall contain an alpha-numeric + string that is the textual description of the network entity. + The system description should include the full name and + version identification of the system's hardware type, + software operating system, and networking software. If + implementations support IETF RFC 3418, the sysDescr object + should be used for this field."; + } + + leaf chassis-id { + type string; + description + "The Chassis ID is a mandatory TLV which identifies the + chassis component of the endpoint identifier associated with + the transmitting LLDP agent"; + } + + leaf chassis-id-type { + type oc-lldp-types:chassis-id-type; + description + "This field identifies the format and source of the chassis + identifier string. It is an enumerator defined by the + LldpChassisIdSubtype object from IEEE 802.1AB MIB."; + } + } + + grouping lldp-system-info-state { + description + "Operational state data reported for the local and remote + systems"; + + } + + grouping lldp-neighbor-config { + description + "Configuration data for LLDP neighbors"; + + } + + grouping lldp-neighbor-state { + description + "Operational state data for LLDP neighbors"; + + leaf id { + type string; + description + "System generated identifier for the neighbor on the + interface."; + } + + leaf age { + type uint64; + units "seconds"; + description + "Age since discovery"; + } + + leaf last-update { + type int64; + description + "Seconds since last update received."; + } + + leaf ttl { + type uint16; + units "seconds"; + description + "The time-to-live (TTL) is a mandatory TLV which indicates + how long information from the neighbor should be considered + valid."; + } + + leaf port-id { + type string; + description + "The Port ID is a mandatory TLV which identifies the port + component of the endpoint identifier associated with the + transmitting LLDP agent. If the specified port is an IEEE + 802.3 Repeater port, then this TLV is optional."; + } + + leaf port-id-type { + type oc-lldp-types:port-id-type; + description + "This field identifies the format and source of the port + identifier string. It is an enumerator defined by the + PtopoPortIdType object from RFC2922."; + } + + leaf port-description { + type string; + description + "The binary string containing the actual port identifier for + the port which this LLDP PDU was transmitted. The source and + format of this field is defined by PtopoPortId from + RFC2922."; + } + + leaf management-address { + type string; + description + "The Management Address is a mandatory TLV which identifies a + network address associated with the local LLDP agent, which + can be used to reach the agent on the port identified in the + Port ID TLV."; + } + + leaf management-address-type { + type string; + description + "The enumerated value for the network address type + identified in this TLV. This enumeration is defined in the + 'Assigned Numbers' RFC [RFC3232] and the + ianaAddressFamilyNumbers object."; + } + } + + grouping lldp-capabilities-config { + description + "Configuration data for LLDP capabilities"; + } + + grouping lldp-capabilities-state { + description + "Operational state data for LLDP capabilities"; + + leaf name { + type identityref { + base oc-lldp-types:LLDP_SYSTEM_CAPABILITY; + } + description + "Name of the system capability advertised by the neighbor. + Capabilities are represented in a bitmap that defines the + primary functions of the system. The capabilities are + defined in IEEE 802.1AB."; + } + + leaf enabled { + type boolean; + description + "Indicates whether the corresponding system capability is + enabled on the neighbor."; + reference + "Sec 8.5.8.2 of IEEE 802.1AB-2009"; + } + } + + grouping lldp-capabilities-top { + description + "Top-level grouping for LLDP capabilities"; + + container capabilities { + config false; + description + "Enclosing container for list of LLDP capabilities"; + + list capability { + key "name"; + description + "List of LLDP system capabilities advertised by the + neighbor"; + + leaf name { + type leafref { + path "../state/name"; + } + description + "Reference to capabilities list key"; + } + + container config { + description + "Configuration data for LLDP capabilities"; + + uses lldp-capabilities-config; + } + + container state { + + config false; + + description + "Operational state data for LLDP capabilities"; + + uses lldp-capabilities-config; + uses lldp-capabilities-state; + } + } + } + } + + grouping lldp-custom-tlv-config { + description + "Configuration data for custom LLDP TLVs"; + } + + grouping lldp-custom-tlv-state { + description + "Operational state data for custom LLDP TLVs"; + + leaf type { + type int32; + description + "The integer value identifying the type of information + contained in the value field."; + } + + leaf oui { + type string; + description + "The organizationally unique identifier field shall contain + the organization's OUI as defined in Clause 9 of IEEE Std + 802. The high-order octet is 0 and the low-order 3 octets + are the SMI Network Management Private Enterprise Code of + the Vendor in network byte order, as defined in the + 'Assigned Numbers' RFC [RFC3232]."; + } + + leaf oui-subtype { + type string; + description + "The organizationally defined subtype field shall contain a + unique subtype value assigned by the defining organization."; + } + + // TODO: consider making this string type + leaf value { + type binary; + description + "A variable-length octet-string containing the + instance-specific information for this TLV."; + } + } + + grouping lldp-custom-tlv-top { + description + "Top-level grouping for custom LLDP TLVs"; + + container custom-tlvs { + config false; + description + "Enclosing container for list of custom TLVs from a + neighbor"; + + list tlv { + key "type oui oui-subtype"; + description + "List of custom LLDP TLVs from a neighbor"; + + leaf type { + type leafref { + path "../state/type"; + } + description + "Reference to type list key"; + } + + leaf oui { + type leafref { + path "../state/oui"; + } + description + "Reference to oui list key"; + } + + leaf oui-subtype { + type leafref { + path "../state/oui-subtype"; + } + description + "Reference to oui-subtype list key"; + } + + container config { + description + "Configuration data "; + + uses lldp-custom-tlv-config; + } + + container state { + + config false; + + description + "Operational state data "; + + uses lldp-custom-tlv-config; + uses lldp-custom-tlv-state; + } + } + } + } + + grouping lldp-neighbor-top { + description + "Top-level grouping for the LLDP neighbor list"; + + container neighbors { + config false; + description + "Enclosing container for list of LLDP neighbors on an + interface"; + + list neighbor { + key "id"; + description + "List of LLDP neighbors"; + + leaf id { + type leafref { + path "../state/id"; + } + description + " "; + } + + container config { + description + "Configuration data "; + + uses lldp-neighbor-config; + } + + container state { + + config false; + + description + "Operational state data "; + + uses lldp-system-info-config; + uses lldp-system-info-state; + uses lldp-neighbor-config; + uses lldp-neighbor-state; + } + + uses lldp-custom-tlv-top; + uses lldp-capabilities-top; + } + } + } + + grouping lldp-interface-config { + description + "Configuration data for LLDP on each interface"; + + leaf name { + type oc-if:base-interface-ref; + description + "Reference to the LLDP Ethernet interface"; + } + + leaf enabled { + type boolean; + default "true"; + description + "Enable or disable the LLDP protocol on the interface."; + } + } + + grouping lldp-interface-state { + description + "Operational state data for LLDP on each interface"; + + container counters { + description + "LLDP counters on each interface"; + + uses lldp-interface-counters; + } + } + + grouping lldp-interface-top { + description + "Top-level grouping "; + + container interfaces { + description + "Enclosing container "; + + list interface { + key "name"; + description + "List of interfaces on which LLDP is enabled / available"; + + leaf name { + type leafref { + path "../config/name"; + } + description + "Reference to the list key"; + } + + container config { + description + "Configuration data for LLDP on each interface"; + + uses lldp-interface-config; + } + + container state { + + config false; + + description + "Operational state data "; + + uses lldp-interface-config; + uses lldp-interface-state; + } + + uses lldp-neighbor-top; + } + } + } + + + grouping lldp-config { + description + "Configuration data for global LLDP parameters"; + + leaf enabled { + type boolean; + default "true"; + description + "System level state of the LLDP protocol."; + } + + leaf hello-timer { + type uint64; + units "seconds"; + description + "System level hello timer for the LLDP protocol."; + } + + leaf-list suppress-tlv-advertisement { + type identityref { + base oc-lldp-types:LLDP_TLV; + } + description + "Indicates whether the local system should suppress the + advertisement of particular TLVs with the LLDP PDUs that it + transmits. Where a TLV type is specified within this list, it + should not be included in any LLDP PDU transmitted by the + local agent."; + } + } + + grouping lldp-state { + description + "Operational state data for global LLDP parameters"; + + container counters { + description + "Global LLDP counters"; + + uses lldp-global-counters; + } + } + + grouping lldp-top { + description + "Top-level grouping for LLDP model"; + + container lldp { + description + "Top-level container for LLDP configuration and state data"; + + container config { + description + "Configuration data "; + + uses lldp-config; + uses lldp-system-info-config; + } + + container state { + + config false; + + description + "Operational state data "; + + uses lldp-config; + uses lldp-system-info-config; + uses lldp-system-info-state; + uses lldp-state; + } + + uses lldp-interface-top; + } + } + + // data definition statements + + uses lldp-top; + + +} diff --git a/models/yang/openconfig-platform.yang b/models/yang/openconfig-platform.yang new file mode 100644 index 0000000000..ecf38cd1af --- /dev/null +++ b/models/yang/openconfig-platform.yang @@ -0,0 +1,779 @@ +module openconfig-platform { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/platform"; + + prefix "oc-platform"; + + import openconfig-platform-types { prefix oc-platform-types; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-alarm-types { prefix oc-alarm-types; } + import openconfig-yang-types { prefix oc-yang; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines a data model for representing a system + component inventory, which can include hardware or software + elements arranged in an arbitrary structure. The primary + relationship supported by the model is containment, e.g., + components containing subcomponents. + + It is expected that this model reflects every field replacable + unit on the device at a minimum (i.e., additional information + may be supplied about non-replacable components). + + Every element in the inventory is termed a 'component' with each + component expected to have a unique name and type, and optionally + a unique system-assigned identifier and FRU number. The + uniqueness is guaranteed by the system within the device. + + Components may have properties defined by the system that are + modeled as a list of key-value pairs. These may or may not be + user-configurable. The model provides a flag for the system + to optionally indicate which properties are user configurable. + + Each component also has a list of 'subcomponents' which are + references to other components. Appearance in a list of + subcomponents indicates a containment relationship as described + above. For example, a linecard component may have a list of + references to port components that reside on the linecard. + + This schema is generic to allow devices to express their own + platform-specific structure. It may be augmented by additional + component type-specific schemas that provide a common structure + for well-known component types. In these cases, the system is + expected to populate the common component schema, and may + optionally also represent the component and its properties in the + generic structure. + + The properties for each component may include dynamic values, + e.g., in the 'state' part of the schema. For example, a CPU + component may report its utilization, temperature, or other + physical properties. The intent is to capture all platform- + specific physical data in one location, including inventory + (presence or absence of a component) and state (physical + attributes or status)."; + + oc-ext:openconfig-version "0.12.2"; + + revision "2019-04-16" { + description + "Fix bug in parent path reference"; + reference "0.12.2"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.12.1"; + } + + revision "2018-06-29" { + description + "Added location description for components"; + reference "0.12.0"; + } + + revision "2018-06-03" { + description + "Added parent reference, empty flag and preconfiguration + for components"; + reference "0.11.0"; + } + + revision "2018-04-20" { + description + "Added new per-component state data: mfg-date and removable"; + reference "0.10.0"; + } + + revision "2018-01-30" { + description + "Amended approach for modelling CPU - rather than having + a local CPU utilisation state variable, a component with + a CPU should create a subcomponent of type CPU to report + statistics."; + reference "0.9.0"; + } + + revision "2018-01-16" { + description + "Added new per-component common data; add temp alarm; + moved hardware-port reference to port model"; + reference "0.8.0"; + } + + revision "2017-12-14" { + description + "Added anchor containers for component data, added new + component types"; + reference "0.7.0"; + } + + revision "2017-08-16" { + description + "Added power state enumerated type"; + reference "0.6.0"; + } + + revision "2016-12-22" { + description + "Added temperature state variable to component"; + reference "0.5.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // grouping statements + + + grouping platform-component-properties-config { + description + "System-defined configuration data for component properties"; + + leaf name { + type string; + description + "System-supplied name of the property -- this is typically + non-configurable"; + } + + leaf value { + type union { + type string; + type boolean; + type int64; + type uint64; + type decimal64 { + fraction-digits 2; + } + } + description + "Property values can take on a variety of types. Signed and + unsigned integer types may be provided in smaller sizes, + e.g., int8, uint16, etc."; + } + } + + grouping platform-component-properties-state { + description + "Operational state data for component properties"; + + leaf configurable { + type boolean; + description + "Indication whether the property is user-configurable"; + } + } + + grouping platform-component-properties-top { + description + "Top-level grouping "; + + container properties { + description + "Enclosing container "; + + list property { + key "name"; + description + "List of system properties for the component"; + + leaf name { + type leafref { + path "../config/name"; + } + description + "Reference to the property name."; + } + + container config { + description + "Configuration data for each property"; + + uses platform-component-properties-config; + } + + container state { + + config false; + + description + "Operational state data for each property"; + + uses platform-component-properties-config; + uses platform-component-properties-state; + } + } + } + } + + grouping platform-subcomponent-ref-config { + description + "Configuration data for subcomponent references"; + + leaf name { + type leafref { + path "../../../../../component/config/name"; + } + description + "Reference to the name of the subcomponent"; + } + } + + grouping platform-subcomponent-ref-state { + description + "Operational state data for subcomponent references"; + + } + + grouping platform-subcomponent-ref-top { + description + "Top-level grouping for list of subcomponent references"; + + container subcomponents { + description + "Enclosing container for subcomponent references"; + + list subcomponent { + key "name"; + description + "List of subcomponent references"; + + leaf name { + type leafref { + path "../config/name"; + } + description + "Reference to the name list key"; + } + + container config { + description + "Configuration data for the subcomponent"; + + uses platform-subcomponent-ref-config; + } + + container state { + + config false; + + description + "Operational state data for the subcomponent"; + + uses platform-subcomponent-ref-config; + uses platform-subcomponent-ref-state; + } + } + } + } + + grouping platform-component-config { + description + "Configuration data for components"; + + leaf name { + type string; + description + "Device name for the component -- this may not be a + configurable parameter on many implementations. Where + component preconfiguration is supported, for example, + the component name may be configurable."; + } + } + + grouping platform-component-state { + description + "Operational state data for device components."; + + leaf type { + type union { + type identityref { + base oc-platform-types:OPENCONFIG_HARDWARE_COMPONENT; + } + type identityref { + base oc-platform-types:OPENCONFIG_SOFTWARE_COMPONENT; + } + } + description + "Type of component as identified by the system"; + } + + leaf id { + type string; + description + "Unique identifier assigned by the system for the + component"; + } + + leaf location { + type string; + description + "System-supplied description of the location of the + component within the system. This could be a bay position, + slot number, socket location, etc. For component types that + have an explicit slot-id attribute, such as linecards, the + system should populate the more specific slot-id."; + } + + leaf description { + type string; + description + "System-supplied description of the component"; + } + + leaf mfg-name { + type string; + description + "System-supplied identifier for the manufacturer of the + component. This data is particularly useful when a + component manufacturer is different than the overall + device vendor."; + } + + leaf mfg-date { + type oc-yang:date; + description + "System-supplied representation of the component's + manufacturing date."; + } + + leaf hardware-version { + type string; + description + "For hardware components, this is the hardware revision of + the component."; + } + + leaf firmware-version { + type string; + description + "For hardware components, this is the version of associated + firmware that is running on the component, if applicable."; + } + + leaf software-version { + type string; + description + "For software components such as operating system or other + software module, this is the version of the currently + running software."; + } + + leaf serial-no { + type string; + description + "System-assigned serial number of the component."; + } + + leaf part-no { + type string; + description + "System-assigned part number for the component. This should + be present in particular if the component is also an FRU + (field replaceable unit)"; + } + + leaf removable { + type boolean; + description + "If true, this component is removable or is a field + replaceable unit"; + } + + leaf oper-status { + type identityref { + base oc-platform-types:COMPONENT_OPER_STATUS; + } + description + "If applicable, this reports the current operational status + of the component."; + } + + leaf empty { + type boolean; + default false; + description + "The empty leaf may be used by the device to indicate that a + component position exists but is not populated. Using this + flag, it is possible for the management system to learn how + many positions are available (e.g., occupied vs. empty + linecard slots in a chassis)."; + } + + leaf parent { + type leafref { + path "../../../component/config/name"; + } + description + "Reference to the name of the parent component. Note that + this reference must be kept synchronized with the + corresponding subcomponent reference from the parent + component."; + } + } + + grouping platform-component-temp-alarm-state { + description + "Temperature alarm data for platform components"; + + // TODO(aashaikh): consider if these leaves could be in a + // reusable grouping (not temperature-specific); threshold + // may always need to be units specific. + + leaf alarm-status { + type boolean; + description + "A value of true indicates the alarm has been raised or + asserted. The value should be false when the alarm is + cleared."; + } + + leaf alarm-threshold { + type uint32; + description + "The threshold value that was crossed for this alarm."; + } + + leaf alarm-severity { + type identityref { + base oc-alarm-types:OPENCONFIG_ALARM_SEVERITY; + } + description + "The severity of the current alarm."; + } + } + + grouping platform-component-power-state { + description + "Power-related operational state for device components."; + + leaf allocated-power { + type uint32; + units watts; + description + "Power allocated by the system for the component."; + } + + leaf used-power { + type uint32; + units watts; + description + "Actual power used by the component."; + } + } + + grouping platform-component-temp-state { + description + "Temperature state data for device components"; + + container temperature { + description + "Temperature in degrees Celsius of the component. Values include + the instantaneous, average, minimum, and maximum statistics. If + avg/min/max statistics are not supported, the target is expected + to just supply the instant value"; + + uses oc-platform-types:avg-min-max-instant-stats-precision1-celsius; + uses platform-component-temp-alarm-state; + } + } + + grouping platform-component-memory-state { + description + "Per-component memory statistics"; + + container memory { + description + "For components that have associated memory, these values + report information about available and utilized memory."; + + leaf available { + type uint64; + units bytes; + description + "The available memory physically installed, or logically + allocated to the component."; + } + + // TODO(aashaikh): consider if this needs to be a + // min/max/avg statistic + leaf utilized { + type uint64; + units bytes; + description + "The memory currently in use by processes running on + the component, not considering reserved memory that is + not available for use."; + } + } + } + + grouping platform-anchors-top { + description + "This grouping is used to add containers for components that + are common across systems, but do not have a defined schema + within the openconfig-platform module. Containers should be + added to this grouping for components that are expected to + exist in multiple systems, with corresponding modules + augmenting the config/state containers directly."; + + container chassis { + description + "Data for chassis components"; + + container config { + description + "Configuration data for chassis components"; + } + + container state { + config false; + description + "Operational state data for chassis components"; + } + } + +// TODO(aashaikh): linecard container is already defined in +// openconfig-platform-linecard; will move to this module +// in future. + /* + container linecard { + description + "Data for linecard components"; + + container config { + description + "Configuration data for linecard components"; + } + + container state { + config false; + description + "Operational state data for linecard components"; + } + } + */ + + container port { + description + "Data for physical port components"; + + container config { + description + "Configuration data for physical port components"; + } + + container state { + config false; + description + "Operational state data for physical port components"; + } + } + +// TODO(aashaikh): transceiver container is already defined in +// openconfig-platform-transceiver; will move to this module +// in future. + /* + container transceiver { + description + "Data for transceiver components"; + + container config { + description + "Configuration data for transceiver components"; + } + + container state { + config false; + description + "Operational state data for transceiver components"; + } + } + */ + + container power-supply { + description + "Data for power supply components"; + + container config { + description + "Configuration data for power supply components"; + } + + container state { + config false; + description + "Operational state data for power supply components"; + } + } + + container fan { + description + "Data for fan components"; + + container config { + description + "Configuration data for fan components"; + } + + container state { + config false; + description + "Operational state data for fan components"; + } + } + + container fabric { + description + "Data for fabric components"; + + container config { + description + "Configuration data for fabric components"; + } + + container state { + config false; + description + "Operational state data for fabric components"; + } + } + + container storage { + description + "Data for storage components"; + + container config { + description + "Configuration data for storage components"; + } + + container state { + config false; + description + "Operational state data for storage components"; + } + } + + container cpu { + description + "Data for cpu components"; + + container config { + description + "Configuration data for cpu components"; + } + + container state { + config false; + description + "Operational state data for cpu components"; + } + } + + container integrated-circuit { + description + "Data for chip components, such as ASIC, NPUs, etc."; + + container config { + description + "Configuration data for chip components"; + } + + container state { + config false; + description + "Operational state data for chip components"; + } + } + + container backplane { + description + "Data for backplane components"; + + container config { + description + "Configuration data for backplane components"; + } + + container state { + config false; + description + "Operational state data for backplane components"; + } + } + } + + grouping platform-component-top { + description + "Top-level grouping for components in the device inventory"; + + container components { + description + "Enclosing container for the components in the system."; + + list component { + key "name"; + description + "List of components, keyed by component name."; + + leaf name { + type leafref { + path "../config/name"; + } + description + "References the component name"; + } + + container config { + description + "Configuration data for each component"; + + uses platform-component-config; + } + + container state { + + config false; + + description + "Operational state data for each component"; + + uses platform-component-config; + uses platform-component-state; + uses platform-component-temp-state; + uses platform-component-memory-state; + uses platform-component-power-state; + } + + uses platform-component-properties-top; + uses platform-subcomponent-ref-top; + uses platform-anchors-top; + } + } + } + + + // data definition statements + + uses platform-component-top; + + + // augments + + +} diff --git a/models/yang/openconfig-system.yang b/models/yang/openconfig-system.yang new file mode 100644 index 0000000000..fd05a3f771 --- /dev/null +++ b/models/yang/openconfig-system.yang @@ -0,0 +1,997 @@ +module openconfig-system { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/system"; + + prefix "oc-sys"; + + // import some basic types + import openconfig-inet-types { prefix oc-inet; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-types { prefix oc-types; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-aaa { prefix oc-aaa; } + import openconfig-system-logging { prefix oc-log; } + import openconfig-system-management { prefix oc-sys-mgmt; } + import openconfig-system-terminal { prefix oc-sys-term; } + import openconfig-procmon { prefix oc-proc; } + import openconfig-alarms { prefix oc-alarms; } + import openconfig-messages { prefix oc-messages; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "Model for managing system-wide services and functions on + network devices. + + Portions of this code were derived from IETF RFC 7317. + Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "0.7.0"; + + revision "2019-01-29" { + description + "Add messages module to the system model"; + reference "0.7.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.6.1"; + } + + revision "2018-07-17" { + description + "Add gRPC server data"; + reference "0.6.0"; + } + + revision "2018-01-21" { + description + "Add cpu utilization data"; + reference "0.5.0"; + } + + revision "2017-12-15" { + description + "Add alarms to the system model"; + reference "0.4.0"; + } + + revision "2017-09-18" { + description + "Updated to use OpenConfig types modules"; + reference "0.3.0"; + } + + revision "2017-07-06" { + description + "Move to oc-inet types, add IETF attribution, add RADIUS + counters, changed password leaf names to indicate hashed"; + reference "0.2.0"; + } + + revision "2017-01-29" { + description + "Initial public release"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // extension statements + + // feature statements + + // identity statements + + identity NTP_AUTH_TYPE { + description + "Base identity for encryption schemes supported for NTP + authentication keys"; + } + + identity NTP_AUTH_MD5 { + base NTP_AUTH_TYPE; + description + "MD5 encryption method"; + } + + // typedef statements + + typedef timezone-name-type { + type string; + description + "A time zone name as used by the Time Zone Database, + sometimes referred to as the 'Olson Database'. + + The exact set of valid values is an implementation-specific + matter. Client discovery of the exact set of time zone names + for a particular server is out of scope."; + reference + "BCP 175: Procedures for Maintaining the Time Zone Database"; + } + + // grouping statements + + grouping system-clock-config { + description + "Configuration data for system-wide clock configuration"; + + leaf timezone-name { + type timezone-name-type; + description + "The TZ database name to use for the system, such + as 'Europe/Stockholm'."; + reference "IANA Time Zone Database + http://www.iana.org/time-zones"; + } + } + + grouping system-clock-state { + description + "Operational state data for system-wide clock configuration"; + } + + grouping system-clock-top { + description + "Top-level grouping for system-wide clock configuration"; + + container clock { + description + "Top-level container for clock configuration data"; + + container config { + description + "Configuration data for system clock"; + + uses system-clock-config; + } + + container state { + + config false; + + description + "Operational state data for system clock"; + + uses system-clock-config; + uses system-clock-state; + } + } + } + + grouping system-global-config { + description "system-wide configuration parameters"; + + leaf hostname { + type oc-inet:domain-name; + description + "The hostname of the device -- should be a single domain + label, without the domain."; + } + + leaf domain-name { + type oc-inet:domain-name; + description + "Specifies the domain name used to form fully qualified name + for unqualified hostnames."; + } + + leaf login-banner { + type string; + description + "The console login message displayed before the login prompt, + i.e., before a user logs into the system."; + } + + leaf motd-banner { + type string; + description + "The console message displayed after a user logs into the + system. They system may append additional standard + information such as the current system date and time, uptime, + last login timestamp, etc."; + } + } + + grouping system-global-state { + description + "Global operational state data for the system"; + + leaf current-datetime { + type oc-yang:date-and-time; + description + "The current system date and time."; + } + + leaf boot-time { + type oc-types:timeticks64; + description + "This timestamp indicates the time that the system was last + restarted. The value is the timestamp in seconds relative + to the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + } + + } + + grouping system-dns-config { + description "DNS / resolver related configuration data"; + + leaf-list search { + type oc-inet:domain-name; + ordered-by user; + description + "An ordered list of domains to search when resolving + a host name."; + } + } + + grouping system-dns-state { + description + "Operational state data for system DNS resolver"; + + } + + grouping system-dns-servers-config { + description + "Configuration data for DNS resolvers"; + + //RFC 7317 includes a single-value choice statement to for + //TCP and UDP transport. This has been removed since it the + //transport protocol is not generally available as an options + //on target devices. It may be added back if and when needed. + + leaf address { + type oc-inet:ip-address; + description + "The address of the DNS server, can be either IPv4 + or IPv6."; + } + + leaf port { + type oc-inet:port-number; + default 53; + description + "The port number of the DNS server."; + } + + //RFC 7317 includes resolver timeout and attempts options. These + //have been omitted as they are not available on many targets. If + //and when they are required, they may be added back in. + } + + grouping system-dns-static-config { + description + "Configuration data for static host entries"; + + leaf hostname { + type string; + description + "Hostname for the static DNS entry"; + } + + leaf-list alias { + type string; + description + "Additional aliases for the hostname"; + } + + leaf-list ipv4-address { + type oc-inet:ipv4-address; + description + "List of IPv4 addressses for the host entry"; + } + + leaf-list ipv6-address { + type oc-inet:ipv6-address; + description + "List of IPv6 addresses for the host entry"; + } + } + + grouping system-dns-static-state { + description + "Operational state data for static host entries"; + } + + grouping system-dns-static-top { + description + "Top-level grouping for static DNS host entries"; + + container host-entries { + description + "Enclosing container for list of static host entries"; + + list host-entry { + key "hostname"; + description + "List of static host entries"; + + leaf hostname { + type leafref { + path "../config/hostname"; + } + description + "Reference to the hostname list key"; + } + + container config { + description + "Configuration data for static host entries"; + + uses system-dns-static-config; + } + + container state { + + config false; + + description + "Operational state data for static host entries"; + + uses system-dns-static-config; + uses system-dns-static-state; + } + } + } + } + + grouping system-dns-servers-state { + description + "Operational state data for DNS resolvers"; + + } + + grouping system-dns-servers-top { + description + "Top-level grouping for the list of DNS resolvers."; + + container servers { + description + "Enclosing container for DNS resolver list"; + + list server { + key "address"; + ordered-by user; + description + "List of the DNS servers that the resolver should query. + + When the resolver is invoked by a calling application, it + sends the query to the first name server in this list. If + no response has been received within 'timeout' seconds, + the resolver continues with the next server in the list. + If no response is received from any server, the resolver + continues with the first server again. When the resolver + has traversed the list 'attempts' times without receiving + any response, it gives up and returns an error to the + calling application. + + Implementations MAY limit the number of entries in this + list."; + + leaf address { + type leafref { + path "../config/address"; + } + description + "References the configured address of the DNS server"; + } + + container config { + description + "Configuration data for each DNS resolver"; + + uses system-dns-servers-config; + } + + container state { + + config false; + + description + "Operational state data for each DNS resolver"; + + uses system-dns-servers-config; + uses system-dns-servers-state; + } + + } + } + } + + grouping system-dns-top { + description + "Top-level grouping for DNS / resolver config and operational + state data"; + + container dns { + description + "Enclosing container for DNS resolver data"; + + container config { + description + "Configuration data for the DNS resolver"; + + uses system-dns-config; + + } + + container state { + + config false; + + description + "Operational state data for the DNS resolver"; + + uses system-dns-config; + uses system-dns-state; + + } + + uses system-dns-servers-top; + uses system-dns-static-top; + } + } + + grouping system-ntp-server-config { + description + "Configuration data for NTP servers"; + + leaf address { + type oc-inet:host; + description + "The address or hostname of the NTP server."; + } + + leaf port { + type oc-inet:port-number; + default 123; + description + "The port number of the NTP server."; + } + + leaf version { + type uint8 { + range 1..4; + } + default 4; + description + "Version number to put in outgoing NTP packets"; + } + + leaf association-type { + type enumeration { + enum SERVER { + description + "Use client association mode. This device + will not provide synchronization to the + configured NTP server."; + } + enum PEER { + description + "Use symmetric active association mode. + This device may provide synchronization + to the configured NTP server."; + } + enum POOL { + description + "Use client association mode with one or + more of the NTP servers found by DNS + resolution of the domain name given by + the 'address' leaf. This device will not + provide synchronization to the servers."; + } + } + default SERVER; + description + "The desired association type for this NTP server."; + } + leaf iburst { + type boolean; + default false; + description + "Indicates whether this server should enable burst + synchronization or not."; + } + leaf prefer { + type boolean; + default false; + description + "Indicates whether this server should be preferred + or not."; + } + } + + grouping system-ntp-server-state { + description + "Operational state data for NTP servers"; + + leaf stratum { + type uint8; + description + "Indicates the level of the server in the NTP hierarchy. As + stratum number increases, the accuracy is degraded. Primary + servers are stratum while a maximum value of 16 indicates + unsynchronized. The values have the following specific + semantics: + + | 0 | unspecified or invalid + | 1 | primary server (e.g., equipped with a GPS receiver) + | 2-15 | secondary server (via NTP) + | 16 | unsynchronized + | 17-255 | reserved"; + reference + "RFC 5905 - Network Time Protocol Version 4: Protocol and + Algorithms Specification"; + } + + leaf root-delay { + type uint32; + // TODO: reconsider units for these values -- the spec defines + // rootdelay and rootdisperson as 2 16-bit integers for seconds + // and fractional seconds, respectively. This gives a + // precision of ~15 us (2^-16). Using milliseconds here based + // on what implementations typically provide and likely lack + // of utility for less than millisecond precision with NTP + // time sync. + units "milliseconds"; + description + "The round-trip delay to the server, in milliseconds."; + reference + "RFC 5905 - Network Time Protocol Version 4: Protocol and + Algorithms Specification"; + } + + leaf root-dispersion { + type uint64; + units "milliseconds"; + description + "Dispersion (epsilon) represents the maximum error inherent + in the measurement"; + reference + "RFC 5905 - Network Time Protocol Version 4: Protocol and + Algorithms Specification"; + } + + leaf offset { + type uint64; + units "milliseconds"; + description + "Estimate of the current time offset from the peer. This is + the time difference between the local and reference clock."; + } + + leaf poll-interval { + type uint32; + units "seconds"; + description + "Polling interval of the peer"; + } + } + + grouping system-ntp-server-top { + description + "Top-level grouping for the list of NTP servers"; + + container servers { + description + "Enclosing container for the list of NTP servers"; + + list server { + key "address"; + description + "List of NTP servers to use for system clock + synchronization. If '/system/ntp/enabled' + is 'true', then the system will attempt to + contact and utilize the specified NTP servers."; + + leaf address { + type leafref { + path "../config/address"; + } + description + "References the configured address or hostname of the + NTP server."; + } + + container config { + description + "Configuration data for an NTP server."; + + uses system-ntp-server-config; + } + + container state { + + config false; + + description + "Operational state data for an NTP server."; + + uses system-ntp-server-config; + uses system-ntp-server-state; + } + + } + } + } + + grouping system-ntp-auth-keys-config { + description + "Configuration data "; + + leaf key-id { + type uint16; + description + "Integer identifier used by the client and server to + designate a secret key. The client and server must use + the same key id."; + } + + leaf key-type { + type identityref { + base NTP_AUTH_TYPE; + } + description + "Encryption type used for the NTP authentication key"; + } + + leaf key-value { + type string; + description + "NTP authentication key value"; + } + } + + grouping system-ntp-auth-keys-state { + description + "Operational state data for NTP auth key data"; + } + + grouping system-ntp-auth-keys-top { + description + "Top-level grouping for NTP auth key data"; + + container ntp-keys { + description + "Enclosing container for list of NTP authentication keys"; + + list ntp-key { + key "key-id"; + description + "List of NTP authentication keys"; + + leaf key-id { + type leafref { + path "../config/key-id"; + } + description + "Reference to auth key-id list key"; + } + + container config { + description + "Configuration data for NTP auth keys"; + + uses system-ntp-auth-keys-config; + } + + container state { + + config false; + + description + "Operational state data for NTP auth keys"; + + uses system-ntp-auth-keys-config; + uses system-ntp-auth-keys-state; + } + } + } + } + + grouping system-ntp-config { + description + "Configuration data for system-wide NTP operation."; + + leaf enabled { + type boolean; + default false; + description + "Enables the NTP protocol and indicates that the system should + attempt to synchronize the system clock with an NTP server + from the servers defined in the 'ntp/server' list."; + } + + leaf ntp-source-address { + type oc-inet:ip-address; + description + "Source address to use on outgoing NTP packets"; + } + + leaf enable-ntp-auth { + type boolean; + default false; + description + "Enable or disable NTP authentication -- when enabled, the + system will only use packets containing a trusted + authentication key to synchronize the time."; + } + } + + grouping system-ntp-state { + description + "Operational state data for system-wide NTP operation."; + + leaf auth-mismatch { + type oc-yang:counter64; + description + "Count of the number of NTP packets received that were not + processed due to authentication mismatch."; + } + } + + grouping system-ntp-top { + description + "Top-level grouping for configuration and state data for NTP"; + + container ntp { + description + "Top-level container for NTP configuration and state"; + + container config { + description + "Configuration data for NTP client."; + + uses system-ntp-config; + } + + container state { + config false; + description + "Operational state data for NTP services."; + + uses system-ntp-config; + uses system-ntp-state; + } + uses system-ntp-auth-keys-top; + uses system-ntp-server-top; + } + } + + grouping system-memory-config { + description + "Configuration data for system memory"; + } + + grouping system-memory-state { + description + "Operational state data for system memory"; + + leaf physical { + type uint64; + units bytes; + // TODO: consider making units in megabytes + description + "Reports the total physical memory available on the + system."; + } + + leaf reserved { + type uint64; + units bytes; + description + "Memory reserved for system use"; + } + } + + grouping system-memory-top { + description + "Top-level grouping for system memory data definitions"; + + container memory { + description + "Top-level container for system memory data"; + + container config { + description + "Configuration data for system memory"; + + uses system-memory-config; + } + + container state { + config false; + description + "Operational state data for system memory"; + + uses system-memory-config; + uses system-memory-state; + } + } + } + + grouping system-cpu-state { + description + "Operational state data for the system CPU(s)"; + + leaf index { + type union { + type enumeration { + enum ALL { + description + "Index value indicating all CPUs in the system"; + } + } + type uint32; + } + description + "The CPU index for each processor core on the system. On a + single-core system, the index should be zero. The ALL + index signifies an aggregation of the CPU utilization + statistics over all cores in the system."; + } + + container total { + description + "Total CPU utilization."; + + uses oc-types:avg-min-max-instant-stats-pct; + } + + container user { + description + "Percentage of CPU time spent running in user space."; + + uses oc-types:avg-min-max-instant-stats-pct; + } + + container kernel { + description + "Percentage of CPU time spent running in kernel space."; + + uses oc-types:avg-min-max-instant-stats-pct; + } + + container nice { + description + "Percentage of CPU time spent running low-priority (niced) + user processes."; + + uses oc-types:avg-min-max-instant-stats-pct; + } + + container idle { + description + "Percentage of CPU time spent idle."; + + uses oc-types:avg-min-max-instant-stats-pct; + } + + container wait { + description + "Percentage of CPU time spent waiting for I/O."; + + uses oc-types:avg-min-max-instant-stats-pct; + } + + container hardware-interrupt { + description + "Percentage of CPU time spent servicing hardware interrupts."; + + uses oc-types:avg-min-max-instant-stats-pct; + } + + container software-interrupt { + description + "Percentage of CPU time spent servicing software interrupts"; + + uses oc-types:avg-min-max-instant-stats-pct; + } + } + + grouping system-cpu-top { + description + "Top-level grouping for system CPU data"; + + container cpus { + config false; + description + "Enclosing container for the list of CPU cores on the + system"; + + list cpu { + key "index"; + description + "List of CPU cores on the system (including logical CPUs + on hyperthreaded systems), keyed by either a numerical + index, or the ALL value for an entry representing the + aggregation across all CPUs."; + + leaf index { + type leafref { + path "../state/index"; + } + description + "Reference to list key"; + } + + container state { + + description + "Operational state data for the system CPU(s)"; + + uses system-cpu-state; + } + } + } + } + + grouping system-top { + description + "Top level system data containers"; + + container system { + description + "Enclosing container for system-related configuration and + operational state data"; + + container config { + description "Global configuration data for the system"; + + uses system-global-config; + + } + + container state { + config false; + description "Global operational state data for the system"; + + uses system-global-config; + uses system-global-state; + } + + uses system-clock-top; + uses system-dns-top; + uses system-ntp-top; + uses oc-sys-mgmt:system-grpc-server-top; + uses oc-sys-term:system-ssh-server-top; + uses oc-sys-term:system-telnet-server-top; + uses oc-log:logging-top; + uses oc-aaa:aaa-top; + uses system-memory-top; + uses system-cpu-top; + uses oc-proc:procmon-processes-top; + uses oc-alarms:alarms-top; + uses oc-messages:messages-top; + } + } + + // data definition statements + + uses system-top; + +} diff --git a/models/yang/sonic/Makefile b/models/yang/sonic/Makefile new file mode 100644 index 0000000000..9141ff952a --- /dev/null +++ b/models/yang/sonic/Makefile @@ -0,0 +1,53 @@ +TOPDIR := ../../../ +SONIC_YANGAPI_DIR := $(TOPDIR)/build/yaml +SONIC_YANGDIR := $(TOPDIR)/models/yang/sonic +SONIC_YANGDIR_DEVIATION := $(TOPDIR)/models/yang/sonic/deviation +SONIC_YANGDIR_COMMON := $(TOPDIR)/models/yang/sonic/common +SONIC_YANGDIR_COMMON_IETF := $(TOPDIR)/models/yang/sonic/common/ietf +SONIC_YANG_MOD_FILES := $(shell find $(SONIC_YANGDIR) -maxdepth 1 -name '*.yang' | sort) +SONIC_YANG_COMMON_FILES := $(shell find $(SONIC_YANGDIR_COMMON) -name '*.yang' | sort) +SONIC_YANG_COMMON_FILES += $(shell find $(SONIC_YANGDIR_COMMON_IETF) -name '*.yang' | sort) + +SONIC_TOOLS_DIR := $(TOPDIR)/tools +SONIC_PYANG_DIR := $(SONIC_TOOLS_DIR)/pyang +SONIC_PYANG_PLUGIN_DIR := $(SONIC_PYANG_DIR)/pyang_plugins +SONIC_PYANG_BIN := pyang + +all: yamlGen allyangs.tree allyangs_tree.html + +#yamlGen: $(SONIC_YANGAPI_DIR)/.done + +allyangs.tree: $(SONIC_YANG_MOD_FILES) $(SONIC_YANG_COMMON_FILES) + $(SONIC_PYANG_BIN) \ + -f tree \ + -o $(SONIC_YANGDIR)/$@ \ + -p $(SONIC_YANGDIR_COMMON):$(SONIC_YANGDIR) \ + $(SONIC_YANG_MOD_FILES) + @echo "+++++ Generation of YANG tree for Sonic Yang modules completed +++++" + +allyangs_tree.html: $(SONIC_YANG_MOD_FILES) $(SONIC_YANG_COMMON_FILES) + $(SONIC_PYANG_BIN) \ + -f jstree \ + -o $(SONIC_YANGDIR)/$@ \ + -p $(SONIC_YANGDIR_COMMON):$(SONIC_YANGDIR) \ + $(SONIC_YANG_MOD_FILES) + @echo "+++++ Generation of HTML tree for Sonic Yang modules completed +++++" + +#====================================================================== +# Generate YAML files for SONiC YANG modules +#====================================================================== +yamlGen: + @echo "+++++ Generating YAML files for Sonic Yang modules +++++" + mkdir -p $(SONIC_YANGAPI_DIR) + $(SONIC_PYANG_BIN) \ + -f swaggerapi \ + --outdir $(SONIC_YANGAPI_DIR) \ + --plugindir $(SONIC_PYANG_PLUGIN_DIR) \ + -p $(SONIC_YANGDIR_COMMON):$(SONIC_YANGDIR) \ + $(SONIC_YANG_MOD_FILES) + @echo "+++++ Generation of YAML files for Sonic Yang modules completed +++++" + +clean: + @echo "Removing files ..." + rm -rf $(SONIC_YANGAPI_DIR) + rm -rf allyangs.tree allyangs_tree.html diff --git a/models/yang/sonic/common/sonic-common.yang b/models/yang/sonic/common/sonic-common.yang new file mode 100644 index 0000000000..45d608b684 --- /dev/null +++ b/models/yang/sonic/common/sonic-common.yang @@ -0,0 +1,50 @@ + +module sonic-common { + namespace "http://github.com/Azure/sonic-common"; + prefix cmn; + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC common definitions"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + typedef tagging_mode { + type enumeration { + enum untagged; + enum tagged; + enum priority_tagged; + } + } + + typedef admin-status { + type enumeration { + enum up; + enum down; + } + } + + container operation { + description "This definition is used internally by CVL and + is not exposed in NBI. Leaf 'operation' allows + evaluation of must expression for CREATE/UPDATE/DELETE + operation."; + + leaf operation { + type enumeration { + enum NOP; + enum CREATE; + enum UPDATE; + enum DELETE; + } + } + } +} diff --git a/models/yang/sonic/common/sonic-extension.yang b/models/yang/sonic/common/sonic-extension.yang new file mode 100644 index 0000000000..f488809586 --- /dev/null +++ b/models/yang/sonic/common/sonic-extension.yang @@ -0,0 +1,61 @@ + +module sonic-extension { + namespace "http://github.com/Azure/sonic-extension"; + prefix sonic-ext; + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC Extension"; + + revision 2019-09-18 { + description + "Initial revision."; + } + + extension custom-handler { + description + "Node should be handled by custom handler"; + argument "name"; + } + + extension db-name { + description + "DB name, e.g. APPL_DB, CONFIG_DB"; + argument "value"; + } + + extension key-delim { + description + "Key delimeter, e.g. - |, :"; + argument "value"; + } + + extension key-pattern { + description + "Key pattern, e.g. - ACL_RULE|{aclname}|{rulename}"; + argument "value"; + } + + extension map-list { + description + "If it is a map list"; + argument "value"; + } + + extension map-leaf { + description + "Map leaf names"; + argument "value"; + } + + extension pf-check { + description + "Platform specific validation"; + argument "handler"; + } +} diff --git a/models/yang/sonic/sonic-acl.yang b/models/yang/sonic/sonic-acl.yang new file mode 100644 index 0000000000..fba2aad4a9 --- /dev/null +++ b/models/yang/sonic/sonic-acl.yang @@ -0,0 +1,221 @@ +module sonic-acl { + namespace "http://github.com/Azure/sonic-acl"; + prefix acl; + yang-version 1.1; + + import ietf-inet-types { + prefix inet; + } + + import sonic-port { + prefix prt; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC ACL"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-acl { + + container ACL_TABLE { + + list ACL_TABLE_LIST { + key "aclname"; + + leaf aclname { + type string { + pattern '[a-zA-Z0-9]{1}([-a-zA-Z0-9_]{1,63})' { + error-app-tag aclname-invalid; + } + } + } + + leaf policy_desc { + type string { + length 1..255 { + error-app-tag policy-desc-invalid-length; + } + } + } + + leaf stage { + type enumeration { + enum INGRESS; + enum EGRESS; + } + } + + leaf type { + type enumeration { + enum MIRROR; + enum MIRRORV6; + enum L3; + enum L3V6; + } + } + + leaf-list ports { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + } + } + } + + container ACL_RULE { + + list ACL_RULE_LIST { + key "aclname rulename"; + + leaf aclname { + type leafref { + path "../../../ACL_TABLE/ACL_TABLE_LIST/aclname"; + } + } + + leaf rulename { + type string { + pattern '[a-zA-Z0-9]{1}([-a-zA-Z0-9_]{1,63})' { + error-app-tag rulename-invalid; + } + } + } + + leaf PRIORITY { + type uint16 { + range "1..65535"{ + error-app-tag priority-invalid-range; + error-message "Invalid ACL rule priority."; + } + } + } + + leaf RULE_DESCRIPTION { + type string { + length 1..255 { + error-app-tag ruledesc-invalid-length; + } + } + } + + leaf PACKET_ACTION { + mandatory true; + type enumeration { + enum FORWARD; + enum DROP; + enum REDIRECT; + } + } + + leaf IP_TYPE { + mandatory true; + type enumeration { + enum ANY; + enum IP; + enum IPV4; + enum IPV4ANY; + enum NON_IPV4; + enum IPV6ANY; + enum NON_IPV6; + } + } + + leaf IP_PROTOCOL { + type uint8 { + range "1|2|6|17|46|47|51|103|115"; + } + } + + leaf ETHER_TYPE { + type string { + pattern "(0x88CC)|(0x8100)|(0x8915)|(0x0806)|(0x0800)|(0x86DD)|(0x8847)" { + error-message "Invalid ACL Rule Ether Type"; + error-app-tag ether-type-invalid; + } + } + } + + choice ip_src_dst { + case ipv4_src_dst { + when "boolean(IP_TYPE[.='ANY' or .='IP' or .='IPV4' or .='IPV4ANY'])"; + leaf SRC_IP { + mandatory true; + type inet:ipv4-prefix; + } + leaf DST_IP { + mandatory true; + type inet:ipv4-prefix; + } + } + case ipv6_src_dst { + when "boolean(IP_TYPE[.='ANY' or .='IP' or .='IPV6' or .='IPV6ANY'])"; + leaf SRC_IPV6 { + mandatory true; + type inet:ipv6-prefix; + } + leaf DST_IPV6 { + mandatory true; + type inet:ipv6-prefix; + } + } + } + + choice src_port { + case l4_src_port { + leaf L4_SRC_PORT { + type inet:port-number; + } + } + case l4_src_port_range { + leaf L4_SRC_PORT_RANGE { + type string { + pattern "[0-9]{1,5}(-)[0-9]{1,5}" { + error-app-tag src-port-range-invalid; + } + } + } + } + } + + choice dst_port { + case l4_dst_port { + leaf L4_DST_PORT { + type inet:port-number; + } + } + case l4_dst_port_range { + leaf L4_DST_PORT_RANGE { + type string { + pattern "[0-9]{1,5}(-)[0-9]{1,5}" { + error-app-tag dst-port-range-invalid; + } + } + } + } + } + + leaf TCP_FLAGS { + type string { + pattern "0[xX][0-9a-fA-F]{2}[/]0[xX][0-9a-fA-F]{2}" { + error-app-tag tcp-flag-invalid; + } + } + } + + leaf DSCP { + type inet:dscp; + } + } + } + } +} diff --git a/models/yang/sonic/sonic-interface.yang b/models/yang/sonic/sonic-interface.yang new file mode 100644 index 0000000000..3d22195fc5 --- /dev/null +++ b/models/yang/sonic/sonic-interface.yang @@ -0,0 +1,67 @@ +module sonic-interface { + namespace "http://github.com/Azure/sonic-interface"; + prefix sint; + + import ietf-inet-types { + prefix inet; + } + + import sonic-port { + prefix prt; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC INTERFACE"; + + revision 2019-07-02 { + description + "Initial revision."; + } + + container sonic-interface { + + container INTERFACE { + + list INTERFACE_LIST { + key "portname"; + + leaf portname{ + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + } + + /* Add a leafref, once VRF YANG is supported + leaf vrf-name { + type string { + pattern 'Vrf([-a-zA-Z0-9_]{1,60})' { + error-app-tag vrf-name-invalid; + } + } + } + */ + + } + + list INTERFACE_IPADDR_LIST { + key "portname ip_prefix"; + + leaf portname{ + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + } + + leaf ip_prefix { + type inet:ip-prefix; + } + } + } + } +} diff --git a/models/yang/sonic/sonic-port.yang b/models/yang/sonic/sonic-port.yang new file mode 100644 index 0000000000..4050bd3705 --- /dev/null +++ b/models/yang/sonic/sonic-port.yang @@ -0,0 +1,93 @@ +module sonic-port { + namespace "http://github.com/Azure/sonic-port"; + prefix prt; + + import sonic-common { + prefix cmn; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC VLAN"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + + container sonic-port { + + container PORT { + + list PORT_LIST { + key "ifname"; + + leaf ifname { + type string { + pattern "Ethernet([1-3][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[0-9])" { + error-message "Invalid interface name"; + error-app-tag interface-name-invalid; + } + } + } + + leaf index { + type uint16; + mandatory true; + + } + + leaf speed { + type uint64 { + range "1000|10000|25000|40000|50000|100000|400000" { + error-message "Invalid Ethernet interface speed"; + error-app-tag port-speed-invalid; + } + } + } + + leaf valid_speeds { + type string; + } + + leaf alias { + type string { + pattern '[ -~]{0,64}'; + } + } + + leaf description { + type string { + pattern '[ -~]{0,64}'; + } + } + + leaf mtu{ + type uint32 { + range "1312..9216" { + error-message "Invalid MTU value"; + error-app-tag mtu-invalid; + } + } + default 9100; + } + + leaf lanes { + type string; + mandatory true; + } + + leaf admin_status { + type cmn:admin-status; + default "down"; + } + } + } + } +} diff --git a/patches/jsonquery.patch b/patches/jsonquery.patch new file mode 100644 index 0000000000..122ef8e014 --- /dev/null +++ b/patches/jsonquery.patch @@ -0,0 +1,14 @@ +diff --git a/node.go b/node.go +index 76032bb..db73a1e 100644 +--- a/node.go ++++ b/node.go +@@ -155,3 +155,9 @@ func Parse(r io.Reader) (*Node, error) { + } + return parse(b) + } ++ ++func ParseJsonMap(jsonMap *map[string]interface{}) (*Node, error) { ++ doc := &Node{Type: DocumentNode} ++ parseValue(*jsonMap, doc, 1) ++ return doc, nil ++} diff --git a/src/.gitkeep b/src/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/CLI/.gitkeep b/src/CLI/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/CLI/Makefile b/src/CLI/Makefile new file mode 100644 index 0000000000..a12bdaad28 --- /dev/null +++ b/src/CLI/Makefile @@ -0,0 +1,53 @@ +SHELL = /bin/bash +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + +.ONESHELL: +.SHELLFLAGS += -e + +SUBDIRS := clitree renderer klish +export SONIC_CLI_ROOT=$(TOPDIR)/build +TGT_DIR := $(SONIC_CLI_ROOT)/target + +all: packages $(SUBDIRS) +$(SUBDIRS): + $(MAKE) -C $@ + +.PHONY: clean + +all: + for dir in $(SUBDIRS); do \ + $(MAKE) -C $$dir -f Makefile $@; \ + done + + rm -rf $(TOPDIR)/build/cli/* + mv -f $(TGT_DIR) $(TOPDIR)/build/cli + +clean: + make --directory=klish clean + rm -rf $(TOPDIR)/build/cli + rm -rf $(TGT_DIR) + +packages: + if ! dpkg -l | grep autoconf -c >>/dev/null; then sudo apt-get install autoconf; fi + if ! dpkg -l | grep m4 -c >>/dev/null; then sudo apt-get install m4; fi + if ! dpkg -l | grep libxml2-utils -c >>/dev/null; then sudo apt-get install libxml2-utils; fi + if ! dpkg -l | grep xsltproc -c >>/dev/null; then sudo apt-get install xsltproc; fi + if ! dpkg -l | grep python-lxml -c >>/dev/null; then sudo apt-get install python-lxml; fi + if ! dpkg -l | grep libexpat1-dev -c >>/dev/null; then sudo apt-get install libexpat1-dev; fi + diff --git a/src/CLI/actioner/sonic-cli-acl.py b/src/CLI/actioner/sonic-cli-acl.py new file mode 100755 index 0000000000..f694c29db9 --- /dev/null +++ b/src/CLI/actioner/sonic-cli-acl.py @@ -0,0 +1,278 @@ +#!/usr/bin/python +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + +import sys +import time +import json +import collections +import re +import ast +import openconfig_acl_client +from rpipe_utils import pipestr +from openconfig_acl_client.rest import ApiException +from scripts.render_cli import show_cli_output + +import urllib3 +urllib3.disable_warnings() + +plugins = dict() + +def register(func): + """Register sdk client method as a plug-in""" + plugins[func.__name__] = func + return func + + +def call_method(name, args): + method = plugins[name] + return method(args) + +def generate_body(func, args): + body = None + # Get the rules of all ACL table entries. + if func.__name__ == 'get_openconfig_acl_acl_acl_sets': + keypath = [] + + # Get Interface binding to ACL table info + elif func.__name__ == 'get_openconfig_acl_acl_interfaces': + keypath = [] + + # Get all the rules specific to an ACL table. + elif func.__name__ == 'get_openconfig_acl_acl_acl_sets_acl_set_acl_entries': + keypath = [ args[0], args[1] ] + + # Configure ACL table + elif func.__name__ == 'patch_openconfig_acl_acl_acl_sets_acl_set' : + keypath = [ args[0], args[1] ] + body = { "openconfig-acl:config": { + "name": args[0], + "type": args[1], + "description": "" + } + } + + # Configure ACL rule specific to an ACL table + elif func.__name__ == 'patch_list_openconfig_acl_acl_acl_sets_acl_set_acl_entries_acl_entry' : + keypath = [ args[0], args[1] ] + forwarding_action = "ACCEPT" if args[3] == 'permit' else 'DROP' + proto_number = {"icmp":"IP_ICMP","tcp":"IP_TCP","udp":"IP_UDP","6":"IP_TCP","17":"IP_UDP","1":"IP_ICMP", + "2":"IP_IGMP","103":"IP_PIM","46":"IP_RSVP","47":"IP_GRE","51":"IP_AUTH","115":"IP_L2TP"} + if args[4] not in proto_number.keys(): + print("%Error: Invalid protocol number") + exit(1) + else: + protocol = proto_number.get(args[4]) + body=collections.defaultdict(dict) + body["acl-entry"]=[{ + "sequence-id": int(args[2]), + "config": { + "sequence-id": int(args[2]) + }, + "ipv4":{ + "config":{ + "protocol": protocol + } + }, + "transport": { + "config": { + } + }, + "actions": { + "config": { + "forwarding-action": forwarding_action + } + } + }] + re_ip = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") + if re_ip.match(args[5]): + body["acl-entry"][0]["ipv4"]["config"]["source-address"]=args[5] + elif args[5]=="any": + body["acl-entry"][0]["ipv4"]["config"]["source-address"]="0.0.0.0/0" + flags_list=[] + i=6 + while(i%s : %s\n" %(func.__name__, e)) + if e.body != "": + body = json.loads(e.body) + if "ietf-restconf:errors" in body: + err = body["ietf-restconf:errors"] + if "error" in err: + errList = err["error"] + + errDict = {} + for dict in errList: + for k, v in dict.iteritems(): + errDict[k] = v + + if "error-message" in errDict: + print "%Error: " + errDict["error-message"] + return + print "%Error: Transaction Failure" + return + print "%Error: Transaction Failure" + + +if __name__ == '__main__': + + pipestr().write(sys.argv) + #pdb.set_trace() + func = eval(sys.argv[1], globals(), openconfig_acl_client.OpenconfigAclApi.__dict__) + run(func, sys.argv[2:]) diff --git a/src/CLI/actioner/sonic-cli-if.py b/src/CLI/actioner/sonic-cli-if.py new file mode 100755 index 0000000000..9ed5f27006 --- /dev/null +++ b/src/CLI/actioner/sonic-cli-if.py @@ -0,0 +1,154 @@ +#!/usr/bin/python +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + +import sys +import time +import json +import ast +import openconfig_interfaces_client +from rpipe_utils import pipestr +from openconfig_interfaces_client.rest import ApiException +from scripts.render_cli import show_cli_output + +import urllib3 +urllib3.disable_warnings() + + +plugins = dict() + +def register(func): + """Register sdk client method as a plug-in""" + plugins[func.__name__] = func + return func + + +def call_method(name, args): + method = plugins[name] + return method(args) + +def generate_body(func, args): + body = None + # Get the rules of all ACL table entries. + if func.__name__ == 'patch_openconfig_interfaces_interfaces_interface_config_description': + keypath = [ args[0] ] + body = { "openconfig-interfaces:description": args[1] } + elif func.__name__ == 'patch_openconfig_interfaces_interfaces_interface_config_enabled': + keypath = [ args[0] ] + if args[1] == "True": + body = { "openconfig-interfaces:enabled": True } + else: + body = { "openconfig-interfaces:enabled": False } + elif func.__name__ == 'patch_openconfig_interfaces_interfaces_interface_config_mtu': + keypath = [ args[0] ] + body = { "openconfig-interfaces:mtu": int(args[1]) } + elif func.__name__ == 'patch_openconfig_if_ip_interfaces_interface_subinterfaces_subinterface_ipv4_addresses_address_config': + sp = args[1].split('/') + keypath = [ args[0], 0, sp[0] ] + body = { "openconfig-if-ip:config": {"ip" : sp[0], "prefix-length" : int(sp[1])} } + elif func.__name__ == 'patch_openconfig_if_ip_interfaces_interface_subinterfaces_subinterface_ipv6_addresses_address_config': + sp = args[1].split('/') + keypath = [ args[0], 0, sp[0] ] + body = { "openconfig-if-ip:config": {"ip" : sp[0], "prefix-length" : int(sp[1])} } + elif func.__name__ == 'delete_openconfig_if_ip_interfaces_interface_subinterfaces_subinterface_ipv4_addresses_address_config_prefix_length': + keypath = [args[0], 0, args[1]] + elif func.__name__ == 'delete_openconfig_if_ip_interfaces_interface_subinterfaces_subinterface_ipv6_addresses_address_config_prefix_length': + keypath = [args[0], 0, args[1]] + elif func.__name__ == 'get_openconfig_interfaces_interfaces_interface': + keypath = [args[0]] + elif func.__name__ == 'get_openconfig_interfaces_interfaces': + keypath = [] + else: + body = {} + + return keypath,body + +def getId(item): + prfx = "Ethernet" + state_dict = item['state'] + ifName = state_dict['name'] + + if ifName.startswith(prfx): + ifId = int(ifName[len(prfx):]) + return ifId + return ifName + +def run(func, args): + + c = openconfig_interfaces_client.Configuration() + c.verify_ssl = False + aa = openconfig_interfaces_client.OpenconfigInterfacesApi(api_client=openconfig_interfaces_client.ApiClient(configuration=c)) + + # create a body block + keypath, body = generate_body(func, args) + + try: + if body is not None: + api_response = getattr(aa,func.__name__)(*keypath, body=body) + else : + api_response = getattr(aa,func.__name__)(*keypath) + + if api_response is None: + print ("Success") + else: + # Get Command Output + api_response = aa.api_client.sanitize_for_serialization(api_response) + if 'openconfig-interfaces:interfaces' in api_response: + value = api_response['openconfig-interfaces:interfaces'] + if 'interface' in value: + tup = value['interface'] + value['interface'] = sorted(tup, key=getId) + + if api_response is None: + print("Failed") + else: + if func.__name__ == 'get_openconfig_interfaces_interfaces_interface': + show_cli_output(args[1], api_response) + elif func.__name__ == 'get_openconfig_interfaces_interfaces': + show_cli_output(args[0], api_response) + else: + return + except ApiException as e: + #print("Exception when calling OpenconfigInterfacesApi->%s : %s\n" %(func.__name__, e)) + if e.body != "": + body = json.loads(e.body) + if "ietf-restconf:errors" in body: + err = body["ietf-restconf:errors"] + if "error" in err: + errList = err["error"] + + errDict = {} + for dict in errList: + for k, v in dict.iteritems(): + errDict[k] = v + + if "error-message" in errDict: + print "%Error: " + errDict["error-message"] + return + print "%Error: Transaction Failure" + return + print "%Error: Transaction Failure" + else: + print "Failed" + +if __name__ == '__main__': + + pipestr().write(sys.argv) + func = eval(sys.argv[1], globals(), openconfig_interfaces_client.OpenconfigInterfacesApi.__dict__) + + run(func, sys.argv[2:]) diff --git a/src/CLI/actioner/sonic-cli-lldp.py b/src/CLI/actioner/sonic-cli-lldp.py new file mode 100644 index 0000000000..11d71479b2 --- /dev/null +++ b/src/CLI/actioner/sonic-cli-lldp.py @@ -0,0 +1,99 @@ +#!/usr/bin/python +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + +import sys +import time +import json +import ast +import openconfig_lldp_client +from rpipe_utils import pipestr +from openconfig_lldp_client.rest import ApiException +from scripts.render_cli import show_cli_output + + +import urllib3 +urllib3.disable_warnings() +plugins = dict() + + +def register(func): + """Register sdk client method as a plug-in""" + plugins[func.__name__] = func + return func + +def call_method(name, args): + method = plugins[name] + return method(args) + +def generate_body(func, args): + body = None + if func.__name__ == 'get_openconfig_lldp_lldp_interfaces': + keypath = [] + elif func.__name__ == 'get_openconfig_lldp_lldp_interfaces_interface': + keypath = [args[1]] + else: + body = {} + + return keypath,body + + +def run(func, args): + c = openconfig_lldp_client.Configuration() + c.verify_ssl = False + aa = openconfig_lldp_client.OpenconfigLldpApi(api_client=openconfig_lldp_client.ApiClient(configuration=c)) + + # create a body block + keypath, body = generate_body(func, args) + + try: + if body is not None: + api_response = getattr(aa,func.__name__)(*keypath, body=body) + else : + api_response = getattr(aa,func.__name__)(*keypath) + if api_response is None: + print ("Success") + else: + response = api_response.to_dict() + if 'openconfig_lldpinterfaces' in response.keys(): + if not response['openconfig_lldpinterfaces']: + return + neigh_list = response['openconfig_lldpinterfaces']['interface'] + if neigh_list is None: + return + show_cli_output(sys.argv[2],neigh_list) + elif 'openconfig_lldpinterface' in response.keys(): + neigh = response['openconfig_lldpinterface']#[0]['neighbors']['neighbor'] + if neigh is None: + return + if sys.argv[3] is not None: + if neigh[0]['neighbors']['neighbor'][0]['state'] is None: + print('No LLDP neighbor interface') + else: + show_cli_output(sys.argv[2],neigh) + else: + show_cli_output(sys.argv[2],neigh) + else: + print("Failed") + except ApiException as e: + print("Exception when calling OpenconfigLldpApi->%s : %s\n" %(func.__name__, e)) + +if __name__ == '__main__': + pipestr().write(sys.argv) + func = eval(sys.argv[1], globals(), openconfig_lldp_client.OpenconfigLldpApi.__dict__) + run(func, sys.argv[2:]) diff --git a/src/CLI/actioner/sonic-cli-pfm.py b/src/CLI/actioner/sonic-cli-pfm.py new file mode 100644 index 0000000000..155e404961 --- /dev/null +++ b/src/CLI/actioner/sonic-cli-pfm.py @@ -0,0 +1,128 @@ +#!/usr/bin/python +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + +import sys +import time +import json +import ast +import openconfig_platform_client +from rpipe_utils import pipestr +from openconfig_platform_client.rest import ApiException +from scripts.render_cli import show_cli_output + + +import urllib3 +urllib3.disable_warnings() + +blocked_fields = {'parent':0, 'used_power':0, 'allocated_power':0, 'temperature':0} +plugins = dict() + +def filter_json_value(value): + for key,val in value.items(): + if key in blocked_fields: + del value[key] + else: + temp = key.split('_') + alt_key = '' + for i in temp: + alt_key = alt_key + i.capitalize() + ' ' + value[alt_key]=value.pop(key) + + return value + +def register(func): + """Register sdk client method as a plug-in""" + plugins[func.__name__] = func + return func + + +def call_method(name, args): + method = plugins[name] + return method(args) + +def generate_body(func, args): + body = None + # Get the rules of all ACL table entries. + + if func.__name__ == 'get_openconfig_platform_components': + keypath = [] + + else: + body = {} + + return keypath,body + + +def run(func, args): + c = openconfig_platform_client.Configuration() + c.verify_ssl = False + aa = openconfig_platform_client.OpenconfigPlatformApi(api_client=openconfig_platform_client.ApiClient(configuration=c)) + + # create a body block + keypath, body = generate_body(func, args) + + try: + if body is not None: + api_response = getattr(aa,func.__name__)(*keypath, body=body) + + else : + api_response = getattr(aa,func.__name__)(*keypath) + + if api_response is None: + print ("Success") + else: + api_response = aa.api_client.sanitize_for_serialization(api_response) + value = api_response['openconfig-platform:components']['component'][0]['state'] + if value is None: + return + if 'oper-status' in value: + temp = value['oper-status'].split(':') + if temp[len(temp) - 1] is not None: + value['oper-status'] = temp[len(temp) - 1] + show_cli_output(sys.argv[2],filter_json_value(value)) + + except ApiException as e: + if e.body != "": + body = json.loads(e.body) + if "ietf-restconf:errors" in body: + err = body["ietf-restconf:errors"] + if "error" in err: + errList = err["error"] + + errDict = {} + for dict in errList: + for k, v in dict.iteritems(): + errDict[k] = v + + if "error-message" in errDict: + print "%Error: " + errDict["error-message"] + return + print "%Error: Application Failure" + return + print "%Error: Application Failure" + else: + print "Failed" + +if __name__ == '__main__': + + pipestr().write(sys.argv) + #pdb.set_trace() + func = eval(sys.argv[1], globals(), openconfig_platform_client.OpenconfigPlatformApi.__dict__) + run(func, sys.argv[2:]) + diff --git a/src/CLI/actioner/sonic-cli-sys.py b/src/CLI/actioner/sonic-cli-sys.py new file mode 100644 index 0000000000..1fbbb7317d --- /dev/null +++ b/src/CLI/actioner/sonic-cli-sys.py @@ -0,0 +1,164 @@ +#:!/usr/bin/python +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + +import sys +import time +import json +import ast +import openconfig_system_client +from rpipe_utils import pipestr +from openconfig_system_client.rest import ApiException +from scripts.render_cli import show_cli_output + + +import urllib3 +urllib3.disable_warnings() + + +plugins = dict() + +def util_capitalize(value): + for key,val in value.items(): + temp = key.split('_') + alt_key = '' + for i in temp: + alt_key = alt_key + i.capitalize() + ' ' + value[alt_key]=value.pop(key) + return value + +def system_state_key_change(value): + value.pop('motd_banner') + value.pop('login_banner') + return util_capitalize(value) + + +def memory_key_change(value): + value['Total']=value.pop('physical') + value['Used']=value.pop('reserved') + return value + +def register(func): + """Register sdk client method as a plug-in""" + plugins[func.__name__] = func + return func + + +def call_method(name, args): + method = plugins[name] + return method(args) + +def generate_body(func, args): + body = None + # Get the rules of all ACL table entries. + + if func.__name__ == 'get_openconfig_system_system_state': + keypath = [] + elif func.__name__ == 'get_openconfig_system_system_clock': + keypath = [] + elif func.__name__ == 'get_openconfig_system_system_memory': + keypath = [] + elif func.__name__ == 'get_openconfig_system_system_cpus': + keypath = [] + elif func.__name__ == 'get_openconfig_system_system_processes': + keypath = [] + elif func.__name__ == 'get_openconfig_system_components': + keypath = [] + + else: + body = {} + + return keypath,body + + +def run(func, args): + c = openconfig_system_client.Configuration() + c.verify_ssl = False + aa = openconfig_system_client.OpenconfigSystemApi(api_client=openconfig_system_client.ApiClient(configuration=c)) + + # create a body block + keypath, body = generate_body(func, args) + + try: + if body is not None: + api_response = getattr(aa,func.__name__)(*keypath, body=body) + + else : + api_response = getattr(aa,func.__name__)(*keypath) + if api_response is None: + print ("Success") + else: + response = api_response.to_dict() + if 'openconfig_systemstate' in response.keys(): + value = response['openconfig_systemstate'] + if value is None: + return + show_cli_output(sys.argv[2], system_state_key_change(value)) + + elif 'openconfig_systemmemory' in response.keys(): + value = response['openconfig_systemmemory'] + if value is None: + return + show_cli_output(sys.argv[2], memory_key_change(value['state'])) + elif 'openconfig_systemcpus' in response.keys(): + value = response['openconfig_systemcpus'] + if value is None: + return + show_cli_output(sys.argv[2], value['cpu']) + elif 'openconfig_systemprocesses' in response.keys(): + value = response['openconfig_systemprocesses'] + if 'pid' not in sys.argv: + if value is None: + return + show_cli_output(sys.argv[2],value['process']) + else: + for proc in value['process']: + if proc['pid'] == int(sys.argv[3]): + show_cli_output(sys.argv[2],util_capitalize(proc['state'])) + return + else: + print("Failed") + except ApiException as e: + if e.body != "": + body = json.loads(e.body) + if "ietf-restconf:errors" in body: + err = body["ietf-restconf:errors"] + if "error" in err: + errList = err["error"] + + errDict = {} + for dict in errList: + for k, v in dict.iteritems(): + errDict[k] = v + + if "error-message" in errDict: + print "%Error: " + errDict["error-message"] + return + print "%Error: Application Failure" + return + print "%Error: Application Failure" + else: + print "Failed" + +if __name__ == '__main__': + + pipestr().write(sys.argv) + #pdb.set_trace() + func = eval(sys.argv[1], globals(), openconfig_system_client.OpenconfigSystemApi.__dict__) + run(func, sys.argv[2:]) + diff --git a/src/CLI/clicfg/mgmt_clish_entities.xsl b/src/CLI/clicfg/mgmt_clish_entities.xsl new file mode 100644 index 0000000000..a21cca8d99 --- /dev/null +++ b/src/CLI/clicfg/mgmt_clish_entities.xsl @@ -0,0 +1,26 @@ + + + + + + + + +<!ENTITY ""> + + diff --git a/src/CLI/clicfg/mgmt_clish_entities_macro.xsl b/src/CLI/clicfg/mgmt_clish_entities_macro.xsl new file mode 100644 index 0000000000..f20fd62e6f --- /dev/null +++ b/src/CLI/clicfg/mgmt_clish_entities_macro.xsl @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + diff --git a/src/CLI/clicfg/mgmt_clish_feature_master.xsd b/src/CLI/clicfg/mgmt_clish_feature_master.xsd new file mode 100644 index 0000000000..fd7c330370 --- /dev/null +++ b/src/CLI/clicfg/mgmt_clish_feature_master.xsd @@ -0,0 +1,98 @@ + + + + + + + This contains the allowed feature names for any platform specific customizable feature names. If you are adding a new platform customizable feature, add a record in the enumerated list here. + + + + + + + + + This contains the allowed feature-value names for any platform specific customizable feature-value strings. If you are adding a new platform customizable entity, add a record in the enumerated list here. + + + + + + + + + + + + This represents a feature-value entity. Do not add or delete anything here. +For adding a new feature-value, use entityname_t. For adding constraints on the count of +entities, use entity_list_t + + + + + + + + + + + + + + + This represents a feature-value entity. Do not add or delete anything here. +For adding a new feature-value, use entityname_t. For adding constraints on the count +of entities, use entity_list_t + + + + + + + + + + + + + + + + + + + + This is the top level module that lists the master list of all features and feature-value names. +If you are adding a new feature, add a record in the featurename_t. +If you are adding a new feature-value, add a record in the entityname_t + + + + + + + + + + + diff --git a/src/CLI/clicfg/mgmt_clish_features.xsl b/src/CLI/clicfg/mgmt_clish_features.xsl new file mode 100644 index 0000000000..2c9ebad834 --- /dev/null +++ b/src/CLI/clicfg/mgmt_clish_features.xsl @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/CLI/clicfg/mgmt_clish_platform.xml b/src/CLI/clicfg/mgmt_clish_platform.xml new file mode 100644 index 0000000000..f421e8ce26 --- /dev/null +++ b/src/CLI/clicfg/mgmt_clish_platform.xml @@ -0,0 +1,38 @@ + + + + + + + + + START_PORT_ID + MAX_PORT_ID + START_SUB_PORT_ID + MAX_SUB_PORT_ID + MAX_MTU + + diff --git a/src/CLI/clitree/Makefile b/src/CLI/clitree/Makefile new file mode 100644 index 0000000000..344db6e848 --- /dev/null +++ b/src/CLI/clitree/Makefile @@ -0,0 +1,42 @@ +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + +.PHONY: install + +TGT_DIR := $(SONIC_CLI_ROOT)/target + +all: + mkdir -p ${TGT_DIR}/command-tree ${TGT_DIR}/cli-macro ${TGT_DIR}/render-templates ${TGT_DIR}/scripts + cp -r cli-xml/include ${TGT_DIR}/command-tree + cp cli-xml/*.xml ${TGT_DIR}/command-tree + cp macro/*.xml ${TGT_DIR}/cli-macro + (cd scripts;./klish_platform_features_process.sh ../../clicfg ${TGT_DIR}) + python scripts/klish_preproc_cmdtree.py ${TGT_DIR}/command-tree ${TGT_DIR}/cli-macro 3 + cp ./../actioner/*.py ${TGT_DIR}/. + cp ../renderer/scripts/*.py ${TGT_DIR}/scripts + cp ../renderer/templates/* ${TGT_DIR}/render-templates + cp scripts/sonic-clish.xsd ${TGT_DIR}/command-tree + (cd ${TGT_DIR}/command-tree ; xmllint --noout --schema sonic-clish.xsd ${TGT_DIR}/command-tree/*.xml && \ + xmllint --noout --schema sonic-clish.xsd ${TGT_DIR}/command-tree/include/*.xml) || exit 1 + rm -rf ${TGT_DIR}/cli-macro + rm -rf scripts/*.pyc + +clean: + rm -rf ${TGT_DIR} + @echo "Clitree Cleaned" + diff --git a/src/CLI/clitree/cli-xml/acl.xml b/src/CLI/clitree/cli-xml/acl.xml new file mode 100644 index 0000000000..b78c72f459 --- /dev/null +++ b/src/CLI/clitree/cli-xml/acl.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + if test "${access-list-name}" = ""; then + python $SONIC_CLI_ROOT/sonic-cli-acl.py get_openconfig_acl_acl_acl_sets show_access_list.j2 + else + python $SONIC_CLI_ROOT/sonic-cli-acl.py get_openconfig_acl_acl_acl_sets_acl_set_acl_entries ${access-list-name} ACL_IPV4 show_access_list.j2 + fi + + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-acl.py get_openconfig_acl_acl_interfaces show_access_group.j2 + + + + + + + + + + + + + + + if test "${direction-switch}" = "in"; then + python $SONIC_CLI_ROOT/sonic-cli-acl.py patch_list_openconfig_acl_acl_interfaces_interface ${access-list-name} ACL_IPV4 ${iface} ingress + else + python $SONIC_CLI_ROOT/sonic-cli-acl.py patch_list_openconfig_acl_acl_interfaces_interface ${access-list-name} ACL_IPV4 ${iface} egress + fi + + + + + + + + + + if test "${direction-switch}" = "in"; then + python $SONIC_CLI_ROOT/sonic-cli-acl.py delete_openconfig_acl_acl_interfaces_interface_ingress_acl_sets_ingress_acl_set ${iface} ${access-list-name} ACL_IPV4 + else + python $SONIC_CLI_ROOT/sonic-cli-acl.py delete_openconfig_acl_acl_interfaces_interface_egress_acl_sets_egress_acl_set ${iface} ${access-list-name} ACL_IPV4 + fi + + + + + + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-acl.py patch_openconfig_acl_acl_acl_sets_acl_set ${access-list-name} ACL_IPV4 + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-acl.py delete_openconfig_acl_acl_acl_sets_acl_set ${access-list-name} ACL_IPV4 + + + + + + + + + + + + + + + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-acl.py delete_openconfig_acl_acl_acl_sets_acl_set_acl_entries_acl_entry ${name} ACL_IPV4 ${seq-no} + + + + + + + + + + + + + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-acl.py patch_list_openconfig_acl_acl_acl_sets_acl_set_acl_entries_acl_entry ${name} ACL_IPV4 ${__params} + + + + + diff --git a/src/CLI/clitree/cli-xml/configure_mode.xml b/src/CLI/clitree/cli-xml/configure_mode.xml new file mode 100644 index 0000000000..72c70bac16 --- /dev/null +++ b/src/CLI/clitree/cli-xml/configure_mode.xml @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/src/CLI/clitree/cli-xml/enable_mode.xml b/src/CLI/clitree/cli-xml/enable_mode.xml new file mode 100644 index 0000000000..3ba8c146ba --- /dev/null +++ b/src/CLI/clitree/cli-xml/enable_mode.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + ${cmd} + + + + diff --git a/src/CLI/clitree/cli-xml/include/pipe.xml b/src/CLI/clitree/cli-xml/include/pipe.xml new file mode 100644 index 0000000000..758ae50897 --- /dev/null +++ b/src/CLI/clitree/cli-xml/include/pipe.xml @@ -0,0 +1,501 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/CLI/clitree/cli-xml/include/pipe_without_display_xml.xml b/src/CLI/clitree/cli-xml/include/pipe_without_display_xml.xml new file mode 100644 index 0000000000..50f99bf013 --- /dev/null +++ b/src/CLI/clitree/cli-xml/include/pipe_without_display_xml.xml @@ -0,0 +1,482 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/CLI/clitree/cli-xml/interface.xml b/src/CLI/clitree/cli-xml/interface.xml new file mode 100644 index 0000000000..3341170d76 --- /dev/null +++ b/src/CLI/clitree/cli-xml/interface.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + if test "${if-subcommands}" = "status"; then + python $SONIC_CLI_ROOT/sonic-cli-if.py get_openconfig_interfaces_interfaces show_interface_status.j2 ${__full_line} + elif test "${if-subcommands}" = "counters"; then + python $SONIC_CLI_ROOT/sonic-cli-if.py get_openconfig_interfaces_interfaces show_interface_counters.j2 ${__full_line} + else + if test "${phy-if-id}" = ""; then + python $SONIC_CLI_ROOT/sonic-cli-if.py get_openconfig_interfaces_interfaces show_interface.j2 ${__full_line} + else + python $SONIC_CLI_ROOT/sonic-cli-if.py get_openconfig_interfaces_interfaces_interface Ethernet${phy-if-id} show_interface_id.j2 ${__full_line} + fi + fi + + + + + + + + + + + + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-if.py patch_openconfig_interfaces_interfaces_interface_config_enabled ${iface} False + + + python $SONIC_CLI_ROOT/sonic-cli-if.py patch_openconfig_interfaces_interfaces_interface_config_enabled ${iface} True + + + + python $SONIC_CLI_ROOT/sonic-cli-if.py patch_openconfig_interfaces_interfaces_interface_config_description ${iface} ${desc} + + + python $SONIC_CLI_ROOT/sonic-cli-if.py patch_openconfig_interfaces_interfaces_interface_config_description ${iface} "" + + + + python $SONIC_CLI_ROOT/sonic-cli-if.py patch_openconfig_interfaces_interfaces_interface_config_mtu ${iface} ${mtu} + + + python $SONIC_CLI_ROOT/sonic-cli-if.py patch_openconfig_interfaces_interfaces_interface_config_mtu ${iface} 9100 + + + + diff --git a/src/CLI/clitree/cli-xml/ip.xml b/src/CLI/clitree/cli-xml/ip.xml new file mode 100644 index 0000000000..1d974a54b2 --- /dev/null +++ b/src/CLI/clitree/cli-xml/ip.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + diff --git a/src/CLI/clitree/cli-xml/ipv4.xml b/src/CLI/clitree/cli-xml/ipv4.xml new file mode 100644 index 0000000000..80ba50ac79 --- /dev/null +++ b/src/CLI/clitree/cli-xml/ipv4.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-if.py patch_openconfig_if_ip_interfaces_interface_subinterfaces_subinterface_ipv4_addresses_address_config ${iface} ${addr} + + + + + + python $SONIC_CLI_ROOT/sonic-cli-if.py delete_openconfig_if_ip_interfaces_interface_subinterfaces_subinterface_ipv4_addresses_address_config_prefix_length ${iface} ${addr} + + + + + diff --git a/src/CLI/clitree/cli-xml/ipv6.xml b/src/CLI/clitree/cli-xml/ipv6.xml new file mode 100644 index 0000000000..bad92d0215 --- /dev/null +++ b/src/CLI/clitree/cli-xml/ipv6.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-if.py patch_openconfig_if_ip_interfaces_interface_subinterfaces_subinterface_ipv6_addresses_address_config ${iface} ${addr} + + + + + python $SONIC_CLI_ROOT/sonic-cli-if.py delete_openconfig_if_ip_interfaces_interface_subinterfaces_subinterface_ipv6_addresses_address_config_prefix_length ${iface} ${addr} + + + + diff --git a/src/CLI/clitree/cli-xml/lldp.xml b/src/CLI/clitree/cli-xml/lldp.xml new file mode 100644 index 0000000000..d03352e24b --- /dev/null +++ b/src/CLI/clitree/cli-xml/lldp.xml @@ -0,0 +1,54 @@ + + + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-lldp.py get_openconfig_lldp_lldp_interfaces lldp_show.j2 ${__full_line} + + + python $SONIC_CLI_ROOT/sonic-cli-lldp.py get_openconfig_lldp_lldp_interfaces lldp_show.j2 ${__full_line} + + + + + + if test "${ifname}" = ""; then + python $SONIC_CLI_ROOT/sonic-cli-lldp.py get_openconfig_lldp_lldp_interfaces lldp_neighbor_show.j2 ${__full_line} + else + python $SONIC_CLI_ROOT/sonic-cli-lldp.py get_openconfig_lldp_lldp_interfaces_interface lldp_neighbor_show.j2 ${ifname} ${__full_line} + fi + + + + + + + diff --git a/src/CLI/clitree/cli-xml/platform.xml b/src/CLI/clitree/cli-xml/platform.xml new file mode 100644 index 0000000000..1ab3f0400a --- /dev/null +++ b/src/CLI/clitree/cli-xml/platform.xml @@ -0,0 +1,50 @@ + + + + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-pfm.py get_openconfig_platform_components platform_show.j2 ${__full_line} + + + + + + + python $SONIC_CLI_ROOT/sonic-cli-pfm.py get_openconfig_platform_components platform_show.j2 ${__full_line} + + + + + + + diff --git a/src/CLI/clitree/cli-xml/sonic_types.xml b/src/CLI/clitree/cli-xml/sonic_types.xml new file mode 100644 index 0000000000..6b33089605 --- /dev/null +++ b/src/CLI/clitree/cli-xml/sonic_types.xml @@ -0,0 +1,465 @@ + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/CLI/clitree/cli-xml/startup.xml b/src/CLI/clitree/cli-xml/startup.xml new file mode 100644 index 0000000000..825fceb4a4 --- /dev/null +++ b/src/CLI/clitree/cli-xml/startup.xml @@ -0,0 +1,27 @@ + + + + + + + diff --git a/src/CLI/clitree/cli-xml/system.xml b/src/CLI/clitree/cli-xml/system.xml new file mode 100644 index 0000000000..ba3b9277f9 --- /dev/null +++ b/src/CLI/clitree/cli-xml/system.xml @@ -0,0 +1,54 @@ + + + + + + + + +]> + + + + python $SONIC_CLI_ROOT/sonic-cli-sys.py get_openconfig_system_system_state system_show.j2 ${__full_line} + + + + python $SONIC_CLI_ROOT/sonic-cli-sys.py get_openconfig_system_system_memory system_show.j2 ${__full_line} + + + + python $SONIC_CLI_ROOT/sonic-cli-sys.py get_openconfig_system_system_cpus system_cpu_show.j2 ${__full_line} + + + + python $SONIC_CLI_ROOT/sonic-cli-sys.py get_openconfig_system_system_processes system_processes_show.j2 ${__full_line} + + + + + + python $SONIC_CLI_ROOT/sonic-cli-sys.py get_openconfig_system_system_processes system_show.j2 ${pid-no} ${__full_line} + + + + diff --git a/src/CLI/clitree/macro/acl_macro.xml b/src/CLI/clitree/macro/acl_macro.xml new file mode 100644 index 0000000000..329717c992 --- /dev/null +++ b/src/CLI/clitree/macro/acl_macro.xml @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/CLI/clitree/scripts/klish_ins_def_cmd.py b/src/CLI/clitree/scripts/klish_ins_def_cmd.py new file mode 100755 index 0000000000..01032c07b6 --- /dev/null +++ b/src/CLI/clitree/scripts/klish_ins_def_cmd.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + + +""" The script klish_Ins_Def_Cmd.py is used to append the "exit" and + "end"commands to the views of the klish XML models except for the views + in list SKIP_VIEW_LIST + + The script accepts input directory and output directory as parameters. + It reads each XML file in the input directory and iterates through + each VIEW tag in the XML.If "exit" and "end" command are not already + appended for the view,the script will append them for the view. + + On successful iteration through all the views, the resultant XML tree is + written to a file in the output directory with same name as in source + directory. + + Script maintains a list VIEW_LIST to hold the list of views for which the + exit and end commands are updated already. + + Note that a view could be present in multiple files.Appending in one of + the files for a view is enough for the command to appear for that mode. + + A special list SKIP_VIEW_LIST is being maintained which holds the + list of views for which we don't want the exit and end command to be + appended (Eg enable-view") + + The SKIP_VIEW_LIST of the script should be updated with any new view being + created for which we don't want exit and end command + + Usage: klish_ins_def_cmd.py inDir [outDir] [--debug]""" + +import sys +import os +from lxml import etree + +EXIT_CMD = """ + + """ + +COMMENT_NS = """""" + +INHERIT_ENABLE_MODE_CMD = """""" + +""" Bring all enable mode commands to config + modes directly (Commands hidden to the user) + so that all enable mode commands can be + executed from config mode itself.""" + +INHERIT_ENABLE_MODE_CMD_WITHOUT_PREFIX = """""" + + +END_CMD = """""" + +VIEW_TAG_STR = """{http://www.dellemc.com/sonic/XMLSchema}VIEW""" +ENABLE_VIEW_STR = """enable-view""" +SKIP_VIEW_LIST = ["enable-view", "hidden-view", "ping-view"] +#DBG_FLAG = False +DBG_FLAG = True + + + +def update_view_tag(root, viewlist, filename, out_dirpath): + + """ The function iterates through the VIEW tags in the + file,and appends exit and end commands to the view + if not added already""" + + out_file = out_dirpath+'/'+filename + file_modified = False + + for element_inst in root.iter(VIEW_TAG_STR): + if DBG_FLAG == True: + print "Processed view name %s" % str(element_inst.keys()) + if (element_inst.get('prompt') != None) and (element_inst.get('name') not in SKIP_VIEW_LIST): + view_name = element_inst.get('name') + + if view_name not in viewlist: + exit_element = etree.XML(EXIT_CMD) + end_element = etree.XML(END_CMD) + inherit_enable_element = etree.XML(INHERIT_ENABLE_MODE_CMD) + inherit_enable_element_without_prefix = etree.XML(INHERIT_ENABLE_MODE_CMD_WITHOUT_PREFIX) + comment_element = etree.XML(COMMENT_NS) + + if DBG_FLAG == True: + print "Appending to view %s ..." %view_name + element_inst.insert(0,end_element) + element_inst.insert(0,exit_element) + element_inst.insert(0,inherit_enable_element) + element_inst.insert(0,inherit_enable_element_without_prefix) + element_inst.insert(0,comment_element) + + file_modified = True + viewlist.append(view_name) + + if DBG_FLAG == True: + print etree.tostring(element_inst, pretty_print=True) + print "VIEW_LIST:" + # print VIEW_LIST + + if file_modified == True: + if DBG_FLAG == True: + print "Writing File %s ..." %out_file + root.write(out_file, xml_declaration=True, encoding=root.docinfo.encoding, pretty_print=True) + else: + + if DBG_FLAG == True: + print "Skipping File %s ..." %filename + return viewlist + +def ins_def_cmd (in_dirpath, out_dirpath, debug): + IN_DIR_PATH = in_dirpath + VIEW_LIST = [] + DBG_FLAG = debug + + parser = etree.XMLParser(remove_blank_text=True, resolve_entities=False) + + for dir_name, subdir_list, file_list in os.walk(IN_DIR_PATH): + for fname in file_list: + if fname.endswith(".xml"): + if DBG_FLAG == True: + print '\tInput File:%s' % fname + tree = etree.parse(dir_name+'/'+fname, parser) + VIEW_LIST = update_view_tag(tree, VIEW_LIST, fname, out_dirpath) + +if __name__ == "__main__": + + debug = False + if len(sys.argv) < 2: + print ("Error: Missing Parameter " + os.linesep + + "Usage: klish_ins_def_cmd.py inDir [outDir] [--debug]") + sys.exit(0) + + if sys.argv[1] == "--help": + print "Usage: klish_ins_def_cmd.py inDir [outDir] [--debug]" + sys.exit(0) + + if len(sys.argv) < 3: + out_dirpath = sys.argv[1] + elif sys.argv[2] == "--debug": + out_dirpath = sys.argv[1] + else: + out_dirpath = sys.argv[2] + + if len(sys.argv) < 3: + debug = False + elif sys.argv[2] == "--debug": + debug = True + + if (len(sys.argv) == 4) and (sys.argv[3] == "--debug"): + debug = True + + debug = True + print sys.argv[1], out_dirpath, 1 + ins_def_cmd (sys.argv[1], out_dirpath, debug) + + diff --git a/src/CLI/clitree/scripts/klish_insert_pipe.py b/src/CLI/clitree/scripts/klish_insert_pipe.py new file mode 100755 index 0000000000..27c074cad3 --- /dev/null +++ b/src/CLI/clitree/scripts/klish_insert_pipe.py @@ -0,0 +1,197 @@ +#!/usr/bin/python +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + + +''' This script extends every show and get COMMAND with pipe option + ----------------------------------------------------------------''' + +import sys +import os +import re +from lxml import etree +import xml.etree.ElementTree as ET + +DBG_FLAG = False +PIPE_XML = "include/pipe.xml" +PIPE_WITHOUT_DISPLAY_XML = "include/pipe_without_display_xml.xml" +DEFAULT_NS_HREF = "http://www.dellemc.com/sonic/XMLSchema" +XSI_NS_HREF = "http://www.dellemc.com/sonic/XMLSchema-instance" +XI_NS_HREF = "http://www.w3.org/2001/XInclude" +COMMAND_XPATH_EXPR = ".//{"+DEFAULT_NS_HREF+"}VIEW/{"+DEFAULT_NS_HREF+"}COMMAND" +HIDDEN_CMD_XPATH_EXPR = ".//{"+DEFAULT_NS_HREF+"}VIEW[@name='hidden-view']/{"+DEFAULT_NS_HREF+"}COMMAND" +ACTION_XPATH_EXPR = "{"+DEFAULT_NS_HREF+"}ACTION" + +# +# *** NOTE : List of action plugins for which display-xml need not be appended *** +# +actionlst = ['clish_history', 'clish_file_print', 'clish_show_alias_plugin', \ + 'clish_logger_on_off', 'clish_show_batch_plugin'] + +''' +@brief Convert the escaped characters back to their original form +@param[in] Input Text +@return Output Text +''' +def unescape(s): + s = re.sub("<", "<", s) + s = re.sub(">", ">", s) + s = re.sub("&", "&", s) + return s + + +''' +@brief Align and Save tempfile to outputfile +@param[in] Temporary file name +@param[in] Output file name +''' +def align_and_save(temp_file_name, output_file_name): + try: + parser = etree.XMLParser(remove_blank_text=True, resolve_entities=False) + root = etree.parse(temp_file_name, parser) + text = etree.tostring(root, pretty_print=True, xml_declaration=True, encoding=root.docinfo.encoding) + text = unescape(text) + root.write(output_file_name, pretty_print=True, xml_declaration=True, encoding=root.docinfo.encoding) + except: + error = parser.error_log[0] + print "Error parsing ", os.path.basename(outputfile.name), error.message + print "Error writing ", out_file_name, sys.exc_info()[0] + sys.exit(102) + + +''' +@brief Test whether pipe can be added to given command and insert it +@param[in] COMMAND tag found in xml +@return COMMAND tag with/without pipe sub-element added +''' +def addpipe(command): + splitstr = command.get('name').split() + action = command.find(ACTION_XPATH_EXPR).get('builtin') + if (splitstr[0] == 'show' or splitstr[0] == 'get'): + if action in actionlst: + etree.SubElement(command, "{"+XI_NS_HREF+"}include", href = PIPE_WITHOUT_DISPLAY_XML) + else: + etree.SubElement(command, "{"+XI_NS_HREF+"}include", href = PIPE_XML) + + if DBG_FLAG == True: + print "Adding Pipe for cmd: ", splitstr + return command + + +''' +@brief Register Namespaces so that XPATH expression matches +''' +def registerns(): + ET.register_namespace("", DEFAULT_NS_HREF) + ET.register_namespace("xsi", XSI_NS_HREF) + ET.register_namespace("xi", XI_NS_HREF) + + +''' +@brief Convert the escaped characters back to their original form +@param[in] Input filename +@param[out] Temporary file +''' +def process_input_file(input_file_name, tempfile): + try: + if True: + registerns() + parser = etree.XMLParser(remove_blank_text=True, resolve_entities=False) + tree = etree.parse(input_file_name,parser) + root = tree.getroot() + #root.set("xmlns:" + "xi", XI_NS_HREF) + if DBG_FLAG == True: + print "Root Tag: ",root.tag + for command in root.findall(COMMAND_XPATH_EXPR): + if len(command) != 0: + command = addpipe(command) + for command in root.findall(HIDDEN_CMD_XPATH_EXPR): + if len(command) != 0: + command = addpipe(command) + + tree.write(tempfile, xml_declaration=True, encoding=tree.docinfo.encoding, pretty_print=True) + except IOError as e: + print "Cannot open file: ", e.filename, ":", e.strerror + sys.exit(100) + except : + print "process_input_file:Unknown error: ", sys.exc_info()[0] + sys.exit(100) + +def insert_pipe (dirpath, debug): + + DBG_FLAG = debug + + tmp_dirpath = dirpath + '/tmp' + dirpath = dirpath + "/" + tmp_dirpath = tmp_dirpath + "/" + try: + os.mkdir(tmp_dirpath) + except OSError: + print 'The directory', tmp_dirpath, 'already exists. Using it.' + except: + error = parser.error_log[0] + print "Unknown error", error.message + sys.exit (98) + temp_file_name = tmp_dirpath + "out.xml" + + ''' The following loops go through each directory in the given + input directory and reads each *.xml file in the directory + for inserting the pipe ''' + for fname in os.listdir(dirpath): + fname = dirpath + fname + if not os.path.isfile (fname): + if DBG_FLAG == True: + print 'Skipping', fname, 'since it is not a file' + continue + if DBG_FLAG == True: + print 'Parsing ', fname + if fname.endswith(".xml", re.I): + try: + temp_file = open(temp_file_name, "w") + except IOError as e: + print e.filename, ":", e.strerror + sys.exit(99) + if DBG_FLAG == True: + print fname + process_input_file(fname, temp_file) + temp_file.close() + align_and_save(temp_file_name, fname) + + if os.path.exists(temp_file_name): + os.remove(temp_file_name) + if os.path.exists(tmp_dirpath): + os.rmdir(tmp_dirpath) + +''' +@brief Main Routine to insert pipe for every show and get COMMAND in all + xml files, present in input-dir and save them in output-dir +''' +if __name__ == "__main__": + + if len(sys.argv) == 1 or sys.argv[1] == "--help": + print "Usage:", sys.argv[0], "working-dir [--debug]" + sys.exit(0) + + if len(sys.argv) == 3 and sys.argv[2] == "--debug": + debug = True + else: + debug = False + + insert_pipe (sys.argv[1], debug) + sys.exit(0) + diff --git a/src/CLI/clitree/scripts/klish_platform_features_process.sh b/src/CLI/clitree/scripts/klish_platform_features_process.sh new file mode 100755 index 0000000000..976d55e8e9 --- /dev/null +++ b/src/CLI/clitree/scripts/klish_platform_features_process.sh @@ -0,0 +1,122 @@ +#!/bin/bash +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + +#set -x +# Validate all platform xml files +# For all platform_*.xml, run xmllint feature_master.xsd $i.xml +# Create entities_platform.xml and features_platform.xml +# For all platforms_*/xml, run xsltproc $i.xml with entities.xml and features.xsl +# Copy a clish_prepare.py to sysroot +# Run clish_prepare.py with first platform and update entities +# +# Run xsltproc on feature_master.xsd to create an xml file of all features - fullfeatures.xml +# +# During clish start: +# a. Open fullfeatures.xml to populate a list of features vs enabled-flag mappping. +# b. While preparing the pfeature list, consult this list instead of consulting the list of #defines +# c. Report errors on processing the fullfeatures.xml file + +PLATFORM_CONFIGS=platform_dummy.xml +BUILD_DIR=$2/tmp +PARSER_XML_PATH=$2 +ENTITIES_TEMPLATE=$1/mgmt_clish_entities.xsl +FEATURES_MASTER=$1/mgmt_clish_feature_master.xsd + +function insert_in() +{ + # Insert in file - $1 with $value set in calling routine + filename=$1 + outfile=$filename.bak + grep -q DOCTYPE $filename + # If there are ENTITY definitions, add it as part of it + # Else add a new DOCTYPE + if [ $? -eq 0 ]; then + option=1 + matchpattern=".*DOCTYPE.*" + printvalue="${value}" + else + option=2 + matchpattern="" + fi + #echo Insert_in $filename. Option $option + while read -r line; do + echo ${line} >> $outfile + if [[ "${line}" =~ ${matchpattern} ]]; then + #echo Match found for ${line} + echo "${printvalue}" >> $outfile + #set +x + fi + done < $filename + #set -x + touch $outfile $filename + mv -f $outfile $filename +} + +# Do a simple text based insertion of the feature-val entities +# TBD - Replace them with an xml parser based insertion in future, if required +function insert_entities() +{ + value=`cat $1` + parser=$2 + echo insert_entities: $1 $parser + list=`echo ${parser}/*.xml` + for i in ${list}; do + echo Processing $i + insert_in $i + xmllint $i >& /dev/null + if [ $? -ne 0 ]; then + echo ENTITY insertion in $i failed + exit 1 + fi + done + #echo $i + #insert_in $i +} + + +echo Sanity check of platform config files with feature master ... + xmllint --schema $FEATURES_MASTER $PLATFORM_CONFIGS >& /dev/null + if [ $? -ne 0 ]; then + echo Failed to validate $PLATFORM_CONFIGS + exit 1 + fi + +mkdir -p ${BUILD_DIR} +echo Done. Generating platform specific files ... + base=${PLATFORM_CONFIGS%*.xml} # Strip of the .xml suffix + platform=${base#platform_*} # Get the platform name + xsltproc $ENTITIES_TEMPLATE $PLATFORM_CONFIGS > $BUILD_DIR/${platform}_entities.ent #2>/dev/null + # echo ${platform}_entities.ent ready + if [ $? -ne 0 ]; then + echo Failed to apply entities xsl template for $PLATFORM_CONFIGS + exit 1 + fi +echo Done + +# Use the last platform's file for compilation purpose +pwd=${PWD} +cd ${PARSER_XML_PATH} +echo Inserting platform features +insert_entities ${BUILD_DIR}/${platform}_entities.ent ${PARSER_XML_PATH}/command-tree +cp ${BUILD_DIR}/*.xml ${PARSER_XML_PATH}/command-tree + +rm -r ${BUILD_DIR} +exit 0 diff --git a/src/CLI/clitree/scripts/klish_preproc_cmdtree.py b/src/CLI/clitree/scripts/klish_preproc_cmdtree.py new file mode 100755 index 0000000000..140c859f07 --- /dev/null +++ b/src/CLI/clitree/scripts/klish_preproc_cmdtree.py @@ -0,0 +1,58 @@ +#!/usr/bin/python2.7 +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + +''' CLI parser tree preprocessing script before the parser xml-s are copied + to sysroot. These are the steps performed: + a. Macro replacement + b. Platform specific feature xml and feature-val xml creation + c. Insert the |' for post processing support of show commands + d. Insert the default default end and exit command for all config modes + + The Script Usage: + python klish_preproc_cmdtree.py buildpath macros-dir depth +''' +import sys +import os +import re +from lxml import etree +import klish_replace_macro, klish_insert_pipe, klish_ins_def_cmd + +if __name__ == "__main__": + + if len(sys.argv) == 1 or sys.argv[1] == "--help": + print "Usage:", sys.argv[0], "working-dir macrodir nested-macro-levels [--debug]" + sys.exit(0) + + dirpath = sys.argv[1] + macro_dir_path = sys.argv[2] + nested_levels = sys.argv[3] + + if len(sys.argv) == 5 and sys.argv[4] == "--debug": + debug = True + else: + debug = False + + print "Replacing the macros ..." + klish_replace_macro.replace_macros (dirpath, macro_dir_path, nested_levels, debug) + print "Inserting the pipe parameters ..." + klish_insert_pipe.insert_pipe (dirpath, debug) + print "Insert the end, exit commands ..." + klish_ins_def_cmd.ins_def_cmd (dirpath, dirpath, debug) + + diff --git a/src/CLI/clitree/scripts/klish_replace_macro.py b/src/CLI/clitree/scripts/klish_replace_macro.py new file mode 100755 index 0000000000..436b1dea82 --- /dev/null +++ b/src/CLI/clitree/scripts/klish_replace_macro.py @@ -0,0 +1,408 @@ +#!/usr/bin/python2.7 +########################################################################### +# +# Copyright 2019 Dell, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### + +''' This script does macro replacement on the xml + files which are used by klish to defind CLI + strucuture. + + The script assumes that xml files using macro's are + kept in some input directory, macro definition files + are kept under another directory and expects a + directory where it keeps all the processed files. + + The script expect that macro definition are kept in a + file with *_macro.xml. + + The Script Usage: + python klish_replace_macro.py indir macrodir outdir [--debug] + + The format requirement for using and defining macro's + are given as follows: + + MACRO Definition file: + example_macro.xml + + + + + + + + + + + + + + + + + + + + + Macro Usage File Example: + + abc.xml + + + + + + + + + + + + ----------------------------------------------------------------''' +import sys +import os +import re +from lxml import etree + +MACRO_START = '' +MACRODEF_START = '' +DBG_FLAG = False + +def align_and_save(temp_file_name, out_file_name, replace_entities): + print "Writing ", out_file_name + try: + parser = etree.XMLParser(remove_blank_text=True, resolve_entities=replace_entities) + root = etree.parse(temp_file_name, parser) + root.write(out_file_name,xml_declaration=True, encoding=root.docinfo.encoding, pretty_print=True) + #root.write(out_file_name,pretty_print=True) + #outputfile.write(etree.tostring(root,xml_declaration=True, encoding=root.docinfo.encoding, pretty_print=True)) + #outputfile.write(etree.tostring(root, pretty_print=True)) + #outputfile.close() + except: + #error = parser.error_log[0] + #print "Error parsing ", os.path.basename(outputfile.name), error.message + print "Error writing ", out_file_name, sys.exc_info() + sys.exit(102) + +def process_spaces(line): + line = re.sub(" =", "=", line) + line = re.sub(" = ", "=", line) + line = re.sub("= ", "=", line) + line = re.sub("< ", "<", line) + line = re.sub(" >", ">", line) + line = re.sub(" />", "/>", line) + line = re.sub(' "', '"', line) + line = re.sub("!=", "!= ", line) + line = re.sub("==", " == ", line) + return line + +def endoflinehandling(line): + if re.search("/>", line, 0) != None: + retstr = re.sub("/>", "", line) + elif re.search(">", line, 0) != None: + retstr = re.sub(">", "", line) + return retstr.strip() +''' +## +# @brief Replace the macro references with the actual macro definition for the +# requested parser xml file +# +# @param macname Name of the macro to be replaced +# @param argcnt Number of arguments in the macro +# @param argval List of argument values in the macro +# @param fd Descriptor for the input xml file where replacement is requested. +# The cursor of fd already points to the place where replacement should +# be done +# @param macro_data List of all macro definitions +# +# @return +''' +def expand_macro(macname, argcnt, argval, fd, macro_data): + matchfound = 0 + try: + macro_start = MACRODEF_START + macname + '>' + gothit = 0 + for macro_line in macro_data: + macro_line = process_spaces(macro_line) + if re.search(macro_start, macro_line, 0) != None: + matchfound = 1 + gothit = 1 + if DBG_FLAG == True: + print "Macro Line Match found", macro_start + continue + else: + if DBG_FLAG == True: + print "macro ***not*** found part" + if macro_line.find(MACRODEF_END) != -1: + matchfound = 0 + continue + if matchfound == 1: + if argcnt == 0: + fd.write(macro_line) + fd.write(" ") + else: + i = 0 + for i in range(argcnt): + param = "arg" + str(i+1) + if macro_line.find(param) != -1: + value = str(argval[i]) + macro_line = re.sub(param, value, macro_line) + + if DBG_FLAG == True: + print "param : " + param + print "argval" + str(i) + ": " + argval[i] + print "macro_line : " + macro_line + fd.write(macro_line) + fd.write(" ") + if gothit == 0: + # A macro match is not found. Possibly a typo in macro name + # Flag fatal error + print "Macro", macname, "not defined in list of macros" + sys.exit(102) + + except: + error = parser.error_log[0] + print "Error expand_macro ", os.path.basename(fd.name), error.message + sys.exit(101) + +''' +## +# @brief Read the requested input file, identify the macro references along +# with the arguments and call expand_macro() for macro replacement +# +# @param filename Input file +# @param fd descriptor of a temporary file +# @param macro_data Array of all the macro definition lines +# +# @return Nothing +''' +def process_input_file(filename, fd, macro_data): + + try: + with open(filename, "r") as input_file: + multi_line = False + macroname = [] + data = input_file.readlines() + for line in data: + nargs = 0 + line = ' '.join(line.split()) + if DBG_FLAG == True: + print line, multi_line + if re.search(MACRO_START, line, 0) != None or multi_line == True: + if DBG_FLAG == True: + print "MACRO is found", line + line = process_spaces(line) + line = line.replace('\,', '#') + if DBG_FLAG == True: + print line + mname = re.sub(MACRO_START, "", line) + if line.find("arg") != -1: + nargs = line.count(',') + 1 + multi_line = False + elif line.find('>') == -1: + multi_line = True + macroname = mname.strip() + if DBG_FLAG == True: + print macroname, multi_line + continue + nargs = int(nargs) + if DBG_FLAG == True: + print nargs + if nargs == 0: + macroname = endoflinehandling(mname) + if DBG_FLAG == True: + print macroname + expand_macro(macroname, 0, None, fd, macro_data) + else: + args = [] + repmname = 'arg="' + if multi_line == False: + if re.search(' ', mname, 0) != None: + macroname = mname[0:mname.find(' ')] + repmname = macroname + ' ' + 'arg="' + if DBG_FLAG == True: + print macroname, nargs + mname = re.sub(repmname, "", mname) + for i in range(nargs): + e = mname.find(',') + if e != -1: + argval = mname[0:e].strip() + mname = mname[e+1:] + else: + e = mname.find('"') + argval = mname[0:e].strip() + argval = argval.replace('#', ',') + args.append(argval) + if DBG_FLAG == True: + print "about to expand_macro", macroname + expand_macro(macroname, nargs, args, fd, macro_data) + elif re.search(MACRO_END, line, 0) != None: + continue + else: + fd.write(line) + fd.write(" ") + fd.close() + input_file.close() + except IOError as e: + print "Cannot open file: ", filename, e.strerror + sys.exit(100) + except : + print "Unknown error: ", sys.exc_info()[0], filename, input_file + sys.exit(100) + +def load_all_macros (macro_dir_path): + ''' Loop through each directory in the given macro directory and + reads each *macro.xml file in the directory into a buffer and return it''' + macro_data = [] + for dirName, subdirList, fileList in os.walk(macro_dir_path): + for macro_file_name in fileList: + macro_file_name = macro_dir_path + "/" + macro_file_name + with open(macro_file_name, "r") as macrofile: + data = macrofile.readlines() + + for line in data: + line = ' '.join(line.split()) + macro_data.append(line) + macrofile.close() + return macro_data + +def process_dir (dirpath, macro_data, replace_entities): + ''' Loop through each file in the given input directory and replace + all macro references with the actual definitions along with + argument substitutions''' + tmp_dirpath = dirpath + '/tmp/' + temp_file_name = tmp_dirpath + "out.xml" + + try: + os.mkdir(tmp_dirpath) + except OSError: + print 'The directory', tmp_dirpath, 'already exists. Using it.' + except: + print "Unknown error" + sys.exit (98) + + if DBG_FLAG == True: + print "process_dir ", dirpath, tmp_dirpath, temp_file_name + + for fname in os.listdir(dirpath): + fname = dirpath + fname + if not os.path.isfile (fname): + if DBG_FLAG == True: + print 'Skipping', fname, 'since it is not a file' + continue + if DBG_FLAG == True: + print 'Parsing ', fname + if fname.endswith(".xml", re.I): + try: + temp_file = open(temp_file_name, "w") + except IOError as e: + print e.filename, ":", e.strerror + sys.exit(99) + if DBG_FLAG == True: + print fname + process_input_file(fname, temp_file, macro_data) + align_and_save(temp_file_name, fname, replace_entities) + temp_file.close() + + if os.path.exists(temp_file_name): + os.remove(temp_file_name) + if os.path.exists(tmp_dirpath): + os.rmdir(tmp_dirpath) + +''' +## +# @brief Resolve all nested MACRO references in the macro definitions +# +# @param macro_dir_path Directory where the macro xml files are defined +# @param nested_levels Maximum nested level of macro references expected. +# Giving a bigger number than the actual nested level is harmless. It +# would just add an additional loop +# +# @return array of all the lines containing the macro defintions +''' +def fix_macros (macro_dir_path, nested_levels): + for i in range(nested_levels): + macro_data = load_all_macros (macro_dir_path) + if DBG_FLAG == True: + print "All macros loaded from", macro_dir_path + process_dir (macro_dir_path, macro_data, True) + + return macro_data + +def replace_macros (dirpath, macro_dir_path, nested_levels, debug): + dirpath = dirpath + "/" + macro_dir_path = macro_dir_path + "/" + DBG_FLAG = debug + + print "Resolving nested macro references in", macro_dir_path + macro_data = fix_macros (macro_dir_path, int(nested_levels)) + + if DBG_FLAG == True: + print macro_data + + print "Processing directory:", dirpath + process_dir (dirpath, macro_data, False) + print "Done" + +if __name__ == "__main__": + + if len(sys.argv) == 1 or sys.argv[1] == "--help": + print "Usage:", sys.argv[0], "working-dir macrodir nested-macro-levels [--debug]" + sys.exit(0) + + dirpath = sys.argv[1] + macro_dir_path = sys.argv[2] + nested_levels = sys.argv[3] + + if len(sys.argv) == 5 and sys.argv[4] == "--debug": + debug = True + else: + debug = False + + replace_macros (dirpath, macro_dir_path, nested_levels, debug) diff --git a/src/CLI/clitree/scripts/platform_dummy.xml b/src/CLI/clitree/scripts/platform_dummy.xml new file mode 100644 index 0000000000..8cf798a09f --- /dev/null +++ b/src/CLI/clitree/scripts/platform_dummy.xml @@ -0,0 +1,40 @@ + + + + + + + NOT_SUPPORTED + + + START_PORT_ID + MAX_PORT_ID + START_SUB_PORT_ID + MAX_SUB_PORT_ID + MAX_MTU + + diff --git a/src/CLI/clitree/scripts/sonic-clish.xsd b/src/CLI/clitree/scripts/sonic-clish.xsd new file mode 100644 index 0000000000..bfae8de77f --- /dev/null +++ b/src/CLI/clitree/scripts/sonic-clish.xsd @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/CLI/klish/Makefile b/src/CLI/klish/Makefile new file mode 100644 index 0000000000..c71e96aeaa --- /dev/null +++ b/src/CLI/klish/Makefile @@ -0,0 +1,27 @@ +SHELL = /bin/bash +.ONESHELL: +.SHELLFLAGS += -e + +KLISH_VERSION = 2.1.4 +PYTHONVER=2.7 + +KLISH_SRC = $(SONIC_CLI_ROOT)/klish-$(KLISH_VERSION) + +SRC_REPLACEMENTS:=$(shell find patches -type f) +all : $(SRC_REPLACEMENTS) + tar xzvf klish-$(KLISH_VERSION).tgz -C $(SONIC_CLI_ROOT) + ./patches/scripts/patchmake.sh -p VER=${KLISH_VERSION} TSP=${SONIC_CLI_ROOT} DSP=${CURDIR}/patches TWP=${SONIC_CLI_ROOT} + + cd ${KLISH_SRC} && sh autogen.sh && ./configure --with-libxml2=/usr && make + + mkdir -p $(SONIC_CLI_ROOT)/target/.libs + cp $(CURDIR)/clish_start $(SONIC_CLI_ROOT)/target/. + + cp -r ${KLISH_SRC}/bin/.libs/clish ${SONIC_CLI_ROOT}/target/. + cp -r ${KLISH_SRC}/.libs/*.so* ${SONIC_CLI_ROOT}/target/.libs + cp -r ${KLISH_SRC}/.libs/*.a ${SONIC_CLI_ROOT}/target/.libs + @echo "complete klish build" + +.PHONY: clean +clean: + rm -rf ${KLISH_SRC}/klish-$(KLISH_VERSION) diff --git a/src/CLI/klish/clish_start b/src/CLI/klish/clish_start new file mode 100755 index 0000000000..ddf43a7676 --- /dev/null +++ b/src/CLI/klish/clish_start @@ -0,0 +1,11 @@ +#!/bin/bash + +export SONIC_MGMT_ROOT=/usr/sbin +export SONIC_CLI_ROOT=$SONIC_MGMT_ROOT/cli +export SYSTEM_NAME="${HOSTNAME%%.*}" +export PYTHONPATH=$SONIC_MGMT_ROOT:$SONIC_MGMT_ROOT/lib/swagger_client_py:$SONIC_CLI_ROOT:$SONIC_CLI_ROOT/scripts:$PYTHONPATH +export CLISH_PATH=$SONIC_CLI_ROOT/command-tree +export LD_LIBRARY_PATH=/usr/local/lib:$SONIC_CLI_ROOT/.libs:$LD_LIBRARY_PATH +export PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin:$SONIC_CLI_ROOT + +$SONIC_CLI_ROOT/clish "$@" diff --git a/src/CLI/klish/klish-2.1.4.tgz b/src/CLI/klish/klish-2.1.4.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e83e2f8188561959437081c6a52f49b879ccfd4d GIT binary patch literal 2479271 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∨q>i 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

Q9^`K*f9?&3~hh~Q^ynFs% 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

qQsZ{j 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

S5v& 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

?z&_)SQ|! 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


C}o`!-9~ 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

oPM1r*99nD|l80~<@=ftb&1|W?P%!J15g~!4 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�U7j>YV&nhJR){fKhmmx)I}3N{9w}5V{7KRa^=f0 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%0D~ zVSd28h}#qAm%K_4bXvBD<22ABJD>avO=kynO^kW_Ug0m-#QMFnO7|U&`ucDM_#@5D ziOpD|t6}iq9k9&FYiqY-Kb~*;*Ba5GaK7S971|MaL20or^!F8J$Sc+da(HP;^i=y?^?e9fp;v!)c9qgG)eAANAo z41)h$u>fm4j@uI=hn(@xjN!+2;KIE;LXKLt)ETG>%!Drq1 zwGCBkMZnp?{|l8?;|vTPH)Nz9G}4Mu<-S${v>st6$Lj>e;f$yRC=FC!C& znzlH{3E0We*#1H+l%vWHkH`e|XqI1(s*1tv6Q?YD?6n8;jCBGb95DwK zFGIFS$Um`Y^Jm_0py3a|BY(3S4v@AV5rjL)BQ#9ksUN90a&ahzh2sBR!);ifuYuG0 zsc-14ZknyL1;4bz)Qd$Z!AFXOVD(_X!>p2VO2s`RylG3ypXALod?nZzW!92DNT)D| z65Ff=rS1RIQSbw1x{)A?4MZv$ zT3W4XnRV-;t*1Sq$_L9LoaN9rTlFqVwgyymuI4 zeA!7+7XdqX5KlU+&E*Q?d>EWqv~t+dlGH>sbnRin)Eqw{$HunGL`Ax8iSlc~kRXyu zgB^KFnDAKY(Lb9RtFDsj00_7U&qtFjv>z%}UjXvH>VUr=}{% za}v4_#+PyIV!3OI_-G3XadRo?a;9t|2=QszmOS$sRwCoZ+!(T^&u2?uq%{Dkg_1@#=cGKk}22&#L%nF|?xlWyOb-u<6kD1x=q1;y2eP z5_hgZ#wNeiF#rAIDP!hu5b;$)w+qu+PM`cS4MXK66`VOL;*N(SFiIRuqudmSGWTqk zRs|S&!WJGb4{;%c%$ANV*b|I3EfGp}^k5KP;h|A}a#?id2PNk|R@M&~bj1YiU0)@B zf|1Hj14jRMA>uRMvq0hBu>^fdx5QqC7`{%erdpiSX;+oqw?tmQVhqr%JLyIVN20M@PXZ9;r_(bfVJq=aT(gt|akDn~&HdRM&@1ZzdE z6wB$j+VMeWlTxyLo4NaKrn>?D->+gE8D##kJfdQofvyeQE$MQ;*K!#J2{nsgRX9=I zk~eJLMxpIGp0g}^|tk}IBDPJ-~ZpOe!o2cSP~vz%oSI`wb{``Nk(D~xupL6w8I z`yqJU^|XYxefE8MvZVS)f-I<+$mum7D-Po(*}RPv1MjFiJKuqymP3KP_w0OUE8wII zKC?|6n<94=jx-9CBLL&+z}qa#8hrNN@1gC;9_%AeRp{t%wIT10&o7#fyBAkx=@tR{ zWVI}^LX72r8LGgObOu>Lzs8#a#l%lx*D14_Y;yDPcB;Hg+Xzh-Lj3iRHxMrT!VXLB zTKqiLdIuXa7#MQ>m{x6Kg*@g{`i3S_kVf?Y>b{NGqDlx-AK_jWa9!D{jA>E~P4uhk zAIYV-gQOX8OK<$71W~&1PbxI5EF+K+Na*NB!=F-%z{C9ok#0BR?1`)O?cq;M7DAln zNojbr1nXJRs6-ckcuxTnsR=Gr-TaDmp2+Y}S)j zCG8We=r^)%RERk|LaA2FP7m*~#$LF%y1DWFW5$4%{y82k0o66$`{r1P)(*fdw|6%W z%R>P1J`{yK1aBt(SKEgl%HxQ<2LMC5Q7UH?&CNcB4?;jT5;iq;)qh##F6GVve-q35 z^7c+?RmbH(pi$8z_o14N{=M#cpgoQl7zPlZ(M0%oR9C~)i1+-*72~KGZ~mC>(Zy2& zLQz?k0$0k>Kw1i5j*4pvk>HY#v5;f0!BXBeuJ7~B5c&$A((fD03QY}C&O@+%1e&Vi zlfM;|<$7W`j<|817r*X3<;p{xYm=ijPlbAh0LtAT>;b!@S}+BGNG686eJmhskA9@F7TM;a+Kh`E=~_I|caAf(BrQ$#XJd^pAw4XnN}$ z2JfEjyf$`I>OeoVQ2fgnUG$+UV&=y5<=%o9JaYD%QHe=`18oguYz{8~8OC36l@mL^ zk5A3Vt$wdy_Te*GRIgj->FFEWlIgcRZRv4Wu!0n%wi&;tNDC_~5^9Uq;2!cxmgw2N z7PM?ounn;`rx047{C9W2!^@wFa{b72ym`3-1L3cSdb|S<5&z%y{Kp39?mB3bnqaH7 z;K2W`=a~fl->>IMr7+VZAOS#O0YH!hY^#9CAOmp`cJMJm9P*zAT$|!(F0dV$!E>7X zFBIV~g)tDxs|C=xTz*k$d0Ku+^Y=E-?%(YmLaHP-b&{dex>b-!jmfpT;}Ztn~Ky+*WDH&j?s!BFDH;QB;Bf{`4zWZ8CM5rITi zxy&Ata0v~41aNp>Nts{BZ8=_pat=J0aPUePDImbY#!88G4dkS}-p&K4gmOdz?uR0B zaEcTh&=yyt#8AMQgp8%m17sJ=42MbTJWcmghLtJfFBU_vvqoEjFI4-@+Xw0-B}SEr?%(3{E^doZjwGLotEJ_KONT* zG%^WK!V5&GP#wf!3uVbH3nd@gCf!-34%EW1;A739 zpi$Gn7FqkSxjjk6#6_u|ub$Izas}Y}p70K#tK5X=jB&yeRKJe^z82C_nP3%-$NUGkR}YdLS9 z;>A$%ej~BgZW(e2J3llb1HCb`J?vrY;VC-Oy&y>~99dcW8Lbhh(_RzC05v8PKN9D) z(6y*t`)uk&sz-L!kIc=+MvklO?8>jiR^l*Uwv(_z*VhmW&f=QAZ<`zXP_`wL3)rqG zxJq6?IeyLH>FZjUG0ZIqBRY9{3@Gvp;qPfqoFNfe5c8De^ubk_^_04(nJV`Me|G&= zU-k(V-u$!M*-Wvd5#KRv!kSCVRHyQLfVL+v?YqCpHc+P47;zQK>8Ux21sYxjkIA#4 z)mvccC#Ly3+)m;V+Sx?Oc)n?_+H+@}D6dvA!dhhg5S=_xP?ZoWIEGlCzxf2$(KH*q zfsPRUvsm1xH6KwPLE%=;t|-)q0f@8VoPPjpRtvA^N5|5#vh(j zPtWHTMv1k80$J8((71;4|1+t4fa|Xbu787j+!Xi>$mAL&CEq0BAY&!Ra(pk~PzQvx z;PQ@qh+0gtV6iy9$sZj4@xJGof!Z>VHBC@%|M=vd{&J7GPFj|qV(h2U)6_5wE_7{- zFHYcq=oxXq+`?P?nMHw>k&b0!r|0hKsx-HlwtN&}_t(>hjB^`)6?ul7{P=rx zpfL;7zvk~Y6{GBi%wr^QVs|Bd@GV$tcK*D^oSKB-2rf#e(iSySHDj7A-UNoR!se~L zM%03W(CCTS9)y5(!TaPFXd5aJXkyHLQ(K4Z@t}ooz^H`qGJS`}=)uTDOYf+GNiSzC zbzCz&y}e!EC@}TP6tnByv@uh}Q%ru46<7R-Wo4zn4`iuS1&rG$sGBR~w&gBU2cCx~ zQ{m;mv$wXgh?hHC&w0;xpXI;rxZiI7T6%hTDLfg^rJ^l!?_;3HPMt(_-3b>e(w2F^ z!v@~l-p@oGoO&5!s#fQwX?ea{+0)33ttVE(3guok!u^WZVNx1IGpPiTV|%F3MXJ+y zw_{m{gp?MjCXLIp=7QsgCk%A1C!nRMV~Q*dDj4GUrXGjmeUIOEX^;liM^L~-u+G}q zy=?&`g%--hiVH+6ihF%9-IDdH>MkltWGqvdY9si87Q2?Fi(|VB9^Cd?Bc&AqA2EvD zqwoc=jY`GnD(GVQ;ump4Lt0;4z7!y3Ftz~$eC%D#5WJ1=&vLwSJt1AhqBC%=`@zwJ zJEZnbehxQ35`7?kPa@DWc1D>+w(N?N8}*Yen|povjdzBqK72|B21z0lp}T0eFdEwb z;IdGJ^K;O0UyKxK_pY}akv@Sal!LMAQbFIitMdhXi?9{)&}WwBu7LKDCx2vOoA+GC z6hXGM6?Y1*FYYiKpJ~WMj;DDAN#8W_%aH3qK4Sx1PkSPSmC*LiZ?6i;-DgU%7f$|UTF!s-b!a7-+J>Kc^uypN*g5PyH;aG5sh zJ1+-(K~7Z4*Zlg4R$7i}>$JIeokOlB`?52z5l_d+>BWwgmB0;sQ>`Md{KJ$B*0I3{#>gry_^H zPu{c)H!ebyjVDW&={JjXwjl`yU9%bP27L5XVaZz=Spb#Az#)|S)WkvZQI?<%7GotZ zUze)(o{y?oTk=-iPb5&-%tbHXKG(65!E5R@w((<@mcLqxQa|{TPO^s#V zfBEc>+y&}Ng)V3yMAX=HE(PY!%C<0d_d&rqEB0$!DPDymX;h&rWshiOFI_Y6 zhs~T@8`)#$w{8D6ze81k4p{7A`XU_68j>+4-b8Y7jlV@}(N+m5XkjY=3 z)_kT^Fppj3D(jN;wBC=3-F+7|W;pH^v=eJM%q88I-JoAZMca#DCAuDAyy_FxF{Z79 zteHAKGNMx+E92w7Wun0;%lg4+c6!4ieBCuN(i?eKp~zo1g%;XNJ^ZZDv0=4HAhoYO z{YX5p*Lf-p)R#84)$%zOxPxnOQRFdd)yp#|vyH@kz}_S<7JC=e)L|=nQ?DT*kY5$E zcWXntLQhMGdEBx{`EJb)87~fAqb+MaZ&}_=(6Y>5L62$CpSq+`3;LPXm{x2{wth6v z%ymqNPZYnJsMvO#{Gc7`PAh4|Lds5WElv(?9dg4IMCzzu?JJRb7cn!w`8B#DFvQn6g1@rhC#@a%E}Fp$Fy95LtXRN)3R$!Bx*?Q{%mkbQC{RmP?c34N`sPd0w`OgufX=9DQL#UcjN z+BP|>CP{isnD{Q9>>eszkwcEgA_$vUW^>I+7<7}&@0v&w zmgdf-G zrQ`QRP|c=T;&p$-jjb~6C33aFj%)XYU*o%@aC8+=j~##A0Vi5Ee=2u5D$6+N^VGgJ zCSQYJJdaDQo9`rvc~0B`ctHbfK^Q=58H3CJVQBK1S^$10jPfo^S@L7yXL|QC0fjZH z!8}*&?fFsrj}bKM@KQWp=2aAm5OW~O9(mrO%aw|5jpjlj1Uu;Kn6D;FGUbf6`xkI~ zxwX>1A5vsD3wJYhXOeJq1r8uD#qd1*PvRBCt$xeJ+g`RUrS_u!CoQDQH{FSy`=9~f z2^ZX#@5ax^3+BJb@64p(ee~0ZE3Dr?&? zPSz}010`QY_Y2Ao7;BwX2*9m&!JlF~!e?lm|N1q zg%nBs$KvZAf4!tSf}+F{C1jclEB!cLK0JI)_(;26o|=_o$it;f7x)nGGbGROz*w+g zZZeY14=^%{KpZX#5Y}{P$!Quq9;G+|zWgeWghPv0dy=c~?&1Nkqs3#iwWw2LOVz@I zWYF2_jX(h0sf{%>kY(o-L1Eoosj#rCurh2wFhiF`d_{CAWFZm9{>z(dnOS~(oe@aE zSysfe(sQ)aDpd{A()2XS%Zf2lbTsm7Q4X%k@-lM(b``~X1c0jY zGLXan-0uHnbU2=#4CKLputyO}ULpSl@%y9U0cbdmIL;8pXOIsm`39^R8+(A{t+>eX z%}dl}Vv(bP{Lc};peY7^n%~G4<`**$Lmemw0d7e_OvkfmY(yd7%JQkSS;MuwzFfpy>BVXjc6dNheZ0fkXnDL z?Un4h7C4UhwU2@a@PEbc%VV^Kq=z+x{f#8IFoy4+wcGVg$T!H(M>zma1S0sVyT_@k zN>K5?!6+KtkPpIPd~4hNSfbX31<_KjW;`e+wzNv0agVFW8!eAK>szApKtStBW?w3OMufh95#O}tQ5{&-0OT{s z0vOhaGN)XajVD)+=}>r~m?V3dabgkI7ZQHhO z+h)hMZQHihv2AyUouoVHpl|wpzq8NY``kP3`jLz=tEOuf=B%emqaa*64XPKVtab3A z`~mNaAdI>`BABEI8FDLbdf4eu3oY#A#|oJ!7!TO0v*^7P->tnu(FL&kgeo1LFbGdj&?qMrF7*(6L>18r{rCy~H0 zvo4)P2A{a|nzsj~cMAGyYRHio9c-!9*zm4-IZ+V^%N1~T2S8=^J}2voT{C^9L{0J z(seai#exx{=H`tEWAmP54qJ*B(7pV*&njTi(f3eFZS2_WR-QO){8xn#uP^r(xdkAy zWg6)brBqp8pWjzjbW#y16C&yas!o?dwgY?;)D0vzC-%f4+S50k^^I=#)BXVERP;mJ zc0jyxcd_&xw>f@nexOHSSmBSjw-h6aF1tzLcd(yrh$lPvVG%8$n4_ji#g!)Gi2r%L zk&<4E$TP!lkKiXOkMF%jB)ENPL==6_rl3PThOht5x_lI_jbMmk%z+dWIsigUzn)C~ zJ(r5wZj?G`rsk&Z<)WP6bd%9}zA4;IsVL{WH1YHq4a_&ew{Q3?HxoH%MkRW<>kZaqGoacXpMqmuQtPjhS zg+T?Ov1yza?QR0Iz{_8(6>*NF!j}GE79*8()7@;tio!L}En{THI+d|d>WsG@;&kef zo;UH9su%>ub+ClE7i)YKkmE}6hM3`bS%@n%>6mHNu}v>Gr6hpRn&unzaw-vXb8B|g zG(WWrvYmwbh% zlsj;`wU7#qVUy*Oo~uR~MpzEOLyDA!9Bsk9RO%DxCOi>}M@wsXv zjpY^~Nbj#t7ho8B(O%Xq{ADFpmf~I*-5J#;DM?t;spk-7<5M5kCHEbeMM}HEAhUV} z)!>aptv&(B@XtRLms|LGZlxM{o@T9FN8iFwA(vhY*VGRu`uF^--j<|Yt=1toku>7@ zEo6PiA=D-wJf=BvwCpPoj%~2r^(X`v02050ZaT@&P~eK)jkd6Jrh|iswuRO@?vzl7 zAk+)$>A!I6K6g|Wq(gdqqd~2&iJx%d%k&7oH7&`b1n)kFTyDDob81k<9~1Fqp1D+Z zB#N|4sL%tj)9etG0h0+Yi=uTm3_5~h5E(t)wu`o2LMjHP;f?2d{YHMJ%2$P!i3V*< zawp>M#o>47@wlhI9KMZjUIUXLLQ^W$)Qu+hBm8U5xDWhf zVGX$-R`X-}V*(DDeepQ;m5Z&J~sAWM2wCm5iP zj@~On{~~ZtbIIL<)h+mgBPr@KQ2FqXfS1_MvF1H#?T$S zYh)?c6v~ycUnJoBNE@_JaJgiXZbc=F5PRTD+dbhA9%Add33x12*>om4n~9ag3cw;%%J*BJ<3cAX(nA?aP@D!IkE;+8dZ3M2q2ns1Wn`(1x-U6tNlaP)@BBz25E^?w6<91$#$TV`$Qgdz0o8#cw_}{+&v@l1nFl9jQNnJbS$*`P zsA~C_lJ7_~kjv|!6o};d`So66^MBfxnlz|+(xmL6i!xDGDo~DJ%b;X_=dFhtdIufQ zO*h)Ki*xZA5#Pr;Atd4pt5)ML=7BTZX7^n+dGH_geu+Dr#?PhbftHi+A;cX;%6Y`H zV6+unE8R5Xoq6|d+Y(?BcCYvVX?N!(I|asm8tc5(eri4=o*3iFvw~VCSV3x3x0U~ettlel96iKWo`hrmzGYP)*1s7pA?`T@Hf@-1f_wv8DG z5bT3kJSGFYZD>`-zE_k1q){hJ}Jsb!{!$zRosF?0nF?lCjvu8$3It4!jfavI+?3r%%ix= zs=g2%Kd7(=?(ufI_0kN{`>7`;*Y^|qe#&hRuos4 z!8v&u^&ham?iQ7$W@MEEvBPK_3n3At|L}#a6c@jd;8$X2jlqlw#azhVqnp5?O|b@U z!Q98hu%@^Sa(s79JGCq?3}fB#x$}Mz8i~9&tBwc3w6r#Gw)kRT6D?w45CzhlkVd(u zmSabk%C0S>h7Nc=ZY?|o36k*2?J0KF7FGJ6%lI{)ip~C>&-hmyZ9lZU0L=~};5Zjv z<~t1YCw}dnp7)6E`0OvaINy4hA@HintSD{`m?&=Um&qvdDwwXSt{3q%7##8!7;EvW zDwxwOa%`AM?yNEFJM=E@JMk*+s;IFloa}79zpwj~*iqss;NT(eJ3=<7=rH%J4>Bq- z2jgW_Wa@vPNomBMe^Zf>Q&@i5CxPtgpA$7=#-OWJXL70ij|tcWvWH!96LCwE zFTF}2ug$5PVSDoPTIV|_d920r@opZmIQ!^1gosp0x}pmzl1wXr6FOZWz(>$j+cntv zFCtN%bZwDAfLCq3`qHk4)Or?)5q+p@pJo-vO0=_L0sc;$wv4B3n@!SO2^5`Qyi zHGc_YvHH$J6^q|}qrqfA!Wq5>oxaRG{^94c9Y#W<5$2{m$3a$E~}ynBfL+B!!3 zy2LpjWQ*tE%{z!5mJ1BfM96(P2Jb#0t;vLt<)hG(@EhLXq1kfXYLv@qjO3l2==lx{rFKhwnE2><+UcW5%;Ho|oJoTO> zx^j*V*t4#!*<&IxTPBvaqdRCfVYLog&9-jwJ zjIFM#^C-`cFNFUnL|>F`u-Xlc=$;2g30(>NMvN*F5dk`wdg|ZU0KH+8cmTaDZg1Pa zX$3}I(#=Oa#wR_oDu4i@FmR3zFt6O{NjaInhJ56_bS&Z{BD{+Syv9PidgS2|80_Ug z{fkKTnYkSX7tb`0Cad+qF#zRF+hVJuxj5H^*uI#c7ADBf+w}°O_hGtwQ2x>AEml~y zAHSKiy~>CdOCG+`#3gsznGE%o)|UpW&ZnclyD%VjCYNw#aWz@Z{=`@o~^!m~9lW#kH(TTHm!*ZS}0UV4A&z>3F zYUZbeJQ=CqI(34qMkb@k{P^RVUce?L=UOs|&ZeHc3 zW@TnDwCRnD?M9X-Mmi`yA}y`EU#3ZRnyKt@8(JC}MUIU6@h)*=&tGHPyQ=H@lcZ_R zm$tq*dpkk6nv%**nRTZvcuSV!ADX%QQKAZ8DTcG`D}MwGmmrptxOVsb34t7_ydlvX z^DRFPh?GL$tAL|KJjB>ujXC>5%w4Nlu+Mh_zCFRsyzzE`$g=j)bh)je66PuQLV>lKKGk3v`56QniT$zHfFfM_;JbUytF| z=h~1olvRnayp8cb%++jPlv_b5b`fo*3ouEmA^kequnU&6_T6Xvr_Wtm^NZ9a9-5{6 zkr`zkVavX;&>nyUseN*mna33O5jlyQ|J;X;7C$FXx?+e=v4Lfb^T+5iF* zz}bL5)Q#blo0r%G1Hud!em<=VwhOZb**SR#!KsX#E3;LjSJb|Ah9Ktaxy`$K#{*^r8Unw zgzoqRAVCeljsSJB4b=Ku%9daq!ba*^$BqfW6bB_3IQ?A4J`H8ZEhZ%Ya6@O)rBo6f zf1!1m1!efCw5qT^2@2=vHY3X@z329h_r6G(POA`l{~4i-ilh_9!tN94H?|{_@>9gtrd)V_WAv;C6faB@dL1DBz{=4 zy>h)fMJ&{GkTSp&(*(z%Ftd| zEz4#PgA;)knG?mXYa7MR$>uyGpL=bA!&NLxd+}%P#I?uZrq^3XhZ|;Sx9o*meBY$8s@pYEXlNCD#6c;yK47DH=m$puWO*06jp$zlpL9jZhie z34fcr>0E#qA@#>ETQ?3y<-4IC3Rg%N0_%gN`9gj2UK7r%vsXlYM!jAZHHP45ti{J; zl2Y_=Xyz*p%@cU}GP`QW*T>DHs7#X}fJUWK6MM?nNNxS?x)`|Ums~HWPWWev5Ppau z>hffp%=J%!H+TYO7|+T@w|&XP?p;e?pl*A&N%QI$4NfUw?kvG2n8?=jIHr5JB{ z$>k&mx=F!0whu&=v3?^uqSY$&MDQ&WM2)q%L^~mQy6ZydgTtt6EL!B!L+(Pvuf4ij zfqS7#v1Px-eYScVdZ$y;RSu$9FF(#S7jq{+6;4h>coxI`2-X?N7O*@Z%JlY zqvl^;+A%8ATs>h{KCoU-I8bW(2+Pz!z-;t~x)1fG+L-R?vAfe}_#dU~dvzJEeHfYt ze!n+J0k-q=WdhBgv}`B;I6`zD7)-S?Q(F3iUf$tG*oEP{Xr~@!H$g)Kk$7)mczR=cCV=4KgeGC-vm6)x98J>`6_Yl`#M>BXnWC5#H|&# z%KTnz*vw0G(#elqIT#Hw(`;(Oq=mqmjuK4{jK~u0_i}O!gkAvSRKXxzCPLg+AheKM zQEO?6=(b;c{nxm|u2UGU+!*P{)&ZiTCOzdAJe2xzkHbuX#SlNl?p9tgTK}NBHTz6Z zVWq@+b|+77az#VW5p;zwHO|HG35%wS)dTx9WLgeaFbjNlxN=n}2Ac^P@#2-l=oroP z0K0XHr1iz-#0o2fYhe{m^~QqNZ=4Plyj|S$tHCEVa=+{Dv;UQhc!sH+io$aWjMVwNKdw?PAzaHA_!Q#fle$`V zoDF7=r(gh;I*5Z4V5IL~j0Yv(5zFyO9=QNYN8_g5-ehlBNPu}I)XO1AuQ<<;rL{-Rw2bTOTfN=N@pAd zpvwqlcLP-TE3y83HfCQwIgpu3Id6_)Nv}XBE1$&|wCe84_ke~0nEVDia3~Xq?Un1U zIvtHFj8;ZUkuueZJ&J94mQb@CH6GSY59x?^&_CtGVkl*VXZH_0iqWpF_kqBur*CzV;631Ki-EaGk2; zP#=P;8#$gJoho)iNA<;XQgC6GS3sr-88KI21Q9NuY($aMJftg?I}xK?D{!0|$Yb@M z_2%Ss_2nOpQ<*{~Bmq$r6M4b%6Z5mj%fF|pkPTA&(UNg~o*x%Zn+-FSZJeLTWCRN} zjTu6DAJ@_XIm=$P#r0CgdXWvhm$V#!)Q82@k*@HesL(Xvw;8T|iS6}dWWmAgv_)sdBM*Kvtk~*()!jdNs0jhBeBegzH`cQB z|Gv{{ek6_vJ9SYvI9ZUlOYOBc&avX)$KW!B;oqy%O;o(>_XUkycrS6nP)*4!7FKWM z-mlTIqmZ-w;F!jDV+z6_E(#)uMTd#2*?s$H{z~5uzdbg7Q8>K=y_3ECQeG~SZmv8S<)T;F6(PUP zEI@sJ@j#cjqfVSu5!$7+a=(oubKzOXlCIM_#YIIOAo2$=|0hS-E)@4uSX1rMw-+Uw zw+LR6aR7))!7REzMR=L2zU?*>nqPcCnA7(}c^y$gOctv(Wf*GwYn9(hNbz**Ad(2_ zx%R0aPx|^}?YZ6bwf@NobMHLoG*O@^Df&7swVQT|+;8Nx4*sQGTx^S4eehN(ze>ot1aBihR0Dl;`DrZWeuVI*jtXG~FsLbSD6S|BD+gl>i)7>83GP>q;)Ze~*n3vO@ z_HL14*^q)b>~lzDaZsbXc+(_jz~`eM=p(oVcpi26QS{`(;eSrins7xZgwPjq4HE3_ zm3w*Q|8=+`H!D3kyZqqj0_|dMj9oa0w1Q1qu#Bz4sJI)#=U-*^Vth+579fa&$Z`M- zVfm-xRM$|Pw=173)v+0*1|xvU797S({gcMNHW!$a7Vx725UD__j=?SeDN6nba1uttI%{@{hFVt~& zh%9a%&0SiV#Kg7*a0uh1UxIup^}3TT*Z1~L}e z!TlIwYQnMwumJEin5$dRK#0Fp?z6pvE9+e>3|thfWvYW!{*R&_j)Ez|^q)xs$f_II znHTMj(XhuSGq6U04VmbY{av3*ZJEZ9!p^5@zi!AJ3>!!F3amtlbO2WYM=yK~M&q6f z)pEc3>VZLZG2od?7n34CoPL&U#^?WF@y7Q^Vw^ZAb2OqXZ3qhyLuTx$vah?mLX_%8 z-ZR}4`LTSkH)l*aAG>R=VFK(Zb7Py!1O0tK6#J-W(`p3syNagX)pK-%dS&MeHO?4) zu3rxzVotiG=tz+<#j4w(x;7_gx>zV?tAltKnXZc}sEzE1dx@6`5l1gh1VhCx7{v2O zpiEc?W1Q##Ed%;InxFUhp+QzGt<&&|6kHX|Yx6=XTWJGy1^G55sySOD%O5pUCyzaj zVM%rw{kP);L;a+s5X;A)`vGpnh78UQ&GqS@_ZKeSTx|Z@{sa8`%^#gwA7%k2UNLjH zG4`2$Rbe(Rp?zz{P4%P7T^;PD`m^BiakZWB7VT03xA$Q9;2KWO-aWk^U%s@HO)Id5 zTwzRB9HIhff8s?;z$(Hxn{D31q#TooqP$!CauIoR>7*vFq+1yr5|5^DWmi8ECSoBq=|^Ob$etp4@LO z24z!4LwFY+B+kfMN~0*K-Apu(hv6sRrX`mmnQ0S>UXH6xYt=u`NTLQ)`SB*><@?hy zv}iVCfL6gGmV~iNwzWBKsjC-V7PUeHQVkd7AfCBQGAEkm_PnCf6>I{dc-uYn#Ec^C zr|~Ro6b<1q&qy*ypEB*+L~*Oy9%g0x3JBpJ#<}#L+12^TdkcBt3%}i=DYJwc7K|%j z@qlPBUF9<~$IEbWRes}r9W1td3LO=dWXS&CV5}F;g=@$4X%d$n6?^8`Q~qdW;8Na! zu#1qIELu_CvY#1ioa%0miAkSIDI``D>0w-c2WNx`>hS{sy=5rH^B? z=wxfITQxSFATKc#oiGV>OsSD=1Cb()w;M$ds@qFJ?xJG3OTnQ4v-IV91RXYE;vVK5 z|Hdb+%*UIhZp=z43rgZwC#Gj*r!;pV$@yVMz>zjPp{<%3*j${l?{sA*m)9GsiXcUB z>dW^+y{-Vrp%Zz%1PizLJIH=fyAef;-Q1c;PyLKO?7z8F{eK%rN(nbO zhifxc69Bt7XWz-r1Oy-UmBQkzBNqoV5WsE+0cjhd^%o|f zYB!=JC2E_vz`Po--2A#`89k0`Pi+1cj_#<1>M@Bi?CsBQqE{Cd zQVDhxf@M4ge_{J>g!X;ZtZ)0p$rJ2c7oj-LByYGHp2!@XHkT;i(txx1?O2@Er81e{Phxu z=ap-V?n~TA9A|w`sZlh^FZW?*{*pxvqmyIEJZk|CNQ8p^c?tUW>o;D&=$|m;Ur3D> zASw6YC@HZZiVz--)@DRBEf*l)K~t(B&>>9i&0MK@Qwku6Ks}6IQiLF}TlOH>fhj6b ztYQ6VJO@ChPjO28L(OP}(Ifqn9+M|y@xB8DxFJlAA zYkv!6+qyv344!1wjuSP_YHDLL0RgIIMDBK&?m;@__q5-8RsmIswYxq}sDfNpXD%L`@&IG`?r zcGxcPlZ>{h?sdIJ@Y`oauI^_5q%L4;r@%n2f6A4eL||g72uyy1=nmz{Ru7qsXhiVCw$=0JIZyoBBsynmD_vcTK`>CjfL>%wBnUJZOTNKvy z!ZUKs@u+j z1Dq$(jE}*BaQoZIHKTuRRO}&Y*+VYgoGrUIdQmIpKi-yfO;iGH#YD`E4kgTY`#`8qQXcC~vKF};{lk;Ok3|Ut&=7+6UxNJI@=r*zb@0n5 z;56#b7^M$Wb`1G>IhwAk^I0mz*tr=-#%KnWRT?>l{G8*QT7ZNsQtIz=fp;^ zCHhgqidT-3--^|2>ve1y0Ol!>r?!7-hIfW9!h1wc;_PoJRxGIdF)&c!pW-m@5c*>? zNr}G6u~?g#wlzHfpBlLE4JiAkR2lJ2@(xbP{J%=@U)d7wFX1okVRI_M3oilPD8wgL zNcVS^!*uz%Ggi=mo(v2hTm8?EHC+E`$A5t)O8=(XNSrTxciKI|m1B&nf|cL;#s&c(~Co)FR7 zg$WJPq-^!w8OHGW*rA@5d9@2=da2f}oJM&*Z6U_I9;3R_yiT5YMolW4a!F4EU5*d? zLlo0`&rIfuQMNC+jVJ#WGR~WoJL%M}ZBu8pjKL!3+Pcr+5oyw0-PCsb4YjdQ#_A2J zRoy-PQo18f^CET`A}5>@QZnF)Q08VmXF8x@S3lB_;bv~Mf>HC_GhvQQ%?1n1Yg zK`WTTduJEj7;xs-?hij6JOmkaPIF?R%81k6wZVT?R87VYJ5s z?^jnBS7#qj zKi4EZeM9|cVHSCHb#If=JxOq68w)v#K?buf3@coc)wT~&^iex2Rx1#?3{E)|IfU); zbQ}+BXcAR3Y%y39qRt}`3~Vqt)nq7c3XiIY(56EtF095kdSI&)YhJLFb3m1jhp$7TghjbctXN?RXud zXsL_Ye8~xPIhJDW^hWwWT`4kYt?iXXiIT)^qDG4kXXCDBZhMavJ56l6>}C!jlzlD8<8!C)pWEWJU4j#tVQ17)?E0JJoq$4-oF(hwoemtjGuSB00ily) zy>zw%W#g!rMelHkG}0I8U<^Xjz&|(d;ZCE|_7|fBPr@axfGMX9MjQUs$FH|q1VLnG zO$4xCdjJA@+D1}q;8DwHtbp%GWH#UW)&U37lCo(eb#N@U!bV*h`v75=w8IP1m>lQ2 z`oZWQm?q$!kdWAY z#wZbaX@@au;3s2M<8{%ab!c_G6CPg^sUw9M1S|zqTr6BJdHlM>KTIh|Si@{Wh6uh; z@SK5_zN7ms)g=8qCu*2kOqYm||NpD=R3iQ#ly*!m5jfRiU0?M(WvRG*Y< zXz17dhM6YCy~t zFq?P7UOifTNTp7uj+UQ={l~e2OqTM=Pw%@wb_dE>-ZTeaJPaC}-Zds!PII$4%%O=} z!KwXypHc}y(R>h037y~)9oo}K+S3>aDwUO*%FE&C(Du>QCiv4RW=+FO9T_;0^F>t; zmbo-?DOl3t>hO$^P7gIL2lRG6zIgZ(pEaYn@{4M9(zOM_*I^TiplMkztAUtw=$8n| zHk(61B%%UR>6r`3x@ZPbebpPlS+y3$s0k4B$VEbL8HI>maVs1f^^$A9DOlTredSsQ z)^7Kfjv|!_@G>{+I6RaO8GI4o99Ku+Z24Y@>YL|W%0}D7TKmvpUbya}q?-s^^BUB( zWU=T}=>{{2bnH1$Bhep?A{Y4UIWTndq$t{8eOp-K^%egr-E#ml3KR@?U-HAnN)D$ z6wk(r<8-n{sb0g-^m`|)L`Uy>L3N!|-C>b=E_#um4-7~PLw&$y0HRcjJ%sTA7lkuy5(==KnyBbIYkZjx{JDp<!^3Cc`}J_*TBx(n z#GQBZe#KI?p6_s#Ocqi5H~8h9U>xz>(FEg9Pt4qxwC<(m9sXSy&vBK8#w*+c`$nef zpNE5?G6T=(QVo7oW&<9+6l;ic zf?mOE{bUO?_~;`2QvT%Xv}vV46-esBscx4 zOcuQ`#e6OKsrjQBDk1xxA+Z*GhDrj0A&0zQvs-)GRoE-8db3{oU(O_bzArDO)U6W^ z5OAMLUbc(kWrnk=W>4X;RnJImOT7K~){C-#fv?tDPPnLEuo8HW=_jb;ezDEaCmFb* z02<8G2m#!GltO`8NyxnBB?EC)QN0v~;*kdg4ufyR92Qoou^6eUs!x$kAID24u&mb!8HdU=Uv0X^&=Ll0W0@IkN&9yQXzCOik5!CO8YT4Xd8un! z^zX$o9*|24P#Hlma~l{95WYU0)m+X2H|q1lhDsSj_?dZ@wED1LuvG6NmMOoWjc=23 z&b{|Ev%Yj_BB=f${yY&Pm8~Rrt}#Ig0!NGz-@kl`mQi9K1iQmo`L%+^$^<{eXv>z> z!O$I{W5OuD6>`>DR!kclKI*YMD6Qz$B`X`ap)4k{GO9bT(4Bb!rVKc8DaNI!O-VdR z27zVyR_vPhqj#rQZLDmGg(8(uF$VVS&g$^@O%PJuM%6V7Y0>P*Im?glO>cw!l7X~i zF}?ilUm4?m-knQCbZ z&)paKr1#{u)CZIUkehPxSkf9!&t5!~XJI!#m@eKPMu`I01XgGt2B`a0o%HuEb6{fT zaZve59bCtBhRD2rHLD+o-#LbXAi}u54Os>F_K2k#y6*rqZt=qq{*w92j!y{Wu^Bje z`fLogp%B(nmiERFobCyvGU&x zF(rwr*=PkR+IlF4#f4=hiJE$enYlW(*0bQ6n18+K)N}rN(PhAdOO3t0a`%Xw!bab_ z!pb;Vg-flKTt-Y$P=MBrnKNdaG40%yd5>j%_pYLb$?_)WfuXJfC&&IOVWgZERS##Z z#lnQeawL59{I6lX@~nmrPK6rN1h%5cvCs&F=$Sf^q#6E_ltErNjZ8NJr4Gv%^%&R*DjX?Rk23@qiBa~~i5_VriYX1qLmg0?GO7TY- zr68BS>T7a_j&iei@QE8oVdU!>UzivHpnMW(^UO6!*elmheby0I9Z56yldn@Y*`Q2F z%Nd@i?Z)j;P{R}Lh;=#yZ=Hdn+!2R0Z+h*IE7tDw^vu5yiF`mF3`^kwoC86R(x*@) z6^QEjiJgNCkkXJq$Vv^6O!jWJno`0;5MM3)Ss!w;_Mg{#1bcm37u6ZL)2a_u+D@Dl z6ZIpq%$7{*DP2n6Crh5qZKjG)VDn`;9;SXXl=yTDfn||iq`+kp(*7|^l|0KA1jRTJ z&6O3OJsm}Ls8Ug{qkY(^T)+$3C%yGF<^Ey*1nJtrjau5--K(e7CC-EZk*Q)*Jkv}2 zP!=6!9jU*)R3?7zrU>ss{181P|1BC}UEW4jxUIK%w45S}@b=g6)}&TXxQ_%~>o;Rc z*OTY(Zdw+FNhr$Y!cG$;v|*?DVZStC#=tvKcM0r{x-{8k*x-Nxk^^<7k>VLk%W}Hl z+E#1u+ZqX7oGGtg5fm(o$fgm{FsLr4(J((C;pWHpLg!5hM+i;%e+W$q7ki>U`edP8 zC0Ij&7Dzy>qK2f0^YPu#8&0^1XW#^*T+u>Th`tqAqvS?9>F~qW5$q5WIbjh3*|S0$ zj!J&W{N-KG~*CH%dJNG}Pm5p4}?!_IO@e zHErQ|u%+&`SgO)$IBk{Sl$dB-}O7Ff%WqEf_}tVGK4`A!PRN%+cf#Hd)bo*JBGLHegjDeZ_#P2 z-MDy4)#zDF*Zjd7vz$$#s(KQ)+Sc>KgAWvP66nRXkg$Vk%yFj@8WWz;iR=yIN6nc9 z9*_j`?T%R~xn(1l_$#@|U-IsV+Le7kS}D$!2WclwMfOh9KE@OO&pJ^4H(n?XN(7(pnD4rcx!6P5^S|7e z^08%x=SBJB0+tLV8Nle$nA-3>kFD$;`1qy}9>FqD{ih80DCddMC{*GWqx9ATfI4Q) zhtN?LUb#LuePi~bY{w^DyY;hi~E(Bxk4SBzJq0 z+Tx`cDOjuUDb%Ct_mQH5lqVDP}GDAHr zN1wo`Of~tHPNPwMK?r$e35>dZ?=9~&gzS^uu@&8bMY4G10u=yFf7T>lgd3aTQwEUG zQ%LYITjt;efwDy0BhsKXb zO=3`MZ(M`iUrQ-VuXJ!VoQI+>1i7idovM~32#{HhWWN1$IMu;`@>r8ptb(gx8oXxl z4oA+J6hp-bi*~aY9Dn^$y})Jaax;Xf7jZnCzi2nOei6UehXaXK;-7K#pwtxkEfSSO zGg?+20W3hI+bPo0Gciqz0iVL`9bb- zi2lSp5toa@^Vb=i=CV>bf{0kgZy!@V(|dwcU;}w|Z#LvsY3+&Jm~Z%28iZJi4?ns+ z@Z&FVopgFYI$Z?%dS9qv_ZRKGmS-wDE->$%wrEOkbqpZh;sSNqE@z~q>bN>!>%3}1 zQUy-3w_u+J%DqWv6x|!0$>mV$TYD-&FWd8JrQ7Xyakqv5ghzt-f^BeD5Wxywxwf8p zH@!ppPA=UG(1-uLy!_{N^|`h8xpk&@7Gjuq#&;^q8U_O9_ivcP58*w%6xT3vj(Ozm zakA3f?2P2BarIOk6`j3*nD}{ww$VSR?Lrt|&)6QR zV^c!7eo-i0sTh-cQ)DxcZ#bj6c)T%ku|(p*5Al~+Cpk}56ISzkCXD*M=9$y z%?|PE-a|ZDhFJxKCSrdx^7-;9O`ot%(WI25zEfV-L^;GS$rynFc1!hV4?qKry>egC z9(n9Ui|@^7f7 zXrGE4S{JL!i0atvEn0&U5I|1}5&8`z`*YQRRDktA!`iVLjjLcSmtaX?DJ=*BDGemB zEvL|N$Y91UmL4r$xb_e&H^hd}c2!7eH{jW(|FlPKH=>?C+n_C$MS1Cj1CwTEhH<%d z`ZwR;2F>5pnOchNr>U853fjr&!>^Nj>@V06>n8~DUng^3t|%HbkM`bDS+jgv5-M?U zWlfa7Y@We<*K7YA-!V5(PJuY@SSm;MZ=5E1xldDau06~nLnldx3higwK86l#ZsdXp zSU@B?8yLJ;%Vv8+W3!;Ur>r#8oe`fG>D-Xl53|lpERi*@#gMxb=`JsJFD7Q@A=D@= z#Qu(L3?$CY-3~{K{+E7l)>r?V-K%al656QWCMMboV#K8OyVTs+H!qfypn`h12pB_O z<1_W*c>Iqi5a4@IvDdfgR;V)3n*FvR)uRlu-I$g;ELDfeRU5r8vO8AJY zs5qy0I8jl-Aa8J1QC`8I5xmv%0&YP6##kQBk7O0>b^sA_pnYH$Dl;der4$XW+oU%0 zqq`_-3Z!72DLz$u*kYaj+f#=~FEiY$f*{`yPnS|B<`vqgDHJ{%U-+tWSAptO-p#mh_rT1Ad8*}ZPR9S;qF=Tts1=U-GK= zqwfkatu4cCTiVQ8JrPbA;<4-d9s~d8M8AZ-gxxkGoz>7&NzKaW-xU50CkT+`fK)pJ z2}k|pY-sIlZX@R6b4$HPGe3J*(84A&(BCO*sJ<&Q95(0p#;5o^_>xl~0N9lflPel{dK*#OUuxM039-Sylha6MJNe|wQgdJD z85Q#IsHm8`zhiH1dc`ud6XWOpyW}=_zmQSkBj&k3Uq}}dC7-lCeJJmMb0?%x996!d@ zN4dBoETg%UI5{Tlj`*iqU*P_*OQ8GFht}BTV zA-S-|@_STt8i>X=Lh?=F+tGF^zF%yleVtvDErg>W#H3V(<>61L>|j!4SY2gU9*k%X zW&Zt+HShg>hi~`z{q0>3-Oe7J;x)$UYfv8eT8?2M&>2Z2=ja3@DR$CP{DiVaDpcVH zqs{#2XvbIOC*8xzbh1oJg|yB$U|QNaW*M5Tt*)zcP+oy{vJM&|eCJt6_+}8C))Y?}!CXFF34F5;#|Bk^nN)_UH1YoAWq zxO}8ckHJ$mplRm%>g>2R=lOp7he)7N-sI^1Y8fey(3q`1oGqg8@gZ>M5HB!PpS|{PAp4ZM)3q3y$||6`vkjHaso7Z>&B_WD zz}?QD_$l1JIgp1E_Up+crrK!Wc(bF*>l7HEaDun<5;D~9p9!!yh17jLu}M;i`d8ij z*R!wn=kps#T=B}$Cr!`J6i2-=@WA}*)iwFzO_Tk^C_~udKcU9=%M665q zY(ysD;xAp`_i9=DWU1W1-*xmTP*0YhaMTryYm<%xW~Enl&jXW=a7$ zz1H|Q1+hYUs_wu`KOQ9}V3rSd@&-J}>Mtf2snh=t%pGKm;iitLnk+x{9BhZ+BZi{zD^SGHP`NS*?4W$+!z@BLP2s04wb0M%B zncP4Lb09G*`qP6g4J@QBOcX5Ct402C3n>$EmR7cQk+xR0X$npkz_k3wjT>LAUTa8$ z_#X!uf?>v(d0G1P%(uX0cUM3TV+!qtSVys%o<-4xy!5Ozz4WS3lhAUu?E_wX&wYvy z_KP>`L$qp)OyLEkp;~(ElJchpNz3s0SBg$$0VKK@hU~oD>aQh=Q3i57BkD>s%BFVd zhDKy@QV!rh<||jYb>bJqs;=10G`e4+^W3XxERECmOsI!N_~L8x#if*}s|CbKjI?yqepg2s?ta zvxCD8D-#leuTNf8ihchRI}Jy?YOIW#Jf%mRZxg9G#V|6Ig+{I&U3~|Saf=)dfK5pl zbPE$I`?n7-YNrsKOAAg7^Y~f#-hFM#0nNkAH{n!EmkcLtR|%6vGXrFMcYN>xB|<`| zD(l&?$*ipM!lKMfz2vNdio){pLSV8|W1g>}Oe$j)8*2p_t6~XNTPItEnM+3`C9a6a zJ#3PaMA&3|@jcGplQ+p-73Ez94x{s1=#yWj9L2~+vpg&v|4nGlPBd<-z@QeFX-7%d z_flIK%LFhU;zBrt4y5_C>d`hZI}brwN!L#jX7c}G9BcoRahyEq`RCww&CAMZC|SZU z{}0-r`BdBI<$$#GGW68+Q>s$`>hiL5Q*v@s(s7D)R8ljti+^t|*4k+Qa!0B~<-l)C z%75c~1SS4+7Hw^v>Z>osQQ& z*&tPaQy3N1rfixvAU7849w@Zr_X{5f+pH z&B~T5K4a}XfkiPyO||24198)T@rY|G)C_E+h7?n^beYAYgGp4GQ|%0b!7;1RB*G*i zJXa9tM_&o;+)G0`?@js~Hro)$$GqFd#pOWeSzCPrXVNYjLD4MkA`^I-c z0v>eXdd?tNJ{7nT=SaWcKcg$`Ic-?**lB2NEa-OVaJA^4|IlPuSYq6-@1tQ+QdCod zM7FlFVOCQFS)yzx|5eS*%hM-5Et2$6(G{yewr^BsHh<&9uemroU)WNcIiwqL7=r<_ zjtOPY!E8Uf8vTg0CoRA@K5>`BIr=xJ%U?&)J8I7PDi}NitQ>q!he3_N^I9uBE^84q{PxoHdWoPxvDoLI_-bT>CV9u1R3pxZx3<*lZ zP9&XPLXr=s0dls`7;rN*sHF|N2&|xU+WxDQS;P&6gXWqeeFVK;!K!6O-ax|mnquEw zsUXfC+hk7o+7_WrT|?a3jaO-Fzr7kwUcEc}O`Ojk-GJqf?Euan{eoADmo2*UaT=Vn zGAy)yC+!?6+k?HAXiY!XAL)PT`HbB_#Z9`%>nCst!!7IWLxFUc97cSEt#*CbeRyiliCtyN=wk4PSR-xBeUVw*q;|lAvEzf^YMjYcEEL?b8@((}Y0?S{1+LBDH5>;|zpI>Gn@J!w zr^51cd-QBFgQCQkwVW|Vh<=OyjZirp&}Topo4K%H(8U}JnLMB5d*vR`O7Z^ZGEQJc zU(msf;7icJj6mE@05k1)(UgG@T6A1b;O27&+?sRGCYUiEGPRTna!H92OcS6q^1VLfyY^GRt4)9VgXw#Xga7}1K@MN#g`j#mtZHZnrlKX8f1{#YG z_$~1j{b7(Ml^iE~%POHkn=iH}?LYh2b zenanU5j`05uwF{_Ou4pDcwyPELb6@Fo*TYBdfgw%V7M!LBag!ihVg?ZFSSbM+|R`9 z};MpyJ$C$oLIJ{#B z#J00Os*!p4r5fBhcFApk+t8C@6fOaKxL`j(q#uRniy;?~Wj+kDqf)cxAUwJpIE zfK?bS>ij2hKYv0lH=MomhU_Y}@q}?uS`Z*XVK8o|!Y3;LRT}~lqWN?|!|Y+0yl*I7 zQ{cvn3^P@ohRNIVEdBvDC=3H-oW_)7^!fu)j)>XgwkE)KApP-yb&d}H9p^$6YUu~` zPeBDWBM~w${vE7RKU|<VxU-H^oM9@WuYh z-!HQ$qlpVADvM4pfmsuW*K0Xmn~{V*58bmpwx#DTUAg#mrFu`8hz)ybgfw;fF=-aP zr%jS}zOO)%u|t_c^~F+JEk6J>stvDljfJA2C2Fc-&P%I6KNzi>=v5Ef4D)LtDT`&I zI&@SRUQK?MREhlWQ3G(`H+6aI&dDEg)+fwALZ(>aATz5pTG$Xm-dFmLsTq(!6~qu6 zRf%MAaf(%$i88_@s_UwYHT<}Jmxy9hAD@4!6(;$)i4EHjhJeE8rSt=VqQTkr^;Dhn~iet<_53U`LHe(yepRDb$)A z-Me~4M5W*)eFaw_PCg}P5!#J|Bb8J}KTKU25slZx?HWx%Gl)|A8IZMmQGB zBUKVSz9xbuP0iSH@D9Thh>?0GjgpbG4^lNuiyHf()yLmr1E#{d|BVt z@eEjGTXQEP(x$Vvk&~E@k)pxjPdkbSE{ck`ixZ0p1@Suel_k6*8f@7D-dXRHz>TZC z^F>#FkN&drx1Zj&{Ib;1Lv4BRtyQ;>%urZRJ5MSy{z_wWL|BYx;&y~*dtQ7vg79rC z!@0Vr6%L`zB8U{yGQNu}vq)p;h>P9CrMpM-P%8Ems62(HP-A5ptbW*w_-NEDh(gi*GsBaUE4tqIC70gC zs!pf`tC1bD;;^zQl(|nY>;)c8%Zu*2XuhN~ViBFj#*ER047GCA;w%)G+Vxzm@$G}U zWp^NC+)Wyqmt1H5&sP~mHyJA<#qioN}yb=M@_>}*{>3m z;$(09;G&d76>S)`$Yt6)RyLC?38>xQ&j!L=6n7UY2fE<6?HgYPLDng~!7xc>k2*yo z0Sc1$*DN2r&|Hd$D){sIX=2;4Vaym|n#`>$45mot_a757L}qKPltD=5edn@7gBrEp zNu5E0Zwu5z64CIKt#1d@#f(U{aCJ}MU76sN8!Zyace;!ZOu3_1&VgF!yl}-(<2sH2 zC36`mUz{FKodO8LUC?-#?33#DNi?ojIFK2w=gaI!T^4Zs#7i)``#&&dya?Kk*XTDD z8-Wfz%;)SZ+`Cds<;nLv<-$7cp=hPeIK09ma?vVnn+fR5syZNo-FfQ^mm|Z zrVOGAy05f5EK7G36ejW7n609Ty&r?|0=m;tHX;V4O)<-Dl(@oy4&BmVZoy_crbPHv zMxP2n)3r^otR$Z9^nG~o(a7LNn<~UVaqBm$c#gyBxfm>TIgLnpvGH#1w7??u5p{~& z#>Hm`BmNvT3Z7MriwT}^7Ig{*R!Yl)NutSnrpQX7)G=VWj&3KI(ZckDMfj}N{IG`* zgUA^U$hRx`F$!yUK^=Gi=X0BQ6M4u%t58CADYgYPAP%wo&hNSL{CjJ`DQ9bkR@o6d zl<6iL40d;y>=i>gVCbFfS;yrP^6AScza_I%CO5>owj0niU2vvYB`h^BX!X!DCFI!52xtq0xVA`S1fMqRl`j2HV{<3f_6nAH7 zkcM71H7f!OcXd^+X6)j`8hmDv#-&k*2w7tK4h$8!uza`xUUG^0YA3Qb@#@*7VzNVK zJOhOT?hy(zPlv|1P$miae8a%Ha^jR#;0jm230n$RA6Sg{JbGr15yRXMTlmd&d<%MF z8a{^x_nk2ix77s1PH_IwBLiW+X8tVg_nbbFZ6{c8UY5J5%{1 z?6RX36IG8$M{ISPX-@NEyzS1=0tJQ}m<`9jzyh40PK^Z< zt8~vMWfg)GMGLf_WocQuBwiA2sfgq_0R!mH63QsDt}y+AvLd72y44cYT6cBqQ*M+i zgf%i*4!<{4E9BZ6&^2gYPx5cMe|VkJ6a8dx!WT*)P@~pZyVYdqG_PGON;di7FR7nE z*aNk)`NO8Pk|)~FStkwo7#i78C=-b#+TE27SA-3y6%rOqr7MPJnVmhU(OX)13#R4! zQxC3;xh%0PZ-=Y{0iO_E%fC~qT{yMzGB5np`n4(;NqdmG*p`B}gv!Yx5SiTrIT#21 zqnJs9PU%wql~*eNI!rQSkx>Ht_)UqkGfF4umcJds!q7ob#_gv+b+mwzFU+nW8^Y%M zOMa&)jM3y*QdmDXWV( z{9Cf_C`UGcOp>#+3l+%|({S?6T}f8w(*orsART9x^n~LJaGL0=tK(f zqOquZLGlOho)MW2`TN8}rIkQ42>L8++d%+QxUZ}(p55WbJhrVhZ_C|pR!46okKX~8 z<&aU;qwNuBELGnuw5rE{eUVj0n<~MKVt$*h9XXSOeidM=~~Q zE_w@4dgLU|Hv<3D4Phy}Mi>3fB_KGtrB(8b(u#X5wfXf|+0bu5Qa9H*gRJM`TAcT{ z`j*RsD!`*6U%YL6a-@jiS?@6U*t#D}riH>UF@qOXSt#F`DguC_;;+FC zBj`%Pq2^j*46P$#uU}${Ik_$H1ki)7X_#D;p)N5mHZi@T@~5pZ4){2LSUvul>4#D5FZJrbkaRYvBn_k$ z)lOs8cq93#c-xN>CBLTuUg^@P)+Ha5@(PxnKq;I=Q=H_r&*)$vrvrMnmIl=lw*TVa5V~oRryp*Gfy6PVCU^lXujDH9#zkp}QYHMrq76 zJroEZE3D_pCX<(w_mk)NM$%c!69e2RxN~dLaDw0gVKbS(RkKV&qor6{|Ix18IjBCP zIqTJ`e(Kh#wodW|VFAgG&=QyiEO#4%(^Ki9{^{3WHB2gt0f~FC=Nu8Qzu8CLo#E;t zLAhK~Xeui-vs{(98>0X@SC#$5Ri8%G1_m>t&%bgX*etn(9(F>x^EzVf$ae)-8?)!; zHkNkJ{!t=NdRWg~pkGPWf2CR=oo+>(`V~T^30z|EDduQ=c>ZMtH&BkA>GFt@sOt?n zfv%@MwpN#v{ClYkIgSzEGy1q!V`jZ}tTWF^rk3}Hi5#rkmXRryBIhCt^l~b$N;WE2 zqtsCjKx^H<^7}GT);xG7ggRXgI~F|SQrmL4BE7u75$!#COK1VKPXY_2ZwInZGQV`U z1zfaNcd52M55eyr=gKOhJX`TsR=4qUJ}G;txAnn0lTUOB#k4wLWfq{euJCRi3@?=K zzef;BWlciA&(Mg3@-kU6I}$TY5$Sy_6PQV?r~75J>v$YAMv`+t4(zbv|Ct#$Q!VI| zlM&gcJh)y(tU{Q%LWeg*<^@So8Lydc!l{_d@c%H8tmrX#Ikw$W2TSoki1;JTn(b>< zXfu#&xj7leUv#MF%M2^w4c87fa9q+9)WYt#Wv_rI)%gsF*q=5@|DM&>w4bgC?bYH9s zbXkOgm?t7g0F2HHwHyOs-$wkpLq1MQ+}S%Jq?_mJUqh(h!Yr4cUgU|+Qi3T6%r(_| zme_?#)v0gv>(JYgaR;Q$q8PtxwXNGHXv8=MMt_HqiVAKnBJ~Hw&UWh%}JY%3h zS6`vIzC85@v^x9G^%1a4+$)#2JNxbsW*ojPHw7G|lVjkl`xG3Yhy(e04lFbKFEBJG zb{yxP&J43QQK0REZN07mAT$;x^AMyQ$}1O04A}cKRs;N&4@~R;DCw%!i;k=|Cq@+3oAm`s{GyS(|lQMwP z+kI(4;GTs3Xa2WeQT-i)n7nd*m=o^C`2G$_o^$Ww0TjT=35o6yB=bKY9REUCAkiFx z%>Fwh?muf{x8TC z8=i75#hk66Q!;(g=(tWm5D*Lj{qqtm=yTzH_!FG9F^@xcV=YjhzOvvr^iGa&WkpGQ zJs^%l#^#uRs*s$HM|+kHN8j*nuWrxJz7yP@eLu#jJ%TCWqsh$K+y+eeDhJrr? z0f0qd3!H-nX??CMC*bR!&qaOB1U90BwkU!g38w7Jz`$CXyZz1GZRhAB}#SwwM zmkJJGsRvc(5QOVL80%HCJI6)9P1WEsQz{9@)TL=P& zAd~+NX!#dl0fB!3_BWr|D}Tt{54CZ4LOu#!@Au4^Z{*xB1r@#J|Atmbjt9w%k4XGC zz1dxscNRHJ8;^`0j1W`SqGT8~msxYSA{4-69;fCOG|2g%)||KhpVn&i{!N?^O81po zetsrqerB3(QTa#(5Ih+xKqEKwspI>J0FC>;M`D6qg35D?UsXJ9$7#Y&)_PqN_1?YKI&fT-dhpGjVA#^%s=Hn=DlR2&I<$7fER=uj_CKEZEL&ZnV3 z+;Lt;O)~|Po0gd+lKrB*jFOeFS532&ucMNp+pMMRlX7((&_!YesJ>EgI|OQY*iFz=@p5?reZUF~~TR}2iA`|=r zY>#pl1uG~maqVr1sA=)+ji@P!u}ze4Q*o9NcZfF_Hv@DdD(~5OqzpmC@mE%P{cM*AXK#zM*`#F z@^`3-LYzv`GGSe)DoPK`*p0tWX1~3qT$Xlm;zIc^0Rc@gdIZ-DfuH=*J$Y7PSO_gF zgy^U;G;H9`QAdpk*>qS%JGFR2OB{F{oLLSdm9hnLEvA?CZEuz@NEa0qp79{(8BQQ@ zybCnWsMUI@i}fk@cE&CL);AAwf7;JTj-1Css>HZM?@MbNPC5+twHo#Hn0#>qsm*J~ zL<4+BzL_~s4Vo2etR>4R6D?M1vYyI)M5l4G>`3wLN10LM-z>V!Yd=g1Zf+_-emF{% zwr{fwkXH}sqF^dPN-az*Q)`iC%L1V&&Rb-pXj0MA%57YLZ9?c? zojlzDb{n~LPqvMn$+js7K(aWI%LU>mGt^z4_bQ2V9`RlKJ;N53ymEvR29vgQwDO$0 zBnB?78y4N`Ya5mvyTZo+PBd6w%F>1<4G+Zy3D)_-)eX5#Q>8Yt(FW6<&t(5Q%X^Z$ zjJirjFIRv;DQ%KwRf$8X3{lTq!6F%DW2aS)=@j(>i|`Bw?dtojWsO<2B~+4IY$T-g zKZ84EV@m?}U8zWZh5S6se3b$#N?ic3c=H4F-6mEa6xMpgp+uKG=a&q#$h8OdPV62XJ^ zdB*zpukeU>mlppe8SO|b#7%QMPTP&UE7Eo9_L0F%XXa*F4jytaSi^hfKVHWJT_@{j zDU46+@mr}W4~cW$3@{emCvmLF&SBj!h6@s~R+U=?5eW??BfpBfqVi{6i;GXlw0sGc!$~fTu2N5ER|a%4>d2t+1OGV`9{DTbeIj?ziyun)vIQ!1A{1)y91;`*ii$&QPFnZ{-O4 zs9L-U!n|CkvcR9N4t8zxdvx@w9@=ic>?}0I!Ef|bxdi)L9_!-v3eOu2hvmlw-E~i6 z=t18rCldW)r{Nn^9IGsCd&W)?yHdjjSiBpBRBc*M7W{v^@;c&wfV0ui-1K|?lMKXh zn+dM(QWI$?&;c~Jo%e>xNY_WV!B9EA1t@! z@Ax3x&{Iu1MS$I)U{8LYyqEGTG07qA0hjP|4(gj5y~z&~F`Cz~1l?!a1?X~eOSS0p z?5)(dFWl&~M-KjTXZyu@wAwdOG`uJBzrGKc4DP7QR_plgoJq_)ANfQDDtwTwj%%?H zg5adCh~0sPXHxm`T9U7PG26E-mmnZWyGv;?z-*{Xr-1S*e5-`-pP%S>+CO#sk>tX7 z>KrLMph!i-GQN7CzIZV*b~^TWuR@UPOL907c=OcIqnYi__)V2-sC3?1AnQSdS#op& zch@+7NIIqp=$_mxFzmi>%UK*o+iJjbs_xc1oZad}j-6r=bm5vJot#+{o5$9GoEK?| zYIVSePL3TZ`Mq3VUi4?*AenvI&sGBZk%AmY*-J~psXe;if(Bu*s>Jge=@4oCnh3bD z$}tTmq1>|}ZoQf5J)RP>&?k;*L!f&4`-~qHbEh;F+Dftqn^SrT8NXx{(u>-x1ZV=E zlDCUe3C|1K?1F{c^L6gbSMQt$YsI#xcpF#v&#ZheP+1vsGemsV98sJgYQ`l#N`6C@ zhN@6B<9u>2C1HgTCM3Rz2CZKTG|nd)Bx=Rs!BFCT;!!OM=^J}rJ%nHQ6|Bf_P?4ZJ#wx^+i36amC4{+!dD9?pJ5B!bij=BnIK9G@?LlS%ivtJ4B>b3=63pmikq12vDbof&B>J@pyF zRws(Eo!Be4Okvs~gbAtlm6k3HRElq;vopULiOY2Wuh7k z|Ig&M)~&ov?0FMsN#KjobWW3iq9=Dyxf!97`pUVPG-rK>ho9KGvJ{AnM^kx#^+EHs zl86Z2wnE^}Dmtlgv|R;;Nh7`Ol&OZFp>z5ZIP1g5E{gJHHKL&fx)7yVY(%>ygjr12&52|5Ile?A0 z%%4U!G9Vly-wstc@058;`0xgldbvZwmDx<&&u1zj7&_)9R^FAdNX`LNG`!|`G&cFp z2)p*tj22>q&AqcU<%+`W@Na-0260%9f9*=)RXuPVDCm^Odr2} zky@hDZm8FuQ^dtkAD5E*LaoPXtSk@ueQW3&A?Nw@asS4dSKr5r)cGGTb-ZNO7@lO% zm_S#_XEY(MR4coxZ^m{B<62PcQYxi=3)fz9FVwq=W#6E!=SJdDGVmD>^5;@qoS{wx z$ovAjx0{ngFQOV7kdq}SrShIeOgLWACREfoRaNcmruPVG)RQ`CJ_&eMQ89!G3*rZF zLGdJ)kOeUc`(h}lsrn=mRN-bE+PA>k5~#fGx1S!Ua&HsnevE$meBS;klh}$Vplhuc zQ^&Wp6xN44i>CL%!(Z?Cje=#bC3>zKlK$XrN#QACq^3Cl+E_s?t@!m1(y6o+I z=c!wYJry&xFEX8T)^L!T<>j~R$!5vD)LaJ@kObbJeQm)<1GWfm^?MdP3)A5c&(t7P zqz)DrnQW`~n&~2VbJ!_a(Qi9elBv_)!=Pzrg-M`jJq~{nin^Q;33xfF#)SOE=xP(( z5KQ=cnPsm|R)9?9!Cxs4lE^4-mMK#qfHM$)`NjXDC&oLt+HYrl$y1@|4OOM=Ybj)j) z*7y8(d%5BKH@1D?`@)!e3qVqH6G}d zTc@GxxFv<=A0IFll+mtYzw}rZ9S9YqDSny^k>Y_~v}#0nq&yqzX%Tz4{}jt;B$ZRA z(S{<-cm6u(S)X!q?VmGbL+PElA{pHd~{5;p%3oEMX=rRRl$=Bn^EAMH7_9@ zl@N-=tpOi5WzUVrc-Z~QI;#qaQ-!~Xa>1=%o-&4MoZdDBbfQ9N?}}Zp_<`@~9+BXX z=eD6?KhKE)bBhVNn4D-dj=@0D?5kYSucsZ(T+aOc5sh;n{I*vFJ$K#u?bm>W%g4N$ zo428X0IXNT*EuHv*f&QY-P@)KUM!*S^NHe3?!-2FC({v+{02~j8tw+(3N0JAUo?_g znjgxfKFB{Y2Me8vC=KESLZyn`kWy<5Z|XWd>Z^Y_^j4|$S7=b463{W_0r09oDWeo} z=x-rRc8*b3HQ8jUFkw}bd{{`nb$9zS{py({tmL6+eiI|QUro`-szKD)n3o$Rc$6y5 zn@1wAxL#tbwXnskuoRg{V&Idfk@zRD=|Z}Aa}{qX{F(CSa|dnGq)A*a6ffho$i-8O zi+|e(nM-t6culs)-jcvfWfJ{%#h)#EBfXi6iS+sI7H`HHuT? znpG=I^B^$N&#_>q8k7t!ZdNB`E8U(-U3IEL9=YvK4f26w<>5154`G1_)9@%+*VdO; ztDXrWvc^U8Xe2hjsBFzjR=LN)6=M#FM*YpMhHV?}0}~-fN^4L-H(C%ynempJf6^pI z9D^`{0mybz8xL1SLOxEFFuRxsdA|D7=R^=O^gfEO1*s~1?Pw+}ZF@+zKUEL+E-M<{ zZhgj`pxsSV%+paaeA_wm)0@F+qgHGxkV6F@3V%|sHoqt=Z}E>1MJKa7+0fL1eM)(< zs;v%cVkm-Xxt5f^Fqb*&z!zlAOg)giBtr!`)}#@2?B7uKX;TOWvNGnbA~-L2dE1y8 zZ81F0Td(t_-stn^umdY5mU_Q~?H*7z@4G7b(kGjSZ6%IXI!$;{JxMSZy}IWV_ulL$?$j`FW~iJ!_-t+MKtT&SRUrZYOVQlwi%i^bxG7-qTxs zy~joG`I!4XwoHqVO{V2YvB%W<6uE0Sbd&a2o_T6_?)$|H=+g!X)(+$}?}qb?k3D&r z^R;F-Swnp{sUTJ?<$FVB;)01(_#?)(M>VJ|E7sQDl_&2i=Fyc}X@HPX$MTzF+3g#^ zYIK*UZR+#1j%nC`o>rs}yFbxYaoI?#NXZ6*rIKHyiRo=%*c5KusujLAtv6P0y7yi7 zQvDp*pQ(orO{{+UUK_c=%lJAo!`gB=5ctTBY0vKJw;!?m5ix`WF)~E{ksGH+I3Ct} z2(2pF=-V%yR7%xtv@dJWNCxGuW>vC4wV`LjA-!taHBYY%gob{dEl`Bxx3x0qf zWv#st5#KAM*ogub|7T`2Y`!hS7_x6NiF_bz{dKW(BSpu2MQjcBXytT;IdT$IG88g2 zs&BxCE-b!&ZYoX(PcZQSEjnCQf7%!)_<(HL2U6>r$;HMmYFX?UG|=dq@SuF=AGJ-8 z*qCy{Zt}rWWR)qF%66$|R^HRU;BL&d1AEblin&4amq3nYZsW%EDERs$LF)&{S4iCW zp+^?Uy`rt5G9_h?Q>GINEt+Rg5=nX{Vn?;Jn5;6Yt!|Sn>x-zsL1frz;g-7S!Z50A zj2)`4k_sGjiJ9YL%lvfxk7BkjBW`>49tg7V+f! zmIpugy89@v){2~_?{LcJJo1DYa#!ZOXu;#4YOO169+C8T%Y+0M0rIuvS(k0Bml_F0 zGi*sYy=n9vW(eO4zNZKB&!7n~7Vb%3be?K6FrLfHEst5sd%W7NXua1c8e0AXhRF$K zS|J7!f4~>Ijvi&}Oz(&T>|y?6>^s#J=$fo6GkaMY6;)y6$m!aYxFq%f2ePV3B}2VE zlo?8HL`CA{cQeE#mC;b0wpcdH6Gfr&`Vd=^;~Qs81YJnsb9dBMFbXwoq-zrUDl=0( z@pD|UOkVx!C^<@RV$)>Q@5qid5aGC3PD3bxy69dmE_cLNUxXpz7&YH(K1w}dhTw1t z{vZtGDhk98%R){4exSKB6iQq#I8I@DtAP|&VJx&aW$VX_4JUTSJu8;Z;@M3mFV41jz0IeVcw6y<56dvx?Xuu&(aC( zGGI7EJIWRqZ>Gm$8}kM~JQ$g%VODNlCjZh=kzx99NVc`c4jT1~7pH1AjW ze08tJ-^;?svkX|Y9-iM>FWZaga8&+tu-?imkyAzGf$s|{dh`eFE9*`j)*r!fVbr$o z_2XZE2kPT1q8r^?B37L`w_RW#FLaO@5OJDfY$TjT-(AKj5k|4oYMWR`ucNyv9?u4hVz3&dEW z^wNfLR+3uP-st}@f)%RAaA$94x{ZLGU_@NFZFp`vF|?z-Swdv~SRi6k+9iE5B*2)@ z?fx{E;})9!n#&Le+)ro$%az4a^4|tUR=~BoiO3FsaxV6@r5-1)HO1w(@s~uSASSIh zPk-_pc&PWUkD$iJwH!%TGc9L%vc|babAh`Ts!g3S7D(+ z(5@V_3r8JiY=9Ttz;_#409obM_yrkkEux&Cek?GJVkvVJ9V3vgq>>)g@s7Cr_)hry zgs{Kq1G8sUKjNxdMZjaGB;Y-6AZqI#zZp08NIrbp=3FQNoq4vH<~LZ8Z(vbd%clTY z{S+WaTu2|iFX*IgOT!M*TMo#YWCE>;rX}H+$XwUblDWp!O6+DL&ehd!RG?)yXsUh1O*w`NY>Y5=Ujy41v(k~eA zD`gJdMThJqEa+O^MfdfqvlnsknXt<1E6O>9h&fvqy9jBD9Q2IU-W&Uf1oGev%;`tyu0p*5`Cxy}i#Ru3HLP zuRnj@lYFP+wLH(D{^;bpZMD@K;>tD*D;j%A^g;j=AQ3eF?bn)N*dZu?g4)EXb8&4XJk{jUB@ks=N^*OFAM+4H2CDJ|9 zyZ8)Y+3*g=qB&lLR|;Ce21LI_0KW#WVH_W1fLT=Y^5sa?5q>P3uKAdWhm^%zk;IlRyZ3hS1x&vBqQ5l zjd5zFyZ?UxPk^w02m)3YLqUNXNRjEPq=#iii1k;4IbYLw8pI8zAg|&K=>J+OWfq&T z;W~5bGs)bfv`f>Ja+{#D2h_yU63VK8N|_SYfDgC=6FQUC${bP=>_TttD}^NiVvm3i zYm7DN6D1dCtXPp3achYgyXUfW-=Wg~utq zHe&m%y3W4#+IlhAP%$?dk8S>n=UlMTxNj)lSA&l9-ehWXH{2qHH@zLbkaFs=Bm&XB zpwNz@y+kO`5}$(TU9mT~q|-F+8r7eS{|ttUnSXmV8%FTG2md%25 zDTQ#p7%8;^Yo!#7rg@bry(KU9H?M=S+1wN4T6(vpUd^?AZ|`ty!e%!6(}N+&!u#eb z`R$q0K@~L&{p^gaJ|0ZyBi_m9)`R{`)HkZ~Azx7~4;S>ff%o)Avb`{_D=w04aZfB? z=$?DegkX`yn@npF2U~WIKYshZxQ%w#aXki#8HIV$hflbHpFlnry4{N%1BKdL8ZQsG zQe8Rs+7@xD^dJ%+! zniD1vK3H^We{Of4A7;f9ChGowFr%Hs;RJ_Sc%0iRwpDDxT}H!+_bLs{4fMGJyxrq{ zT}*>ReXVRw%@Ylhj4hMQQVkMKObrYS%u`b>Qw@@g($Y)~(hQ6@w==He1OT&?6asHf zc%0iRwpDCHI3ts(>E=krJDdP2egysF5odUu+bXtDY=S7Sk%E6gYF>CziC%tD`b3@e z%!YcV6YtqECsi3umSdD~&(6s#&d^KG&ri=uP0mkA)l1IL)lbXJNiF6I@OF>)bukSN z^|i81wzNnzOg1x3GdDH1NH$J0F|#mFHcPWGFt#+ZG)+m{+|H=L$W~mEl3Y+QiCJRv z5vC{1lR210c{1~gOA>Q(xDBmKsetya#xk705Xb!Y~j8 z&_1X5C0neqg+PQw6x6A>fD=Zw=XGI*Rb=K=r#dH_PZDR`Wfk}*%iFc5`z|B4$JKx%^!10sS7CB+ zUFXuA>e!agp{)@Aol6287!V8|{Oq#vEp}YZzvjwmxnc zt_oa{b~mn-Gvtwa3D)ZZBmbdyfhLi6IdFy6vYJQok@qu7cMaKMc#i>HA%nzN3<5?t9$mx5$p9>^a2Iqs8y5Jc9(;{KuLY<|DdeZ8+wC^{ zj-k|Cn@v~kac`rkC`q&?il*IO9R?k22XOSxm0UUhDt@$5O>7Q=JYy3n^oYjSwa|!# zLy&!9EVaR&T)}gN{d6D(4Q13dwp)YJN1!@btkETMYblN=i}BOY(gtDtI05fOdznp^ zzLy|@O@+?!IPRi@0zuf|Oob6cKa@#f#edkx~tY?=B?8lI={>G@0pi}3}$xEzo)tVaS)-Fz;KfkGTH}72=b6u&zl!_92 zUbg6LtMVFxrJb9$JM}!kpHIZ)d7)X{w)%Q*w}Bt-;c55`arS>a%;kBJE>zPgT>tYI z{_&EPYFApVJ-N?%VH%t3rUU94)^o%Gn(nqpktb`QURG8wDg~WcwuS0?Ujg6C5XTXk zc46AwYMiN@E6|PAc?FB*3>kt}RVwckm@BZLO=TDU>I_Td4(psK(v>JS);V5KND zRi#GN=-HAMLEe@F&So0gIIDVeBf~yWkVj1e82<{ClVq) z;S!h0#CJuvVcuOBBxf*TX*kB)V8A0TFCCCGE@P^7hQ$Jy2C3v>76mCxvvisW2H2K2 zz9K&RHx$jDsk;*JW}Mvy`A8v^ZdhF&IRQ3b`hSJY}JzZtku^Bo5(4 zK8Ps`IbE>#40{REOMjbFu-`IVgfC$jOo9;;-qXKf1V<8PDVq>vq(Ni@A-T*XgHe(U z9nXTL=R9QMtrsQ2k(CMNV+9$w!k7Y?5^w2xkO}TMJ?)3;U8%2D?;*inXgtA<4 z!Jgr$xS$1?lFD8LSTl1i(})n&=8_9C?JnRn=BkCzTQSW_tGR?R$b3OW*< z75;$-*~UG}&4JsfHCfQIQWS%LK7e`L8S&Q}|IxBXi#%H7Cs^cT(mC4X(I$^J`G2>` z!>?bmNB1F4U!Xaib~m)~4IXNE{#8)8kMxHggx~!KiF(d=(v9z=|6SiX>3u=d`8>z* zUOdF`ul(kVn$2fAjrXz#a?f8JWcME&@(e=z4;_QBeB3mSc5$?eqg^~=7k>dz%0YcoK?y(4uCKS1<+ZJ!oWY1 zg&K(sOu2@G76_o&&`Lywu*yGP^K6 z`yL-gx(0Zh70IyX(3$%c7s^VInXnidNMInYhDCjq7f4NLC4RoTo@3JTroIdd z5G1k?U>dq+-SkiDcx9GX85`bT-s$tb3uo4hi+Cg;sXheR53av|B!E-EwD#QFak3W! z$VVej_yQP*9LBgxc$|e(O>f&U3_VA`f<=004vsOP*?<5!EFW8grFD>G8-`&>{h`=G zEy<6m52~Nb&Jee5CtVVXak|FcI?ji9&E7efTO;$vG7UOu;l538q#8 zq=4U4B~nx1GNVJ%r^iYv1M|E6x5Z`}Z5NYwglspnU9^S?JXU|QM>1b*ck|^2{p%YS z8iW~5SS&)rD?*kJ+uc6;{(yi$f|Alekh_!IfBdr8yJRM`iOUj#3W5x&+Oz=#96pRj zj_1>IwdjJ=m&o_Gw+^}9M4vArkrM*#z}wkox!(N`PDoO-G8;p41hGmBZ!(e5%7>f# z7K3d36lhSdMjB^KdRehIRGW+`(i?`U6bF{q3a1uSiXPZ;Vuwk3M%Jg&o+mA7EXHt7 z;ccrmA-$h)h2w{NT!RBEDg1)xXYA6>U;r7@rr|)K;uhDXw@g0j74mJ6w+mVaU+t28 z7J@XUv_)IB{R&O4Z@e{t)pELvqSd5iiIK7-T^52XJhj!qO3e&Saeb+im*NNa+BT@6 zpbEDbcRyBt&(v=#Uw*v@r9~`qTFP9*tT9(IKWj>+y6e*;N`~dnFf_5#>~-%r%4yw_ zi6^J9i z-a`dDdO`<6hU>fN;YTZRvoCLgy?q+QKPu6PXgzqGGuAUu(8x|2D@)IN^WOE`Ns9o^R;Ny#+G{)>Z#8+d$nGRZ=UMXoBCpSrb)8koGA-8W zVk=!Y=Vf&#In1iF>@xX2UF5U#>}~Qt7tJ5wvwuw9$dh5(jLw#6zL?C)<^Mcu{;)Mq z8|ZfL*6tTulgVUj>qfFaE!WM~Rv0O-lQcQ4(q(p0R&SEivP$yhYLP9oqRERhc=_Pq z@WHe3B7c)551t$(WdYA#K0WwrQeW0hwyY<~L4)1Q%HlLXTUY6HktNg1hOX?;q<~0rTeYu1c&XXs3ktGL3lU1kbEK3g0v&91XOx_gbMbez7O){AA zrvq$WHFa{4H|OwlklYz1lkRG8A?0cEYKG6owF@}CKqX)%(J)IqFiNj1je^j3Ls5> zn0=pB6)iAKx|}v?UL=1fhu4m^7{O_u) zYkW9jfY8wJH3Hr?qsd{z+%_;aA$WLjT`oWl5bPg@UINx7&J2KlmNm3#O$=(-yY;(d zwMZLyxtt{X^LdUVri;ZTOg)*UMKT3!Sm%p5V$S0#%f2~$cr$sn$_o19uw0~7E|dGy zQ^2bAYE@P=A?UX#vbl$qo9;!GH%(R~Fu?~A5(wZCgYmn1RTgzw@jeV5r?aN4#z%(( zhH7zXJAH9+F*)VeO+BgBJCplxWNt{WuxoId=E)*2-qbW)1<-{5A3zd)a%XGnv*g=@ zBX|n?ltZtVI2#(QM!c$KlSMwAmGf)@$hGqZySNW+9+nryqDUs^csM6URAR1S;$??;A2apUK3bgWiwgx%k#$bfFnkKg9F*rz~w>lF|_m|T^>67w1L#2+Q}(Q7^dO?sBRdbO>4<5b7 z)s@ggQzFI2BSY&Es#@bbt8z&X08~J$zw1>t%TIIZ4`2js(xQY{6+HoPl=xw7?Q1={ za1+gmyaYPHEr95U3Ct>3Vzy!WJp0piW#i$QJ^#MXgyeJ|$>o$R0m18J*wC4Tm$>HiE$mM^1x#!%af&#?K*?e@7-O3-B!Nm^kMq+3 zbvc?`xnD$dVWOw`yVpv#c&2_61df20i}f5p(g8mAgHz_d0HpwJ?R%TzMGlYkuCNW| zHp#_#R`6c&ru&^bqKy?KiPbQ{U2Tvic9-C8R$0y`I@-_Ui&33nP9j|k$Y*F_F14(K*o*uf9*MG=6UM+^r(OzSC zp}li^*`;&5pNITt7CAO#$MHS9rbvGsA97tF(ZQX_ZVu!ivHOu;A04 z=eU;$cD%M5#BC+zJk`z&sT+LX(-m$cz}fYe7X5wE5yMY~@Cg>d+-K*<0hy9RdXm)F zMk&|U5zX_m1fZ2gX8Vud;>_sgL^3EGo;yD&;$V@zYZ78BT8m{$UY_yMFv`-xmZFO- zz^oavGXb^z6UI@eNOMypDhr?+MV3|!su?g7;csP_TVAJ8^ z#+d{3fxY2_1QJV&pS43>16yS?MBW*BU%DqBJbU{1;M>>jQ;cvo4ioVK_&w}#nl%?0 zpc!A_M7wc%0OqVh01r_vD)`3;4&w}PD6f~)9n2w<)!4k0CghWB(glR9W0E{8k}M@m zngN}tPuF;NX794ux(TG;ahM2pd2Kj`7w#08Ke%CwSs;^0|7Yup&a8Hn7s#eF4DmO1 zhws(}T-(qktj1Q{l;t8UFWk+vH#8-MM*xRh6mMXW^W;IaWpj{!%Hp-&3f))I>@`h_ z2c9zJ zBHb8Jk8uk6Ys#5`3&4(u2yfsuopW49Jh7V~6fDcPh+lA+aC!PU%rf3MI!Pe*HW|bA z0gBPbe?EBh7lLG7011F85hDS_4VZy~hypF^{sodObD<@{iG8d7!G>zd922qUEMfH7IBW%Y(!0eYTU z)}PZoq7MV{$Ht_(X&v(}wbMQdpsAGzjdepJUy;E!%Ec_pWMSJaEhTcHZ3^IpKxhvg z<8~=V<+X?hX(5-Bz7ZOp&gUST)GQzKpH`4`5#( z11=MB>yojoIKwf{vLa(at%w2OqB#K<9L*2)B< zyxt~?wA|szr|*xCXUqAAlhI8Y<>I_tWX3bNkMK|UD#@A|g9o)6FzB(;-(IAbkBmqw z=Ck~%*q+h}gx%|Wj=UzoVqO;84WS5rJFD^)Ems7z{Rc+}&z|CnM{;SKaQe~t5RS3T zv=CYYv(o0wIVka-cleGr1H=q{c>h{=aei5(OA!*Y0>_#o(VOQr|2@xE8T1cpDuqeY z;U@9uAZ5ShE26#x;JstCK*<|bj45#EJJY<_0qklLIN2x$s+ij|ySF*;Su86u#l%_Y z6igUxw}Vx`O&9A-?!5(E7%=nWz#ia?E39cyTJeD)Sj$b!glTFjgVL)S!{ ziM!a&h`|F|n9=l6`$M0@A0TdDj*>cGt{2c*1`C2c@C?=>pEa_S6wYEkI~MMUP>G%- zsbFtwyBYId3rc$SkZ41-UNv;bs16aSq)Ak8Kcz6IAm9tpJ&rZ9H)ystz+31pWrQk)TK28 z;6s1-VgKnv{g}^zp{_LLZ-EN07p!!rF;E2h=bBhCA?>PT=Dwg+3DPLyDQw^cl7|A% zz|cNK)WEJr#0DDy4YaOHx$RbfhnKc^Qs7o4NJgZHv0q5Hs(i`{=4;*MQH!t}P6cbd zldjEvy+$y=#4@;-=B7viu?25|!c#hsx!=H6^UT-H>1~?U%cIBR+dy(=B~cgIr-%yc zkwOsQZ8V27j=JVkyEEX-rVEyJTm8X8ZjYyVV^4Vacgw{wGUrH5kZ+N{V_3;`Xo`>2 z&b@DfEntiFCsHBgCcgiO)}N+vUN&#C%Q|_^1Y$`$Ee~ZXtDaZM1#!Mk2|{|;mjtI= z6|Zak2^f3|4S-Ierjrg0PVV*ahCue1evgtdjffJTQfB^~neXs9{npP#Ob8-L#3L)O z6*_A5quuBx6HgfN{w%i0FvLLAWQ*c1>--F9gzHtF^mI&SD(Ojdi(OJEmo?L$njtIV zYrPY$7=|%xIZUZuWpF3eCaN7*tT3r{$AW&De~TQ= zKUho0f1?~>-w=(HUqV>$_)1-#_}>Yg+1e&;D}sY->yP@UQ4M9daXS#52dH z72vpQnlHd>4F9%<4@R-!D!CgQMNf{?=J+HSM(^K5gXpa-`nQjI-t{7_ew7In=0dX7 zZ`NP3UjZqB>)P%ZXuD=PMJ{0Dr%1M&14+WJBbzJUhvjK=f!7jn81scN+9aVk<;P9x z7p zXKM`~_S$7`bgZmfTk_<0?on(74K^SdY_fID$>=|ChXTCr@=D438xcG8fu`^(W|d;v z0CVdSj3M_j621wxmUaH8>qVc+ugi^gInkjUR@?<(CYI?N;Y*nBlXWz1x=Ub-uEW~J zL<>kI+{}iwQ=ADZ(a!-_jbhkjIy@QKQV$QlJ$QP=fBfm?f&BH|%jZBu%7EA~1V~7D zLqBM$#g7k&d&;UMN`~Rm5EYQHi8MQ&6{!H~E=w9%mB1+$<;BJhyv`BM0DOT%F4OwW zaAZQ4*tG;2_>xu7gb%QrxwJ;*w`m1s>RIjfO!h0@kjC+!4!EcurCn6E%v#+WG}SsA z00qewa}nT00fBvOuV8K4fh2(h-bP%Q(#grm)?MX#ksrM`z;=VJPvA0L-5VTcM9%6O zSTv$1s*gD@>!ya!+S9qe^$9w!+})8*@6!d3tXZRR=$Y!0~&Z;(A@D<>s&=Y7PR|jLN-e;p46s})K+)+xZOx(*kmVb zW;>{)oy>RM)~C&C&U5D@^Rmvu3~fpXh07)fz+IN>c&R!q`|b6{23|6MtaBv*atC%4 zOu{6zJf*Io`TALkuUKyi{lWh+Z`AIXaVMUR?3TiKwkTC$YtjZww;6fN^pm?qc?R68 z5xgh#(|8TFX8_+PyVD=Uym-W$+3$25V#&ixMc`*q4a*rOY~l4CIpu2%{3L%&V!_b6OuQZevl6^L$Y#Dh&sNR(HhJmcWm%vD3GUK} zdJ%zGyh==y%|i^ZbG%UyS7&eNe4;)jXz6$k^j{!fWcX@oF`@)M+)^1u&w2psrwicx;V_H^~Hiw zH5&Q*7N!zMCdT^sHpC;Zhbeg@H`t!sV1_8Apvco_&w~c)08eH{7Z00?i8U3b6fX{w z9K>|DMB2f-z`i?cJYj?14Op9RA1D~*B%YHEKirnIxy;L?jXDP)blvGivRj}%48(Y} z=Q8#@!b@f#Y~qyA28|zNE(=Sgxo68&VNgFRG6d4+qQtJ+uu4F;i&8QqKmAmR@hyyD!X7A!G( zm%y$IO~0AU*UObRmLr!qN(e7;IqayZTBxv;mFn`v4>L*8v7PJ)i5ekg+vxcJp%MrD7LuskTC%p)EGCZh~{_x!ngjnrFS)2TcKft(@2=6+>xQ8AvS6*8P8 zy`gc)X!fV?X-UV3Egu3+RF0llNgG@YDMl7h;iwyjLOAmjMV+HB51Tj%eBL{jJX+Cx zOeoy7DJRbO8XM6U01$xIQSdVEc-jW@Z>sgI@t_{k`IO)v)JhQ@r!$8KB^ejuT*p84 z-%$nkVJ@z*ARMAA@u_?%>au@jRXLGP{`HGGaXr+#$-SiB+uWX8)%YRtxqD>$hwUmF zJd>fD-~Ez)aBF+|y1TI}Sp<9o#0LY%&}@-mcjgF!qwOC)I5;rwBJK*_=fG~Br^wBt zU$zZ<|JuW*r-+-s&8YD}yNdC|TdWuAgDKw^yU95FXHr}NX*>yMNNfuRb-|!c7iZbD zN|lfz6X*IwKe(UYCy|OP`#o!}(=UFCB4gCm8C{B1aAKE_Wxuk+=>)1&?sw#^zMC-wTGy}u!U ziEIRa3gJyfza;NXM$&GWA&qo?WKmP^6;l1Ga}vqu@VNv{aGz#GNX2fCA)0JwfN?oi z6N&xVqMV|c7^qA>%USvyDLYTfk*kN{)0(Rdqhn3r#~cnIW*H10Gs{BcPe|mb&d}^a z9m^OYM#SQJyCaZ{A4WZgyigRJSWdcstr~wAHibugG zaTkA-E>K}X1c1E`u%A|c7E3a|W|tCF+v!!5A1Hv@&4eI?Q*==(;6@P6ttZsD-=zE|4d4p0+>{Xj zpzz&u>mB?2oEtvkJ|E!U-+);3CiMBJm}`&J;tP5F>B>fZ>YO3rOnenVRw(Tec~tZ&vjm1-b~I)%}cQV;QK$2r3F@ViXq(Ocn^Fb z_V^VygKx0M$30-$pP|z*@UUkYzD15VyRypvh4(OU$LaJYIWRDr_zq1+Q#5L=7$a{{gC_)OBkb*YPj3&AyTqhANmkF&6(7sp zule1BU2OKJo@Rf2_VgwnhQB@oFr(`-8R*f29`W%H$)J2A4qnKya<{jo+db^|Mc-^P za)r|Kw0DzT0y&{b=cw)eUi$kS`#bEN=HtgU&!>2O9zA;T!#$Wtr?b6V(%Bc-+0n-* z_XRg&?0mXU$NeRtOO@7{q9?q{&Nvz%4dbKh297PIrJEKr-A&xL00 zF@h2WOMd)I7?ILuC8xCkaPdyJZonPUFEXY9x5PF-iH&Opr)HDdhx zRvNwTHu@IRFtu8J&WQGcTm9HG)C=JGs(EM@odWf@*4`NZUQ%x-KOUcSdV5)*U#FXb zdD34IV+;~u*S_(=`?39RiZj;iH6_Y3`!8N=$Z=`8Y8uiThAxl{efs|7F3J=4Pd=#6 z0xdawWeTWwE4Xlp10=nEZ~#Ulb1RS$CLy1(+ao#Ez=XDIwvx$WQEp%pqVlnv6=?0} z*>R?Sh=$@4PeK62HM=pyg5GI|_aWt~ck5 zaBUxiymu&C71^6#4`VlxQAZYcP4J*@Xcn9-+$`JvB9T{ztrb0)I%^FNHPMxZsJ9$T z#8Z=faSBH-sB=P@l?nL>N1(3E`%fF~!y*}++~xl6pCl)D<>~zs)W^2{+1v7Dkgt11OI6ey^=fI_ zqNB+2Jw1dx4I0|o5jz=ny>K%iB`3U2)Hw`J2xrOFhmfRp@@;OOf6N7#3Mp*1s6t3k zZh<|hG(5s`cA*Ge^-=KimOM_1wK|C?BNTd28uroj^z-Q@uP692a&z2pP9;^?nfE!b z)H6U*w>9Q0>e56B+W&K1HbI*buL9@dSIoH}+qUN_UPYaH2+99Kz07h{nQ-94nh;;hAWh4)q355-Fa|8{yxb=d-G;tVdsQFncJ zi}mvU6^o>lj1pAME!d%4)LwuwqS<0l)V(W_L9V|XP6NkU@)K%(!h;eX1;;f0{8np| zBN#@v>AE^5zw-D_4NqfFnAjB^SqA6P4;Pkq)`x43;*-dUnGD&XSsSJjKrCp2RHEl& zRG8aGnubL@Oq9i?1$XX}4qg(ZuYsFwP^~WJ9YE2u7);2*oDcL$j%m4YW~4V1WE3E_ z;b#s(A!HWWtp&zIQO>s%dD1iXM(Z6*?{$63^HR`RxA2uvDjad1EpjAd=HN+$4lNsu zm~MgUqr<_M!F5?YrRZ*!ELiL?+{*Q7E~j)>B?p~MLN>pb%<%5Uo`8O<%$59YOar6m zF_Z2lBmCT^j01JB2fO|xqfb0SL}zygqbL~ny6tWa;3R!>8Ch)yb~A z23fkfwwtrTU_3_Wb=xbmgE@P<6qu|O0kR}iJni66-hEIte z=PL(f8}hOA0E4~=ka;7%LUy9j;Tzwqa&%9wn|WTS9E2W29cC1^V1}W<|?iP0W96X(l-_qy62&Mk!J|iylH0fTCZEGQ zB+TB#m!C5G&2REKbcx;FgYG_kPk$c6#r~n|m|^dNbB2u=X2slrv%nubhI{Pz>B}F; zT6mY&iY`YWKQ@>52Djer-MR&5K-PY5@S_3eQ?`8e+tj=1rrzJ^qzDl0$uCY#wTb-x z+mcmXFBL*7chxY?$AD+%8&;Wk{v&8vI+pdOBCRpTFCeIxqF97fs;U`$CnX7HMYCX1 zM-OLY0T+34r&+EfqXoVkFquJN#wDuUZv2QGinz*BiP1z{SgzO&#lA5QeAy{H<#m7x zoI#BAU1Zs6II`d^?MWPbfv{2PVNJ9Mv>PR?Gttu0IGAK6&ni=p=&bQ0ovdI@?I8>s zCsD5!{k$%yfupsDQB0VN0&e>7v|nN6I7;@lQp-79Y2=^ol}%#NW{~mcb?54h@iJWD zG1EtWAIR`!Lh39tWTL_Ll3%6H8Zt>-xioRQ?;cK_9s8;6nERP}-DehtNl7x*VO*nA z67Oq2U=$1r1+N;F{1E8%MoxtTIe+pTMF3%V7$k6$k{}^pZ*Wl|m4AGqRD~JEbJ~Gy zdGpChBcD#*Fm2Kw%JK8kQDE2iWC5E}QNT{};bO6g5_pnx5AQ_Jmg(8#ER!GMTH~nN zk8rw5YL(58MEaT3NMMrfqGjwvsyaDN-%h>=3ry;88J~TLsuh89rU91QjpkKw1hV~6 zmzf=m7lUL-_%$Buo+1Zs9PLJkc5xya&Zm;;K?(lWkRnO~fEw|rFM+TN+edFfG}JKq zC78u7)VUZWKS{%|CiH~Urakv{C!2c`smNSv_4hZT%-(W;Z_4)0p|r2OKbmFxSWm~C z_+B8158A2Gr)WudLq1{X?>L)*z|jO%NjpP4>6x<-%-#2%GL}%81dE;SD>R^wLd*;w zpu%zma58mWj?0mfUTU5p1KaCiC#O3r>iZTgu24M-528Ns(^zJPd;q)ln{`1@*r)Ia zjyvQOgwbH0B;xMm#hUMp0^^MrYz+>sTpYeAr|+GIDu-cofIZ|S!MgGB=%b02v>|>4 zuy^jy5_9RDwDII))RWZz^{~5z9I_b-uS7}c2xb`ezc2gOo`B?hFjqs8`*HNTor=GA zZ)s>_g^O#{TnQ(Oe#*i6_myC|=}aSoDm#q~Y5!fFrMEhZ;gZ{uVfZryiQ=}w95`zX z@ee4sKIw%=I~o<;^L)TSOKkO<%{Tx^T$9g>*Mc!zYYwvA8^pIO);9x*&a!`)Iw4)4 zymNMr9P~6>l;lKJYNT$f_7Dz7vE-zmgCQy5x>RF>Sw*IhvH-avoyV&* z0M34idAWx4dvqgVska>|yR=Z?2eQK50XfvmmB&{leHX65Pux8i+-^Iw*lW#V&t_p8 z&r!NOWfQ&C_dNhcp6&E6VXwV}z5XTaZCXORPx4HbJ|E%VuDgwCe|mu;T*8eFwTSu= zxC|~04Hsn*?@~UN&pzWpKl==AivzJ9@TGJSlypp?bOR-lo4!A4 zWo#)jlpQhk<*BA)LJdetJh?k ztGfYRR7$5*hAApW!9o~LEHo^qL{H#4lHKo5$RKtmf#CwP#Y(1zw%5Z*xr3M@(XsC| zpCo@1{!q1)Ew*W%SJ|w=+LWh(9@<+i6xE4(@N;jKy>b!ns`nyMXOT)C5v+SO^ckB* znxS`Vt7RaHK;&f)Rw8K$GUAPW$_Y(J6zAHa{nm1B?bIJ3z!8TaSzSzjPD|CAx9D_q z-=k^t=adp-+w_9Q5PP!}e;7KeOw7F}NWn#Btp zL$pd5u;Kc`IWl61UiP$$obHASwxSk>x6V*Mf}5(dId3`g#ZrRL@gFMn5hw$vt@>~| zbvh&LX<6Dr9wNmI!nzi>${TgoU# za}r7sDPDP1r_w{7gXig6yu4wc73B1sHLg@=RTfl}){uhf4e{-kVZ)!mkrD~%fN$nO zsLG3nKy-4N)l^cz5p@Dl_`IBpHcThM2yL2!j*k~kSV}*t8TD10@?}x%oCnUxtM^lK zyN8p+AX&0YC{0(Url5*c8BeRgOU(JGmN0BznH zRMczD<%+^VIvAje_!i9hoZab)X07&HpD364>HEXK9UeXU;TRF*!%&DgFr8bUwEC8C z+)0;%vx`4)poiH4DP>x0sIS$_UG`dGuQbD6VTb*wA+{Ya?hUcmvBdV9Vt;`xHs+2e z67qayL}^&&mHUX_$*Mo_p3+v{8|)5T_;}1cbMdlH#n$Bgjjpy%^j(%a@7I-Y4NAzL zQNh(!LQSJ0tG!i3X>D5jtmg}5X&d_vkoIl5$mggUliX9Ps21lCIEnTNIac))7d8EB z-;~J+w(_)t}aUe;He`2s~`XV`agnUjS}>*N5b_)&6fWJmbwj8LQFv8S%0#E z4OtCZxess)XzGYI_uV4%^n-^+%S%Lj-#kGC!E} zZSd~X_qY`w2AIrh@NV!2vAd8u0N>ox5B>m`RIBB9*57VCyT>nk+7Q6{o6)O#_K7s+ zcb~pD0DKsD16#+!)?0D7mK?(`EV<D3G$wu;2s(i~n_uO=rT|kcp=0n0B^WYmGugq7) zM^~UUK&U6l8Yw6KDPggq_5$@Gvqie$7&w1JEgrCh+eh+EY93#9i_jaglS9%WnI^Gr z%2E~IY5<+*r&7vH^KWQ8lGrSbl@VwJD}t)avBvy^zz^4jbOL7P5^t3Q}j z*Wv;;KpO=y84$Kk$dqwcQJCa%y&%qjq3ZMts;IEl%i=>+R67wQCN6o!T9O?29L(j8 z1)joSvBme!RyP0Y^INxP^UvpBPCx&0@2lOt`Ska<=d-=j>GXE?`PbSy-tmR&VgCEs zS6_c|dpG;?>(k%w?tZoV)$dQ|r?*r1zxnR%^cFAGyh^Qhn)&ImlF*yAYXkOVxhznySBs-7`gm5dBl(#*_m^nZ^_18YM3blfh>+yFpY`OjliJ z*|L^OkmSIK-Y}fV1=F-5g<_5MDP3;lPN&X%Eq@F2M(3}5Z4s=K6MrZ51#lGN$Z;!> zNCtm`PC;l8sr2vO{QUpNRDZU_#UCxdx+PviS5#cRMy1uRqGjDGV$Rwc)|p>182i=5 z#V@qTXjV)v@;4Z6kf)QfI@`ftJBM6t_V|D7-F{i*@BYW$?-MCN>(YI9WVDTo>qLJH zD2;L*0&qyRYirlRSa~Zy+REEbp){9IyzSWLlTvA^N$&ODU}s%dG@VseEt2sC=}cA? zavg*3G9cx6h!*p|7lS`s<*9a5_U?)-q<1TLdGhJ;hGlBe$iC%iz4=xb_ZYm>6afs2 zPBiQB|b)-LrqZ;0b+C$4i5V=C;wN(MbDi>oM;hd9N4BKpNeYu>L3(?3HrG%c2 z67NuZiV-_Wx-8KkFKTg<$0x0M(_yBxz=V2J)n;?f|71XF1!eg#Yp!DH$O=`cK#)4- z1Zf!(L)|a)k~4LPn}V++TsU0`It6*wC(P`MY57Q;b_aH!P!i3JT$P&a_(1(yHAyQx zMO3u?9P_VNi?BNIO3~xjNHvyOpKU(k_BX(`%EyTNSBvzLgVJIq&ngH=n{f3pwSy#Mgw3ki?X6r`P5?roUm9QxZh%f2biYp3wj z*4LPl9a&@SUzxIroL0@aBv5754A0$sxBT97t6cXd5P8hX*w&xNq#8bzR0)z9@3eKS zw`+3F@cToe0|i~e2}H3t7e+uYH}VCwi=}lph&Q+$@JOzT0KwtLt#x{_Em&CbjT=FX z-bD9%%W_c!CkPD0tza3nTY(MkoLuA{+9&tgJVbwwIhR2rYOMwn%g!TS?!@Y|b%5&x zaRy2+wII;dsn=Z2KX&0cix1oT+q2tL8)ezj=XXy9%sh|Gi0!Vuruyi`!P9R$xv9Ge ziDCK9riZ}zXrkrboXk7ju7SR}u48KVbGoLUy(nj@sELL<+NDqg% zZA^@?CCbZ)8-Suv%!nY9-sxS2X1-3iAAhizq6&w?m$6HV4f+Y4IdJg?(NUmNJQkY{iFQ zoR=C4Lga~>GT9aoXD<`6=gLl7vp_0VUKEnc$9GnT-fE8OjJAZG*)l1;p<~6-H(OhW zsO`lRgqa5`0X*(dxZ+n)Oi5sMMj@AXTZ?CfPg%=1Qn1sB*C4oeO}ukX^SdDRbnWyC z+%$>irp{xIVXipKr*7p{0Yi>bw7L~6?9?tI06Lc?!J#;VLO|TS3D;chrO7aa;IbFq zM9miN+LuR<$G25Q@3qxKRq?meV@S?kc{~c92;3De;P!Zm!N|p|L`$9(n`$NAXmyOr z(>XwC*2GR?+KmK*EJ_d-BZo{=%!g#ftF^Bw&sGM$tivQhC^D|UJ7Hm+bTou;`9@3f zQfL(NZ6QFVF<9Dsf!!aB*Mnp@9vzqIoJ~=r2?)Zmi4_`ic#69{a%sr9UW!;F|B^8A} zuyXgcr66ODRB|=4tdA+2&?^HSu)EdE?Noj*c9Jvf&YZ}~RYv@7G$9IHR;iP!^maa> z83<$bpYN6nZgL_4b`FR6o@J9FYj$8k zhqLo+nZn&m-`{yx=hg-TRxds$T_`#af966F zTOVT@()iI|_KzNX_wd=betgXjAAkA$$;)pKp0=NU_w3pC(K9-aI4gz`xwEl`jcXXB z!P8TGpU=)JOf(#)fuNe=`NBtq1`|QvNFMw+ngN{`(&UUX*M?+cnE5BvwvC<8sht`e z*qt8fpcMdi*&igQoA*+lW;3$jXi_t}3v-Tt+^&P`w0sw4F=@f(I=HiOQ#T++&nA+7 zh?uYUH*jn&OGr~$7x_QeadK4rf}uq76e!tQAnj0I3t!gBm&tCc-J++qUh0T>6YJ%u zEt-44EHYG`VsYU744A^3$@%39wgvt`t#DP(umbzULV20RW&`(GUIc<1z7~xcyHqMn z_}7Q62N54l4}}Gk0(TaesU4VITw`le&2v}U70I9WEzj_LyLKF|F={U1uT1;zugJOc z@2_>{oaS$9KR8)C-)K#4BA0O|8IC0Fm3uKRv#w&(MU^+0Ql~Ng1(TNOiq$XLR5h{c zAg6>XuD;BxPV^I|$&EuxI#CGHR*xKEW++t}oZI7)*imAtzrPYk=Kwi*@WFexT6)l+ z3H8(>4qhPs+B>3`?7zBLNQ6g?F$JBlWOCB*u|}HcC9g>4QBQKVY}=54L};SB^dz!B zKM`-pkeqe3H%*dYrEh&$g!52u*&W4bQ##0 zl}qby%pLlVgn1z)4^}B4qt3GnTU8l~)$3v=$1ZKcQdXFbk8IrLTY)$M1VuO}qPNZ| zU?>r=)*+`L8Sr8U4pe$+pu-2w_~p}szcTZ~3BRh860LIZVaZ4;ud$$(8smg-gP+j-f^NP!qQD_Q@YDhHcMESs3yLV+;)lxMH{ zWzSAJLgBEtlL!bpGJq> zx8kdMadO8-b>gnJSq=y~=TKnqRQ;-3g9j#96Zck@fzRLZX6vE>)W|jXV>rWh5U$=* zt{~KkmGtDhHu{Z2MQDW&KKQr!yz@Svf9RqA`o%B10;KiNzXgm+{5Q@2t!Tb%ZFSb# zSa|SZtHnJ=K0201FqRecM2EU6B67vr=eTMBmn~UjrvQ<+A<-3w-BV5z_)L?S9kh2@ z+;Vw|HZ5EMQB^*^>7p*VbSQl+xRye6Zs@BvDd)3RJ-s7YR^>Xc$cXj_KpD?@^X zrs5k?Zp6_qx{kY*UL2u|1W0&wlGs3RsuNK9pK6N0V`5BU+Bn_H7TR z!5P)ak$s{5Lq?7^b)7B5=oCKa48;nT?hLpIAD+X5Zx5ax5%q>Y|Mc?Uh`^Phqc0pE zAa_)YDe{Q>NDAEkF#0Y$uc5F<&m`7#GFPP@n{8gM#!8Hu3jbz1GG4M0;x|;Ciqnq# zHjG*y2Syj{`x`P@x%1q86>*_)zJAjNv4l!=L?jDjVEakAr+&X*ucP?o(?Qum{g zs3gS-w^uLnrDXb_bnY?*2H#~dl52MDjVRuK*=U#UvWffcP|3C$yo0=}#Tq1-UfktZ zAB2)J4*fha+eQ{io6%8X06J8d5!@wqCwINTLsMhaJ+0G)ve1?zhEcm!rEb`Foa>vW z^CsieP3L_Wil$(-&;=b)(st<$3jCIHQw72TJwr!&joK#_34Y2ViBVR#rGc>CKDRYR zaD@_mfh#S7-=R6gQIL%;HZR_mZ^&t@Zm_hA7CmWA4GZNiEW-EiuVfCi@w_3n--lPv zgGj^~oDK>cQt?5v-8jJ}+G#=>^bU|H$PnwV=9soX!Y&-A4qSHeM~<0=A4(_S1ENib zP3Aj>hrz)UZ-Il+>|aZ=HQ1#ckQ4Kkj>@*o#c}uv`%w&9H;eg5tD>ayJ_=!oZU^Uu ziYHtx#d5}Lpxg^m{J+iT8R1v8W~MDkr$~^oHuyBBP;`;txt?ffqjWIpYuPRfDtb+x3X8m9Dr$G79pTWDsZs=6XqcuLccmDNb}GMti#L3v z0&?p`iWY2?;fa^fQ5@BAV`K&ibe*HTS?wFd*}&B0JyJ0l)#K(w^mvN=fMr)!J54WL zG-ppy)z+0bK?!HTRq+OivKJ`X>?hBk9UlC(XTfM!BbMbXs|NTXMWKRh=v27_;KU}A zW%_PFU)PlLX+YhoLdp~#nmgyH13B5o+}H(FxZe@4|7S%ueD?Iwh}$1sl*6OHJkwv8 z)na(`-HS($MgwFJD|d>gp;Qa!I6u#7bNY!k&~$jj1e1OT{<>-0hI%mCx%2(ymWB(j z3}bFMZLXa#N#%3YYAoj(BC}-? zX3u-iODmh`V`{Dp59>*~HM;4Yj`5qw?RaDGST_dcBhh0&TZbY9z1P2p-u0NQ__;G! zarD2wpkJnoM6Z2Db$W?El@s)JFVu6^$(uAmTs9_ZQN>a*PpdhHEg>MvYR(L!b9jEr zNT@mpL@VbnKUR7W;!Y!f@MveQ7pN=lPX8UM8;9y{geu3jMN^uWvvsJjg-}p+CGH-d zjNYB=7K!LNGaF(jwmY#^l<)lUy~S>j?~c0uTz8n{tUtwhe%Q4&&pp6;0d zwQH^DDu6{kA$)!Y{{A`5-?;-RWoY%iZmj!4A9W1~hu2H@hagHNAx?IQ$K(Z!hgZs|-iL_+cx$cob!~D$u3tAXLeXOXm2b zKau*BPI6zeq@lPuvp_7_xcZZV#W|cLa_6x0b~{U?Z0SUT&c8SL;%~bv*FuDzt;2TL zis=k>IZY$y_FA5N*fJ$L&cS^^znN*jf_kaPc^qor@ySp_ZA1vVL9fa%c4A(K#NZVRvjr?v9D?5_1hUF4g!`mSR2F0TQz1Zn*6FZYQOntpt0~*t>EI1Zn2u8G-wxh z?>wKwRqVEpABe$_f5g^8bpfpd*gBxaS5u{5Pk%WNmK8fRa(o@quE83u3^(tly zRcVJIp?>TP>eA_tEJYPN|CYhwy_Iu`EIe85sS^JD5Epl|L=Km*>l(cz^?ZVTp2~7( zf;j43RLt{8eJl#|;9t#Rs#-XVqh=*0&SjwCVLjRB+|l98O*p<)qtrB(?phKoq|?$N zOLhN|iCmuw6Lfq=wHxjQAHY$I2WsVLimqV+rP{R3m-|=vJTkmPy%+4`w<{qQc}4b> zw(9lnRrP0CSOqd(onRs`et?8FXLd5&dJ*)0a*%kTVHr`@`aZ@obg9gxTADO%A(=m^ zw@?tFZgmx$XxjaK#E~ZKf>aN}`%Dio<-#H|rjeDt0;V!gGEJlh@EQ-c%NiT|@LguX z_|Y?CRe*Z#()eYuZ*(9bM3xpeB>hY>_|E~_2S&!3ew=IKInAt|P-|x4MTh;p?gTCB zAk-w&=^mxiYfm_G2NHkyzTNk)e#M;G-yS>p*}#+)raKNTA{))y($Bl zp$4%NC5Y?7j6JsT2Kz0PUy=r&Y`<|%6JlsJv=@&8dl#8&YZSsk^bKQT0M1PDQ8l8J z-lf5$Ua5LU8sK1=*0`kUrus^qK%*eRX8eWtli`w%?O|+%lvR|4FIwYbgNJc-oe`;| zkaUkJkScTWiAo@1v5rY-+)F1mD-Q%nwkmF5!7WqDzQa}t%U-LN1nSsv?`f@pI-xZR&VyjirJsEXi7=co?n~FAA#+w@%EdMTjAx>oK1ZYDLb3&- zlU`$CN2o_fUQ<}o7{{h5d`n8I!zd;XZ+UzdT$DNC2-+0bUOZ15w0q66{B1}Oq70oi z=Ri&TNKU3Ewx#B@4Kc6W6L<$Z=v7EuCBvUDeI^bx1O45DmNn84);|bwY99})G-z51 zBMy0#^)wP#s7lm&l~e#4)^SfoP_arNwaE$&-MKu6rjBwmCpo#fD96*w1~21xDwqtN zRwKbuA)kNoe!E|`VVjdU?Js3M zV0Mz-)qWS;#*fb39i(A9G(q!w*S^SowQ&!$GeJFm&ewu3WMw_N2!3>4uU88^S=Gk8 zbdL7-oy|zY5^S8cDOyfL1x;KsvUBFhVvPqm<4lHW1|;tqJQDODV^ljbIRc#-U zTkpO;y>)9~2}D6c&)3U1_7ahUuqm7+rftztGV3;~L|VSiEX%MtoQ(Bdn%agGaXkZ~ z!kE-i?m^Q#nK^?Fn#7Ph*C=cpH|;LoYq$vAW9RQ=NCNe2Isb4H?rEgNe%<){!`3Fx zTzpGIkVXnFfezshE=Yn_zH@!n)nQ*tC#knbz}TQyv5=zns)NoTIxp0b9Y8%GQdzBi znq5}TK$zM^(k$qQZiPOYaE1H5vRe_fLW*nth|$7-!cRT~Wvhm<%X^x8Orsz3)08GOU`+LLygEhXj+sUnHBZYV}Q z;JkT4aAl%rRcA=iM_Kb$rYP%x?i=(!PMRq4Cy%l;{wzE76|t27eQ%_8VmQ8u;wpo} zA76>OUs0GBXK&^Ahb`S@O|$Y#yu7q++tCXcGYWXBFX138CGIJ!s-t}h2w-Ma9%cVvP%(OWK6Et*v-tOIeP)G7WpifxcqR@ zix!?|wx{=CX=_&cuYbLP-{&gS>tCFhR z0MYIjf0Qr!DhBs9IMgmN%jc)>zk7CgL`4eiYnYMbC)Ia8JHL`l&Nmf1715)ZU{fSB zn?(36J^0Y!6aZa7qQB*>aEe<(-=2LR4S)}{`_B?274SbuGT?tW0G8Z}aP9ENqCD$! z;ipdIf!+YgOR|dqqfG;IYQgt$R1|z0B^`40wb9#H^Lt+w<*LqW-q25_EAhPmA|*8^ zj+N)%sylj>c|ol|XPy@1^%)k~-!Ri) zqR3K^G#FFO#5U*<-?C}=CVxWxUg0J&R6jLf#bXc+66b?ZRzVL!Gtok93}E_kBRLtr zy_t;1;ynQHeNJ^Uh_4Zk0%Rlo`X<)&9GfCWqPgW<^&4lPX`aM!z4bvVma*{Qb^r;4UE9q76kRqQ-x!~xY7UrDtA=3Roj5~bX z7PY9-Ck|7a%p?3uj3vY-`obADE3|LT&hzYT*6slr)T~7%wFl*4DGLuKqr{mGb(Z4D zud3Q4WK!bgPsyj1{1CXp-So1vxj5`A0VcXbX9eFh&}Wg!;eb~ZvOh1ENU(WxLw$O0 z%_el_b>ZGyXim4i*o<)y6J-&N7KlF>-3A@ifI6I;3Gd-fJa%Z55z;l~YFrj$VkV*G zA^bL0%-1I`nBNS|r`Q}-hbTK1b7~8q6{5kWLpW|4$`VaZS4mXv zoywO+6hdGoQHY_#Id(X&F2{h128C2hXz4v2#Rt`)^*eVK-z^to{1Hy$bJ-b6CW+Z9 zW#2;ki{vhHo^+{DCse`MJwp(QW0l4=bDk^hA%`B)s;ABxGtNPtM3L${f zU5Mu0+Irb4>J;AfhXS+KmTu`>Bmqko;YCY{b&5jrd?Usm7m$9XOHpLgP`-UvU5osR z4j%e6q5PzOC9Gz5dTt4O7f-0)ZhFaM#7_S61!srGBEa>gdqp!yMvZwiclG8Kf7hHYc@H=+Ay_yV&M) zSEGpiQV?@$Dcp_P^h;8cSdtp?#SwL-Z(+8o&pzW##sgGqAdIMFzt;+vf!!84pHTg? z&st^}fZ{(WXASg9gR!7kfA*QdhXxa7&MacAQ3B!VUs+sd5EdT8L?m@A9Yf%Mfd-Ij z>vvm0a3DUk0OEXWE6G<{PB7X1{oZ8vtJ|=ryE}VdY>6{ff6Lvt<*f<+zuh454_f07 z1om97S-~yV4WGEAH9@u7^vocn8*BBZq#j_7LW4{w=;iZToD%SSMd`r>O^Dd^n8$xN z2xm6+oz%kpEiBC?hMS)irKRGv0Rqi%oIQXDg(`RIkyq~St;8g#H=YK_Vy2&f4)q#M zg4AO-o7PgQ#!KA=L@A6PYy3sK6q-n>dMxf`@Xqw~nY;uu7~X1mm8s zmvncfbE3zdokE692zcBH#~wR}Row@T?hE`ln?TY`JPKS$I(A)EJKw(c}&I91fyUkV_9e+}XN|SKa-s z{&jBM-Qm|gko6iW62WDde>U}iSEBXUN|I%>PIkY%b<2o~&WLjUQ8c60_Rvq` z^#=at8tWx1uM8e9o;L>dg0=5n1x~tVF{;}HStw9y9Hx63O+9w) zQR~6NoG9W%*|g(25CMOg&*uv>W?MLPfH3-B$;!yzg9Rsc-!LZ%`%ssMsJv?~X&X9Qbvk)p|^r+8INSX zDVs)Y$`bm=JfNr6x6wKzL)2ivZjqEmn=g%3RW{`eu3K-@Ce@B4fIjE)XdJhMdVlC( zWEZVZOTsr!2!{^ETyQFcB61^!$r(D^!p#e-RZW@f=ox1*&y{NR!w_Qvk_CoRmm99P2pi3Jk6A$3GElqCl5plzI~!Wk$6=&XT)y6H+Ji*FAaQy3tG}Q9ta? z7Bo2V{V#dU_vg$BT;4&nC443O z%2A2ZmAhwpgAO>ZaWJk2C%8=b3!B3aD^h4Ka7U4*I4l*R87hxjJ}I8}ovksNtCG8{ zsv`Wrow}zFPDHP7<9XLN)2NYUa6a!}!-U3wgTZN$_+&{jc74_v#sV7N!2v~Qik?JK zX%U=F#RJweLBc_*(_8i~XIH}@_%)mxg5aU&$8ois7QXZIG2pT#GWo z#0_0{XSYc>J@6Z_N%g0(d+&(jb+Iz&S*O7ps=7w5&cNF78rPfCd5;gHD>Y0(xS~-c zgM_`FrEAeu^x#`m0fA!*2DlQH%gn?jxCEQm+On=j_TkjfYi>?_Y35x8zOl!oV?%`w z4E00$CS#{BPO%1uJQFJ=)_oyz4ty*ffitpFG{OsFz%kx}(~NGsCwZ}cCw9;fG;!CJ zLA7~NY0~@sdGSM{Y?q}=c)Z!0^o%NOiypLhp*+!sh5P8M?OJQa*ra8;z6LUvP)(XD z%c5(79D(!cP8hVu^1zV9BY-0WgHj@s@0pdKd&oH)jkF`JcgUP;oW`tN<$=}k%k*oA z+uEF6;za%80pIz#ROGc`xTGglPHQ!yqlF#^ObRqOR9wL6L}^scHUI!9 z_#yc?Aug`f*>kW>;mdI~p)KtM7%(iKjz|5C=RKxW>5_WF_h=PPE)cEp*Sy5Kh(clc z*_LReI2zII50RY0Vj1a$-h+{04DsTGq=WJO zUSK2vAH_ajR_^F*YZQ~@O_N}J){a?G0Y__iRvlM^d3jMR%9M9}k=9LcyD)v%;h&%4 zRbSRQVHBOBS`Psgjc@o8r42TSj`wcu0^_nfVSgFT(-me{bL41el6r_VFOw!;-txFl zm^WFzVI&4pw>$ZKvdc*-(ZfuleZ_z0khQkZRs1f{0|}`o6;KGLkMmxI$b(y>s3S@n zie=}W3$Oa_K84+B1sgP&oHgozJcJhc^xbl?2Y;bMdc#ku5}wgSD^7EY%@E$C-bF7v zP5MkpWgNB2i-^<_2ZW@8u&BHlNpEDnYKS>r~vIh zpW=)1ALw=&4xczCsl-J<7>^N)#sUjEEK(fapc6hJIJs{WZs7|8U))Q8XcXEbaZ`Nf zrB$vtSx2bDXyR*=1oJ%tpw7&G+_+FI@c~9F?otD3$t%^Tv^%xlx3+#t9x*~D$xq24 z+!L!6X*&Ov-Auk`I|qCc>X+tAcmdD0ej3|9_hRJ72;+#mUwpNfbpHL6z4jzf`-YL8%F$Uuiel^vCPWFdReI31%oV4xn89c8s?5dL!fF4@VN*^d00B^-JZe02G~72hZyn;<7PUt)MPVjMOU zVFT$s;{2822233+hrzN$6@oN$GptFmM|px%Iw5r=lk?SrpEK{27nl4I>hMZT-pz*+ zU~p@4>((BKeDuecs19d_o0-Gpe0|2Wj}kiR6^fITt(JY&-uHID_)<;^T1`sg2Z&Ay z%euhpx6&i0zIwz=WYM{T0roX4in1YF8&Z2Nv2d{_9aADj7^>$<3Ew#^n2HEuLRE!v zxTUE-RYLAfzMk9`+eEl^WLI!pNy5eoL1xN_`_=56{v5%x$3W`8IeeJhp6v15m^f0G zd|-R$C5$|MG2xp7OUPuz%)cHwJ|EUrm#57H-tN4fj3!$jT@w1FU3W=`R zwCthYIQvA5nDwzqo#l<=A|siL#8J}7mW#JS$zUJg`dqSA3}r(G=au{UBs)uIm&$WQ z+@0Sozgz{M1j7s87pGLDlrn<&?GqvB0?ZeXHdy8k(KsMNuZPs6hBnA~P0q^lY>`a> zI6JEy1qz-UyC7ttz;^!&GZ+`?3aD=*F=O-!s5I(Ep{qG_89Ws3h^k+)uIzvO2U$@~ z#AY7~#s)P$(?_I5LC%GGB-e74nCBn`%=9ks0HfQ5Op=D#5xV&S#Eo817zWCCPxJ}7 z9uZ4CP|s?yc2txG9utSI5Ed+TDy-Sbfmvw|yah>Ov0xc_XI)o26i8tnCh8U34taJB zBWAvPH%0gJgXhm5KiU8G@ZMm25JubKDlFL`dGb(SKXI>N%LmD1CosP;qZ@Q+O85e} z0x497-PIdYBbrcp^QOz_g$c?wZx8QC`!ODXDlPrCMpU)Ra7luIg z53HoM5D-let4Z|qQ`~@}dqA{Cu2%<U0-)-FAXe^?xM+C#jv1~NsBn?chs@Dx;n1)S8Mav)yX_JTrA<(G;+c2FFe%>H znT>ocOg05a$!~E9odIIDkKx??D9%wby%f#TcD>%lqYOxAh2(8I6v_)Qlq3SkcZjp+ zwiHRi!tIz`yuCCehF+qk9(KN0VAFvq%JmuY&m}3D=D2977%t9Jp~(6q`HR{EV8Wl=L5!mB$ZhFX6@c`OUb0LA_;2kb{L{CTxh3|dd5PKNi)X1X_uhF9Ke)WP^WxS}W$R0FHCu|jC{=R*Vl`kuqTT zMu)i_iHz}o@%DTwc^IDWAANVP%jG$n1QxTPzkYU8IoGa-V9RhTGGM4Xrq*H%F|?%= z7*N9--a!EmH9wE(^v%aUD{>Vq5hrNgfxma`cFCGqF`>WBs=$eLzZV-kYmo!Vw<}0R z-)54$EKnDdYfKJr2is}WYMP2q!1iputrU(A&&gfUz1=?v7F|m+umPL;gnp3$w>EED zdzZ0`{~M!Wxqs^nfVF9Oocr*N<-uo`4FSTNLxq!VHt+TSDn03j@8)(kF~-f-xm|*j zc{wFEKdIZz!I-&uetVt_W94MNC1RqLTv`gzVVHOGF_WJ^cN>k>xk5=BYKvV6YD@3(4fcHP#`&6u+J z>cM*)jFp?WoLa61q+&jbcmV(}`b=c!K!CRrc$}3|T}YEr80OvoJ~wOV%*^c2gmkzG z5f~-rhb}T%8@dX!a<--!n_Dx%m1&d4q%KSkVj39PS_NH*ryNE>B6MLF;YFljR#5aq zBd?`ER3zz2r*Ue0MdHwwvc33*#z999VY|;cG6k1QP44NBmqeh;GNDH ztgFQ$zUy(VB`Nyyfg;1fJURwXrMWVwX5rKZTQJF z7JEHeOI`nRO|7$uxgDAt41hDL9Nop^nMdgdp96>tdtaqHQaXUCBl$=Nzwqyli4`yKQ8nll!8cNM<0iGGr;LDQ=^7@5TOx{m^5pwH{y>ZLA5BoVq%6S}~ z*$w3Sx04FOEX>LP4a#6%8UC$?JF@W2G}tBq6rMuWzTiF0u&D=RBxq~;VrSTWH> zscA8>oB20-GAY1>$}&^SGgD$>Vf@78Sk29LXMT^pl<3T1N6s8s@Cl;i} zCubxU6(dA*@{_Y;Vkdv!x@hydZ7xic7d(-eEVXmfEYVR1xMT`pExpU zbJkHgrp#1Pc<_O!Nl?lN;32F5_5oVv^aNWv+()5 zi~?Nnut>})1?f<@xPfu=gG$S2@fooC$D<^Z1Vgkew&_3Gs?p(Db33)1la=P zr=%8?WB@JAdzQqc2NOgMYN)&5Ix6!Lb2F2HdW>G$F>S7UUB$SW?QJEaF+8?%G82*F zBrP)stQ+i41rL9JZ-@-gl+?*@-&t%neP5`z{f8ps2MGYk_T|LsFoIZkoMloyXcR#d z<}{i>{KG^ONW|w}v3HQ$5J?OnD4yYp7?WJg<>#^iU|G`77?_t(Z<=^yF$_|GxOf}eee7B-TKya=WEl3oW%DBuf}Zr zIq5W~M{=W+6Ful=hg+8!1X8$5;BkDI?Q2hD)92IUg`_FLtPrJ`@0$2K`wX9Mbl~RH z(dv(>j@YRPqBPi^NRMZxv+0pcAu&6enJXkgktJ9WY8hmOQNaZ(X)2#_v1)?8IVH?Y z-`Hmx%q2yKr7jD$V&LcL_TC18kYG^Hvaoqq1gYJc&^{rCR$T~NbjUk@(f(f zrD6mhr5Rl)GBA}NFf$y-T6mnB{+Q+BLzWGz94BvbR1xLka?Ht5hz|2~4Ug6E z@DK5Jjf~Zt{LoQWHaa;mPa!!!uOu-uPazsAr2$r`sX2M0qu69UCoVP5G=-9kRE50M z;*!)9m^ollPqSDdu_#rcv^X_oa;B4s0MHna(&W;jqSU++h3Lt9og_FQYIQUxUv-k# zEzc~;0IEvQ$xlkeaFjw~UW!5@(6RYIQ;LAv)t&Vej4hH4Of3w|jV;Yh42(_E43bh4 z6H`r%Q&W>Ifo#*s3NGGeP>WHG1(U@PQ_C}f#wI40C_q($Y>A${#KnRarmR>~kBe*a z1DB;T(J*IZmJ}-#mnM~Erj{2gB$bu`bxvO6s>couqRF>hCv7fuQ+f>m*R^`4B%3Cv`~*$|O!xC#_xD^l_*VScyqfCw54jgm$~wYwy^ebRX{S z+KojcC~!bRDpLOnkZ2`D#i>$NX-~Y15P9`MlN3`L2@*kg7a?)z4KceLr|ppgm)V(r zzyI-l|35RgTzP%E@)EO~2^gN;oh~C547%w4LS#d2MZn>Jzc!vVaH7sZZLf`e!NB;K z$9Ps8tTjHENVtqGub;12M^SUmdgIQi<|@mD9^lR?w-J8pJr6u}(JRHWL_>m-%1c<* zk$|<7N|IPZVUcKAB=b5cV5H=9qR1LjWU&}PLl`4HixFFP!B;(^Kjd?w<(sGpaT0ou87?&>I zbs8%lo~&r{dQo>M7VPbFIOujDc4#1E?}CHDeoFY`FFRiR-#A)H9$;uY*%n@m^J*q9 zJwe?yRJI|@W|}zPsubH1tL2j^MUr?~pl0w*w!si=3jG&(>{_Te0h7P?UJ>xp?DMeg zO2b2}q6%0w`mXF_pbhFPb9@HF`&YGQL|F}uM39OLL^Jbv_w3qL4kIZ7hTkVU7(aNX zLUcVc)lsjZdj)eo6T&5oGgAi{XgKGBKc@W@*Eq8SI>+2_Wacyat%Du2d$+R%Ud&_8 z5i?b~kMjfJY)ryE)p3} zBskwHGSQA`K*U=Aa=gk*+C&1-P7jQK^(SO*@Gx`3=NEV^QO*Uz(~|J9JeE_K^Bq;> zv|vst!J=S~U*wtI9%z~)>scLZI=nIWG7N8Q1pj;#F1VeIMAortHn_m6ginf?cG3iL z33z9|6)w*ohT(+?m>zY((!&1A0>Q_j`DW9@Y)-{#GH&sLp_{E$ERpGO5gnc`Jr0Yd zQM(UWEao`4T-pp==`lE2>U6SHv7Cs_E>r0K8cRNOpK`D95Gl@>*4V7t8R9rH#Exm$|#x_ep!C9nU*~g9JE-C24h_Z zx}%hrc{&h{g+qrZ$G?Ak1x~EAxqMattsPmHfS+uEt1Hd5)`Q^R8Q2rpXH8BR{#jY9 zV~^ruTq9Ca5$RmuqM7Z7pFY{(OGyIV8}I%+z_`sPr*F8YH?o>98a9son&|l#808|D z@7oB8H+Y=gJb8Q@)tSHN+{*1Uc6>Zbjt|9>Z097{jvd=^9LGm|2pS?wik>`(;2*#0>7?g?`NUV7rrk>%c|URn}$LEATs6r-btlXXT;- zau((0*n0<@{j4CcZa1zK70 z8v7*4yT)c48XB_pFiwdVERtvyd^W4WP*#RpST8Sf@O2oMl_{hSFq{V~q}JB8VL^oe z%E`4U88*3PH9zEW^NdTB8&(2&uJD&3RscNwAnU>sk4e_l%mEp7FVFY7StsvetxkRb zvz}hg!$Lb&^yEpHal82;+JJGnu!kMeAoTD<3cYor=wq=YFwTC?(<^t~%!`r?&e1wC z*kdYjPc=BO*Ud5_tF&!kI5%wstVv>+U4>H+CnEv516r6h25iPEjEfVUK2hX&5AGFs zpBLN7J5zJ49oA7`>>%sry#uUA(r=Q#0h$;}ZIY|JRC3`##?AG5%8U~4HR2)8CH0jV zR}?KVmQ$J=*`d*-dg!NaH{T1$7EQ|-k&z8?{oI;f#?{M8*eAHlj6t<461Py1TY6a5 zWl>e*XeI?Xyzh`TXoma(LF) zp|r}74Gp&$>g0yAbK&Lr+0*FD%X2V1-<$IQbaK~RKRkC@{*gR34`({;{k*5gg{$Dn z_4))xqWW}!FY=xa2e~>=0$}I-A3}5M0`nAy6_c-Ct0MOjxawuVOA$9AAPN}R{hNHZNu2SpI&RXO5J_q%rHkESFpjis~w zwllNB_yenpZVKw=%O!mzZrR<+i+@?w2F0|2t+1?AM~aEPQaBz)FxI7tbHB}a~y&u)tb85vtd?&b;T2>p>W6*)N*g8|^KqY2x` z^!nH7OEW6lD$`;b4%#aBs==AOQh5x`Wf-Qis$NC2UPnkD)*AJNv`Upm zjmA7`$KqJWy4{6X05yto!qpA$;7GbySF5dBL&ePUPSs@AL8c>m8K*{Cz76I|U1T?? z)}@hqUAWlBbgNj-ZCIkuXmQvR$~UPJ>fET2dD!YH3|);`581swGSv~bXlPQDFha}q z95@qAK2<3M}hUL3v?7CbSTyl)WrwcaE@5 zeG4vDJ)){b?Vw>C5mYgPz)_SfEF@nZeUz$Kv^E8c$$+y_#|AIe8TIYBSoMciRjr*( zIyj0p=8dCX)fuWcsgBgyJQhhcBQaDp{g@S_33CP9z#Bu1;g#7KQ`E+g>OJD1-$JroK~-vX0pVriV?)JLy+OS_7`tJBdn zwu5#LC+SjK8eAJTk;mh+t7BOP z^5?cXQiQx?lx9KCF5I?l+qP}nwr$(C?e1yYwr%&cyQi&h<~i?q*TGuf`E&osl~iS? zstyi$eKX^*gNz>x5UYdt<1r+REK zCg;?01f6J&^1&thZjJKdPPba`QN^sy7-RxW+A| z)PlbpG7z#Q@r!u^DcNkirKBFI)jF8W*`s|5By*@**Sf60&&a`(tdB;sJbO{$gNFH; z!OrnPIw=skZfl_`qSHW?AzxYT&mUy2hYq}I*)wlTQ&nwU<)d|x>{idBu}+!#SlRkS zGU@2cmeGb!%j?<|nu5q4UPpo>=xw^i_9Y#RXn9b(y*C6X8h3iJNv1s|d&82vXZYib z%ZmVZ<5E6)D>W^vEhY6P)ki_UgmQ6rr|mjR4+ zM0v4qk>RjF{CkWi&E9V4Z1O=QqYVS1_-P43vv1S+Y4YytTN=F`RJi*7XNRt-m^w!_ z>3Z=`(=MCD+#lN~MFzyQ20n?vJG-RD1F4rlA#4xaw=X~%yj-}#-_v&n^U!EF(sB65 z>xB}n6Q{hRP}ksqLE!WPD2ce!98qr7H$bp4*wIO2h-b#$Ha~l#8RMnI| zEa})zuOJ`$e_~Dbr%f-%wCAAKu=Q*R%3+%Izb;7%b)SM}li}w!hz~0rzZS|BMeZ|LljEFI<}& z96Fyo54TtCuUBYLncQ^w)QnAxw$}F@L-R9)z*A*NcuDEWaLYTxh491Zv7D?!|WtK(=@JOba=RFL+prsMRqBWeCCZ@ za0>&+Y=h^zJ{mc{DH)eS$?*`HXWWhx0mUC``5s64#CC-m1VoW-kLF=Y1LT=7CJ@y7 zorRmavO?<>4sT&^`C$5DXK7oMCsW!$T3Cj$WyfVQ|1S{)6 zMVo{OkPkzg_@z%yd<4=o(Ts~q%7ZNDAofGKO$Ggn<8)Pz2q)Gr%;GSaB{?7>50mu5 zO-8x+oSM8Vj!aLy?lHYM+WQYx%5>-^Klxz}uL1_St0F+9??iwC26zGsj&z4$dVj>* z5(nlya2rmxRBO~0tldE>Jq`)M0kk3`p!4S|Uh{w~p}Ij?`0=-inik zPYT*6dV=ut5|JRdsCoSH@kK^7i8DfG40I zB3_B4b0g0Td~L@NtEUHeajso8?RDZeW-2|@@hLw1=Cwo_^D*T*UaSy%m; zO&4)UsB{FRy6DJ}*D8}Z73E2j$m@ALjVIiHx1OVO492cw${yE4A(mE^Q2Ic;zd3lv zcDI2Vh9JTHf|N+BkGrT3gzam;2A-k(LC4#Hd%qZ6o)jsx0}^D;q%e%<$FlHoweI6M zZ#+5uaN}jm%5r;e-80v6_Y1i-A+^r~`IbZ-sq2Eqf@%|QPB`h7 ze2l> z{j6A%12O%AH>&M%QG$e>*V(EEx9;urIC_s=Tx;Rt*9a-W7xC07f@( ziH%5&BGUqaDS(pMRriF1^7cMXGEIAm5ET6ebC8o#_beXEQ=HFPK(v$RUTJ-D=iat{ zCBvr1hQiXOj;5+JZg=aqMM!spD_zGcv9TVAxxogQF!a_CluKxU9)AIyz>BoRb2jGE z-y zMGASh@h)Uh7jGf+F`z%S!=pkr>gBd~naBB4q_rfb!Zi0v)CG(S5Bt*GG+@FlOjYxk z!QG(vNS)mVBD{Kq30BnecSETW$4SGLjqW~Qri{U1m8-O|23)~8KAwxsMI|I5LEZjz z_(T#9kF0mw_uZU|%hTT64;S0b#ncXSkJyNkJ??a#x1iAdr9BqJQ*NWlxb)uue#jBm zr6-<(bMsInK*>4zKvlM9;E0*Ny8?B-o~zvk1~*4KbgRkYe4eJHo&IWlg2Ua5b2M-$NXr`jl9AO`R;3P{>x(4gEv2kyw?6|4h} z_@8CH=h00K!;V;THOI3jn-$k40-L+{y&bm4!H-{Vc>PWhwbTKDNfoxOgv z_~CftV5+=6L?3?TGPLh^p}2vWCcczro5+!uDKJi~V7aM!6gF7G1FYYI7Nga{jkR)UZP zmZ?B!(`_7#3}a8>wu`CQHJ^DmWZ(pV)k5-r$?OK9zI<`b>b!kYK;3vb6 zf}oy%f?1Dy;2$I(T6~loZDpxkw2m;3L3V|SAxZ=BvO@C4YvQd=Goz;sdS#!$pxMx~ zCtBl~$}*&J@1NFG|e8Jm_dQ^NX^*6%1=S5L)p`7Gz{625vgm#W>t48SUu)z z1Q@li{O0cgfW?)Qm2Ghi0j`oBK-)qjT{H$*OwHb-amU1`9tstLslsDGbKq;OF>n*S-msh_obes zz;0k6BPLw&^QXfkCGfLPMsUUNk!bm5uMgt-{>Kxs>cw70wB>uK(qi0RLb&a{FC%PM zVl;bQZbx zyIaNugKE|!jM~hk@GAD86tY0CcMA7$FnBwP%g_|fDz{qqWc=PZChbFiO6c+P)~ry~ zn0k$_j88ILoILFZ8Mxp$6{&$UNKuKQ>Mh;DWo9KedAz|Gm8_i-O73nen?ut#w+C<>I{Ac6qyRc6gX&(<3Y^HnhMw zytGHJrd&wEs9VU>L?SGRTczXcGyw-5cb+u8z5KbDH1Xl)V-`C*AwQefZCu`M!J@!9 zjnytp{-4E*e$DVV0#9Q+k+IV}A08Yksi~<&$Vt*tOl0`j zX7ZMUWng9(aB8}EejQID?M_6eg*%F%m!hQ~qnFB=X(4jI2^L_Wr@$++WRxeQSdEO7a&NemauwekFQ?ANbY`p9p_u37D3r3kEm74@EX6%IrkR_W zQ=yQQmCLPa)wXHc*J2Q>yU6)DxzVHx3H>qIbEQkZtw}WojwX@O>zj=LJx^$!nOpN@ za1{OTrMGF_9nXaZfZx+$x&R5V^T+{|1Ze%ast4Jr0%>T;PxjS;gr%#MrR|Xk?gZ2{cqw=dQjYVvj&8H9-E)5g-bRSwQ(6KnbMs zn-1mP#`5|AIzYw0vQZiRwXW>u)@U7@oUi)&-0`2MCr4J-+L@WMG_PG_T!h#l^#=~n zxX_*vYW2n>aYWzV0Ch&FD0%{@7948^jP@)jTY1`Wgnhev#WD%r?jrs45WqlP)snG? zM%6f;8dXGlw@4p<0VnFDaCZzT0Fz*Jqp^D%5pr#43fhDr6H#kdxp#X9`U_NIDETgaIhLYZhKd0wZ8Lk>QwXP zTQ%ENl<&18x}t`YNJy&JF=SW${yKM)aW{+WMC%TT4(r4DA~~QJ(CgWkX&7>)?*MDELf@! zhp9B%tg7a}2qOgg%ouZV^z#!@+w8}ZT^{x>@q5l@r!#WZ^4*TjT~A)NIl^!h1l?Ah z#^Xs`BgBjEKNsbUdWhapjUyGhqdBZpC`!ar3n4`yz7>WDhH?0+l}PnzAL}+Y>f+oBOCH%h zJ&A?ug(taRlr2%R*wgd00mWPt|2{V39YPt{pw$oZ++knQ-WhXcuTQn>wCAomC_0KxxN;%Zx#N0S5V6}y2JN;cq$+Bu)A@7h zXj;6duG0-?dJ#h{9Zs_<9s2r9PD)&vuCj_?l+4Kd4*rsh_N2clb1(Rw-d;wJp34NE z=AA`ecK6%(%NIh_V5iZxOVL4N=NrVN$Zgy^qeEgKxKVf*Ftk}v7)sl?ikZEob@|Zg z0S4j*XS49CjQ&XE&DJx0l=5l|eE1En;#063sEqsu8LYaf5+dNogW12Empt z6MgXM8Y*{*H^WSjdpJErt{IEyW36-54dLRf52u7gH% zVS_8m*$Q+q>h#c-nuq?@GV|P=IkaTbJ|wNMP2(6L=Ypz6uP{=$L)qt-wGd)-otWrz zp=Z~*s*aEdAovD^sw5nrw+pYqw?? zL|()l-If2ZfPwdup;YvxDvhEn#R`>>J7J$cZr55wsEtr&B|FS%fqM7c} zT0v(~kPXM0wWLr(Evq2r_-W>gIKtIkWaT=vUeA?_US zmY68rC3L!A!eA{LJ}#~~tbr#hm)^BiQhHph$Tt$RbW&ZBKEU@GC{K-7$0pZ#F#l>6;t14g!~g*v1@qE5JP=YO~tX)&l z-xKsf*pV2qR7(|L<{p%((6p7dX`=P?zBX~3eg>b1=Dz#1rf1apoy!~7^$k2$u7H+d zQFXpgDXoL>j>+g@KGFS3U4dZ@_845f^6o;#GfrI zpq^3Bgl(LdLdXdO8Ee!m9nx}Mu1V3opn(@_6>QPWeI&e?@yuzV;R27#Eh8~Qmr#!A zN+JZi#01S=?o7%iF|w|mluy4KswWm{q!MRK?(_$Va!hRj@>9%gu$xi5&Hq*1o`e?K z^+Wd*_C%gA->aulKJX{!O3hooXW&@Wrz*Qvj{hsCqyUG<`F&-iMEj`iUDv2@<*2z| zy)L`pJ)K{_=$h)Vg?Ocr`7tBZgx0Q@76)U`Cv-%3Ia8D43EqD7679(Fyc!qsaTd=w z&A|tw%2ZhSX!uPz6GZ$uijSHM0a`u2lN&|!Y4FYUUDRXtGT9`*Bt~O-ux*M3k(9&5 z>9U@mgq)kC%_1<%eYF$`x!Vr1Uf?XQrzwG9er>O(g~McgRPC`WjQ01$-Z2C89fmKw zqr=mnx%IfOhH&|>Wr{y8&>2&TDa9kXf{c{IU41)j_y_A?S2#8wJDd-Q`Of#?7sp#S zldQE|?$1A!z(@vuJaGjt_6Pbtqk#yi`||)Y%;GBP$_-IexHg}+f>`^GoCWLWO`nw_>b=vc|;A`+0{XHN+#~oDop>cw- zM~+q?Y9;{L&>dSffE76(|$$>K|ji895samCb*tB(1j6r36Qj74He|LJ{YL-LtHaz8(|P zjmUzEUb}mB#DnQH$wPwsL>;ffI6o&)_BF^qE5^>XSZYBCS0znJuf%$G<;ssZIZS0y zmsmC;5%@`tio7#o!)8x0&78d0HWte(=Og`D3i!q!^5A|~B}G{V5u1Ly@X-W^wLXrJ zzYtfa&xm$9nz1ZQ!c(%WA#P_rk|Y<1K_l@`i`lvt)&glPUBeC5GS>`_$ti zcnj80@e$5$nw)R!Er1vvZ>wye<;rA*tZ;FEZtBP}er>U!HPl@#pPwpHWhY!g=jaG+ zYk<5bOKB(_98>a?+Tltoo>DRHvMq(j8mlZH#A8|>&@;XwSP|PleP%<-N1zE&L8?bO zcOFZK-K1h>S92Um*ih9LZX|nI0{m^1DLRDl(Lw}xzc0e3P3eV1{;%>k6|w zY~dMm@-Zi?$1tkawDoahK_0E9(mj0RDiu@xoG!k2yezIc$n3ZK~W9`4zPajf<+4LcU{${YgLlu$HvKH@`qO5hr1Wzgcs~#@#PtU zef<$Idn>L2zBeRJ1UjHMgB$c9ft)meU<}e5C*n;!3F%ddLKz@!jyTE6V9KJ-T znQZ&{(wf*8fc!{-tHh}8WU%_9Kg1US?qp0^a32dp>KFSbd0Nbb{ck%o8HY4y0^~0| z`OqMir0BgOSvyd*Je54fVQ)Md%_BgTQWCEB<&jF@e7+$5!g7ocVtgpY2SR)){W}X< zeEPh++5l*;*kv4uSHF!TAUtw>RrF=FO;P43aZ|cd4L8Irn@*@n9Z8>CO<9P6yFf>Q z95-!6Gl@ao&w$w5damEYh0M%-9OUKjd&8{{51S@fG}V|q7_406>9B@e?6Ri$e;J^~ z#z3g7GtGV3MT5q^9QeF&pSkzm{{7wdwio-+(({)!x5Y_1e9$m?E#OT?D>m}-3c1Ez zwqRY_Qh(9#j7v}(RM--L+cbaD3|BgAXCMus4kC>w_TTv3W%z4Ll7p&@Y&=vJVC#(I z{T+$Zb}SsE?8JkJw2Z^f#U;g>k`!hH*^-g2JZwUNDhCDmB9W1iYJ4DrVcG#_ikHqp zP{e7wKO|xAsR8x(N`$_&Ifs``2lCaQP*QAO)rN%*Q~MpYk+-p_J^&)W*QMyyW+#+d z|5EI0ZR+xcUH$vQmKr=^Z#UJazMjocH@_CtYp$jlYhBtH<$4}UvLh#%ge5F#?hDQh z{Bvy2%0Bmmqw~afJTE&w!z7hlIr!Uyoo=ua_p`n2AA5Grz)5MTM(duOY>vnu&RI#G zKaVY6^J4floCgRkDBM_Ej3G}l;N=ksGNZ{nMVsAvUcKw(LsuO{@JPBeY+D@Hit^^D z6&46vXXoW@_{7i2^>YSB-<9_7g-}y+;4QIl8vj!Uv-Z#DlLnlYKz+O7P z{XccfPkG+oMt@q13JcQSR1R=9U)H?~9l&bc4>&fjf+jhB7KFOIh87QJeyg`J?22); zVbZ`Fh;|=Oq*itK?oLAL9(d58r4W@6|%aJwx<0LuA=LB!cqr0R8}g5zaiHUsA{; zh(MfWk|aTrm7LoD7x#dCmmqo|duMu*R+SkqS%YffO~2l`qAT^s z{-KR9v4&x}*S2WwQ`8m^S~eS~5ZBeBUkah(>TYYlR_j2{>m|&A&1bM0s}B1R36fVQ zq@V2~Re#r@O)rxqp!=@^5{KWOakw&vd-7H<`1>;9`2WHbZ5b7Hl$j29hy9?Gbl_qF z@i75GTyWH=0v;J@5LSx;2$pe}Ay}OZ!*PcNgVItfk~Fa>YFpTQ#i{~{mEWy$Q$w2? z$f!2NEf05+&7-RYwpE4jvficNe~R(V&vIJip7qSHb06U@^6=IqozG@dRYYCKC1+?{ zQftL%ojZ~};;!gYt>2uog@2__TzaMm%hsjsoSa6XOK4Rtm2phFr88Hl$filzROJkx zX&<6VnKfx9ks!;{yRB4=nVUu)Be^qrczZgGS_ASvR~c`PMu_#`yItHGB)hY~d9V*2 z8jDolx}>}{59ntJqERLr7Tcq=yn8X?{5f*jy~P`1{BijGB5$05gAhF&0Q*YQAG8p_ z#scDm1JxZFR^agm%vEYt(;f|VBbU@wO$Agwo5|6IBGoCEHEgPChvr@*&UYXZ1Ilh> z6oJ__WZEz&^S1eRRo0;;EOXtKVssA-nx^n_9>oeMG|oU=qgl-X?fJWM%t8aRF^2ih zh5$x87W150ZiKhk`5oJou0^P>_OyDtPN{9?q8XLjosAc1KWk z>*8-uRkrJ*n#mh0k+7frTE(fxwNo=;^u)juL}=HnYNRkCCQ!+uTVfXJ+(gn|9^uwX zR=W-@V0$qrE-Y4FL<@$hSjC+wMj+f6-8qZ*9FfG;*{zD=Kv2l!3G%N@iTAb6uk)+l zZeb5OGC9+4na?M9XbCOP>NK-cLc)4{Vvk~uY(MM|C@xSY^fjg~#yehNtg9pIma-!G zD}s@&#W9v?vVx^WR=f2oU5ko$?S(H85Pm~c2g zK;ph{4_Evwqls1bIxy#aHG)6sM$fO94g}YEadcKY6nj%gdAH8@vc*GdX{UssQi9}p*Y{jEh zS7vnlTS)|_F3g$%R2+Qi&ccE66rMKBngWe>lZ(9>GDB!RvNZDp1TW*JPQ+OQe9*-PvW?$6uzP4d3Hiefs;CimU>l5?=BOlC~|W-@0Wd%s8-V5#Nu#$L$jD;ibd7p&-&5r z*KL4w(phhw=&yLa2Saz>cwY_J$CMAg__nW%RL{jP&5UzO2oragJQQGPL>^AV>FIAk zVEIRe-xT3`9yzj!+!4rvIHQ~p958^6x;0ksjw}P1!ppO_FxWOI<_= z$*83CvDG=D8d_Q~M#To!49%#h?DMVG7wXzC z^J(q2HEZUP=#{Ym)bcYvIh#j;cqjSC@_EvLqu1G*0j9u7j!?5qwiD55{A0Z%1BJ6) z@x(6|&W~fG1YtcIcUc+piCL1+a0Je(G;bAJ#)84ESa0t)7P99g1yVW|7c%Ip9Elza z4Oy$A>x>1gdvqjG71&8-UArxr6bXg!({4*9MRLJ*iba;rsf2>mR~?rV`*OBfk|dyf zyxH64_JPvi-b=(SWly3K_%2s6mZ;oqL7s;$*&~C?VN@F(gJ!@+Oc`cN#RJ9UdIG943b_>P8+3r!j1AEWz<~8J+QlTz!-r4fj#}j(vq7@-^jci88=zU z>}AbzC;LXZlZoCSmg+rxe5bdtP7 zKq4mc?8h@-ua>-IB~sxXkx+SsP`dd*_5dS;^3sChFwfdS_SBxQ?7z7m^IQ7*^1mMK zo|mvMVXQo$IMuxk0ghB5z=2_!5itF%U48@15=+#IU4867mnPMTk;25av`&Vc0!$tN z(9fr(NeRCKy;FGWIWz;=VTcsQ?}M&UXpRWePKVgsCJOlFuxB;l+W=@tHUK23Q^b>3 zsm&Y9#@4rtlLgkYIf@1ly;qE##milBKQ^ze7xG^6T>2a}<>ms9qgpi^#vAut!LTN^ zwI3;U9`U??Ls3`}0PTpMFLr4Z*IX~AV$R;ArlAjW6`NLp%F1oXs4FB$c}}w_j!_|qv0>6Q#WoWc9 zmU&`Byo40A<*KDDQq`@3VopX_&RNQ%g4FkE5m z;+b?r*!(;}XwFW%#s$0G3l+=|*MIp&A=A2NwZ!U<_mj*Gsp`Zi4$j&sLYA#J{%d!;V@sAN?66F9~x7 z#K;r2`JhRc?el_X8d@XodlWIwqP;-4RK}Gzr6ByGg=Fac9a7gMvISX9vRU?dBR)(# z8(Tenv}&F}_<``*+rf_m`Q4w;o3*xV_`WYt9wEx}UOiJtKUcwLPE^1_bZM-1q&((;el&m z%PGgz+8W?Dk{dZW=?nkco7^jkx~=l27h^LwH`h|x6*wrv>u#$jw~cL5^`(p(jz37! z)oNX3=Uay5GmVnunQrT7n-*|n_V`mX-uL(SkHT*xZ2EjAiw@BhvU#6UW<4vTYnoWa z)a~rK_VYp^UuKJ+WSN?Of?4lQ$=-ayUh90Qng~RO;T%KAzoS960ectV><&7~gFuJ< z)(p0gwtmhlUY0ln0P3+U4fR~h$WmEa2-FS?<>p8XxIzhkFT@?_Sxpi8Wj^STA`2?~ zq0ekGg2Vnp5GWq%#gMv|8|W$6SQZ8m&bOX8(vNr^q>uQdN9n--vQ_8mUo2S)LMpFO zZc7(1yp)aC!n*U=E@}|`2hM8i+7P$4TbnNZ(&!V{vLYhPx7JsDlauj*kxkwkn%w@L zbBbK=WswVIb}Qza7U+?pg5;%CycMlsgcl3{teTsu>==agj*UWQ*h z|8LgKc$6w<%|V*-hY5{w{n8eE8P%u9ZLcyOUynVtM@Nbz$$R?M-jC2T;hMoLGYBr- z+^+!GkyovAwIa?MBOJadpYk9I6$cKymkYh_h65ZoA}X&eMgH-wG$#qovHADaqhu04 zNvq|{K46f$M^4v-W3cg%tk~&rO3I8orga7Y4+>cLA$TzIf3OJSK{hmb{<(ySu$bIJ z&&ZBSs5eU}P|nheOiw7%H>lE)N+94#dH#Y#ZL zc|`@O=_&dN30k0Ph0W<{ltC89(*0p-x)>b*K0}J;E9hXqe^cE@ng(^2IGO1=$yrKO z1<5+enK_2}3CdY|ndRw)?F=`75dPHzq0WkK_Bdvk2(-G%Y$hIsnVH z2>1tp0ssD|X4omzb1*7$t4uD=m?dj^Dg_EaatIvu05A~zANmk!`45dDA7jLlJvEgA z1&{y*8*f4M$We_OfD2+k5Se?XW^lM+It8XEJ@j8m>C^-`%yG%j) z{*qk&OY28R(2VR)2oC2JcoePy^DRgKwMS0&!_RDLbchB(f&pq|Y4O)wv#)86gNu=uya4FmASHI*{~;y(heWIKpD`H1K*@VF zJ#u1Iwyd@p5Pa);jU@D1&APq=nn_7X=F?H6-dhb!th@16(_%>MH`2bn#akoo9UJh_ zuJ1XS&FS25AR`EDAA|?eH3V=(4<+7BWR->0lBkCj4f)>lO~lR+{LV>kexMv>Xbs`$ zK{?GN&I0Hg%>gVc8knB30O%!)c_Hqn2ou2V1FAZQp<47IGDhR6UFt~a2Bq?^XKL7e>_ed&6V53$H&+xg>4Kkl)pg&QvX4E5Hrt;NzQ8KWMzM06xT z4kNF2*eH;@4B$QPGshxCLt{s9{ZHGFRTj=@0f6E3kWY&yVgjs^_9+FN#+7! zj`{?Is9w=_TL-l)FJ$KTSud$_^})k#x(v(pYO^zD{lcJe-(eG9^L8Dg_HuI11+w~S zqwMq^;d0aiyw9PxGrZYL@u@vlZg6Vj(pvA7%xM}e4WngH|R@ql4`1M_`!Mx!pY3yT{8cZ@Mr^0+jNNjN+b# zQ56`fd~r^J#N_dq+nbBPZ^s@cRRK|EPc=d#rcXLI_AAjXIiv_c;Mq~?#@4z`k1{}X znZIX}ZjeazSHc#5cd%*9ApgoPVJ_dfAC^sMqKHDKC}EchGlUW_EwaY3J0t1^i}N*# zCr+yZAFujSN(B=#5H0$8(UNJz2!HU8M$sxtNrjP8V^0nZnkTcpk0qxXyP6Q)+iW~_nVeE-zfUXd~2q(0o@u&|uG0w50TBU0Z>L}mdU z@%6n$59D9fzs3ob{CgUwdNRBRtro8SI^frm#pYKSx|5XU=IL&g(ATTTF%}maC#mE= z$xM$@QA)~BOjqsgQdH1NfmA3_(os^$(kS~_(Ws5&+RSyz;m|1*76Tiel_yvN%qWXW zEVUg1F;^2pGI%i?$;Fx7fyYi|2!idKDa$#_Nh+~d6OWq1Ap=&1Orn*Mln9Q5DEGrC z2@W((knnMir7u6PS^rP+AbOprVx$i$oM)rzquRX27H_8p|a6LH8Gx zr1zGTSQBraBLwgOt`kM)K-A-sGs0?x5q7pdQkH@~a11_)Dw4oEJ=vo1=r~*qu*v=n z=gz^RlMl?w0Y1oTz?Ka8(wwaHq|C9%5Pw<%7C;!ioQSJo00x}%ZLGuX{@Lg&+b+$0l37&qP7V!{WoOKWYYn` z)afmaG6o>A3@Fn9ND!Gvj`s9dto4wuSlZ#|@zo4G=1@j|%>*ZnQ}Q13qnwSo`hlBob!0FWs!5H{I zKFsN)B~F9}s>kq5h@=%A03ABC!%8MpN=$PE@`Oa}5$KAVMSF!mN@n*)xey+|sE&n8 zh6g@FO?7I_!xbH0=3COL5;k<#@T$jB^-6yA4a|rX!kr>dsa2T}n%iR6Z)A}>uQkt- zXic2<$%s%f1Dda?pDitIJzi{lY*oWM`22Y{-{Z%L@%w{s_$WD zy|OVg^0Z=(^LC&L>5xeo@koeU8vA%cMI{o@sx%->hm0`{9mzWNAOcfp-G?4u z_>+EnFVT}06i9>?Q|QQl&$|iFJIT|_fA4EgnRfr1ahEJFvUNL2Xxj|)|YUw}^59K(kYq(|AS`8I)haSIuO3?KIg z&)j6O!pXxe!p=sckz3Hiwst*j+`T?CZ)n+hQdnP4Ng(Jn)N8_!CJL>#S4w<$|i*Jl@K!sO??P5MT~e%1{@N zJirtxYP)4CUo!iEXD0IYTtA}Fiem%`!mpNGR5 z^OoXw8Qp=YrDhbW0u@&(F~jwkvsOtD2wx!^U`>AW!}$J#qp)I23Ja6c%zhwBWwbGb z`7P&(IUn}$Rd1`~6tMSNP5kn8Q+*;dp-9?KXU?h_ay06nrl5=D2yZeu|B9B<6`W3~ zm>>5)uJPIU>Xmef*VXLDMvKRKjn4h6T_{GG{1LfG&Kgnv)I?xWs!h=8q9X{S#_gRw z-7tv_IkazEA6W|PlD`H$Y|SdPJiV0o&#Y7+_}tv8UcWfFdEiew8;r(uAw1@S*&q323VjHf$neCH%SnkI;E+&%73Rf4-m%Cu z&wBQS-Iw%s-qUPHwp#OacoXATG{%$mJjDQx?gAPLw`N&>GSzAXrP(}Jh;-n_6oW-o zcGTG%uJ9k8cy}W^(=r|}v+qI)S*OoCtiQ@I#6+2ct&!OQ+nS!E>lTwQ*hTGB0g1K+ z7iH@BFS=H1BjIobXCXlK4aD}`L7nZ<7qoWWMB{(V=|q_k^F1gJ@k%%zZEsV6}2 zw1Pqc1@jB%_?yoDYPi zY+24(Xk+8%A{047_b5|y@9ebdx@8Zy+oYm*Ew0w7h47yLZ>J{VI-yT#Ki_=zR1M?? zxi>58Qe_d4Jv!hj$9W>j_5&AAS!ip@8}_}pyW%jnrF3E|z;{$@)wP)wiEwzHjT@-Z z`HzcLsae$5K5k*vc{lrgi+3wHxsG%3V#-hy7k?ltzUrDe;hXE7&dbmU%4~nB-*n2V zxAsg(%K10ZfRWZ7IjO3$Hpt>AX_40+?2))Xh<+j&A%`_btV9qXsu7m}QAJ!(D3m~v zCDh*TX*H{wU6-tg1rfsZIzu__D%XL=rL7geVJlLkIUTPm%k>0>a1fE~&DNT_*b0A- zY9G^u_?X%sp2_A7-Gf^ z_u;TiH82%1dfjktfrXL@Ot`?9 z^2DgQ{|?a9)z&0jS%;^T69czPlGGb}CaBvxBz^rN_d7C4pyAi{(1ucAn|Nmc`kcKh zEG{AlDRu=0Ip%pYew~0(w`z~X<;j4VJA8pe{mslY^2FvA46j$<@t~Iz(#pxym<4B2 zIBk=7otR7|Z&1$wqagI#Y>mnCL5R|=b<^Rll+I&7G}vRzo(5lFceFkMKY778M@M%F zEYpvhDjz>$Y(^egI|Yiu#YPz`M`gt`(PwqnxrCt}T zQLV07J9jS0lbJ1XUp7xBO~(v9SxacAW=laL`Kk;`c%Dc;zg*#%gM6uO3ztXYb?CJ* z{(_^`a3}43QVi>21{_c`FyCJAhRr0OQ{=!@8Dbo*B4HAyhaJ(Ts)9ij5k*Mg_mE># zu(y;GC3Bm6XH-Q{2{VFc?3LN9?uW}<>cali*X=1V9c$7=9zpzAdfAuErboVsoykI| zZ}NreJS=k#i`(0p%`WY!{)Y1Y9rfmlpCtkMI?f*t4tCG!Igo}IJPFTPY}sQkx#Bdq z`|3&CD~e9CO4@4Rqui^La(DrH&)ahc4DizZ{)J%C#$4?O@v0)%Evcmj2l&OYxEbU& zT0%@0`u====`Wa+c^ujZ_HRIv;y|Xw*VD?-9N%bZw*JlO_lr!=2Zv8Fd{+*T3VGN8 zc37vV+FVT(u%!(g5%J1^!9KS(6mWO1{ci))W2~~tezyBCKIZf|eaRu%u~Cc*U1?Vs z2Z`QDwTWU4R~nX^iLMZz+3fonJ7LTI;4o{K1xg$8C7ZBS{lIH}ieuRWZVd?fP-P{1 zagfYLGV~4Q6r8pv*`#Utc{B}#KA9JK$Z(pnG)v=v8S)7s!gl)LFy1a-H04TqxG-`u zoPro`qK#PEcj8OUI-V!~7`X&1KG2Z56LLPFguv7K-~NdP|IWOi46-1KY+^P4cBUhUgSJ?Z}FeRx{Q^?X9 zj^jxGsBTz~3GupL2Xcam2~vD3urEV=H+a&9V6h7%ZYB;}+`s}e75VItMRqL(6GC+~ z&<#VIs*(_QmPyZ0T`)x!Q3Fl%z_8itBt@*77noa;BGRpWfN)_mEk3;j51G~*nucbU zYVAyIDKo>E5lEmaE!f>9doN_ejgtaF>J#jHgeVPr2?2X^uBn{Vkwd12-R{9KmILr)$4d3%r3xlJ#}yo5kFfTW3@) zCu2lgv%o~jltg`y69f*$G?gm_RGF}{MKw6opm{6{2fB|~;(-bHvFeh>1nuF8+sGta zWb9eV=hl{uE0f2tN`c@oFH^vZQyQo^E%5HLqUmQk^xPASA0lYa)a1sQf14m)rBx`> zrqZEF`IA2OlrGI-abn15Ow)mq_O<^i8xpLle-_f5vlJ_8FH3izUD&I2hAT5Uk7}L8 z=cG%r-dcCvFtX`^$*Lv89qr#$W880)RU&SobUJChTux-eb#wsHQ3H>AB-L?D%6$HX zY!X$>ayTb6g4wvn*X!U@U#f6j`{}*}m=0qJ51$}j+w>Ke#Kk8#y~5DxP?YgJp=qiX zZD!|(8K)Kg%Eto)Nxx+076;bcZ)H1LCt)974ARg>FJ?83$8Ew$v>;Kwu4agf9Yk|) zBuG7QP8PoK&2>)r@$I5|v`>N2&_OKMO4Kylj#A>JI8KdKClJ@bd={}1M*x=lc6T-{ zDIN%dRSa$v?*>4sIK#O3PG%7j(K}63jbLkG>S7VZW04#0G!N1+G|wpJq=^g*YLR%k zOZhO*zM{k`I3e%vw2hbj<|H>hfDvl@ClO)#C8n{~i_7SA3s7hWW;+b?gOFiReYCF2 zrYVx6X~lEMiZ&IbI9KIR^2TUu;lMiKVjc$-&xj9p)aa&d6n8z&o5YC1rL5QsX#mJ% z^I$yBJ}VZ;2|@DdOMG6A2^AKwFw|lUf0(_*@s>Ic%Ol5Cu}5x*0Yjy_pcRlxfub^l z2JAQ`C6e~AJ}5UdazM%&TShv_2py7eS&j$5%+SbO=njhq1c@3x@VZ2?cyZ$4tn1@u zR=$gV>()>*4p%xZTbjE9U4JhGGO&l^5NLZ8CK$~W5}hvt&#}l(BW;qd*Z|(-&JRa% z8CQu!V2Zh>zix)_o-;;8MG=W8OcI2^_Es5YGvIP5Iea#dk*g8yM13P|ZZ-RgBlq*W z$-#72e{Jnp@`M<6rJ~-5i6E$dnG;TwLY`U{9L??0@ou8pPj^D~*nI^{5zSDSGtZYla)OAojOPq+reC?)KfB*KYrg761(8-6IB(gZhR6;N76ToNmJah}hUlrP z)}&^jAsR*uJdl!V>NvPIaK42o`-<;WG(X^XT-oz=G;_`Hl z=&%NWbq#dj05FmCALg`X5R7(d#;u0?J)>iEMFYT=1TuI7m?-ogLHq6lRCsYqJx4Py zJ*&ynHlEn4WNZ;l_8&Avb5MXGCg`Poz(@~|9B;e3aRXu2k7F&j%o*o(d1wFt{y?z) zYt$&ze_(^2e=wu6grlERD=Rv>xt*1rlVE9>mYWr+goHRDCpj}~J;?ZqBE@Wt)QtR6 zfRv?G&@y^yS_;|;rA3N~3EJgm;4rESY5^6QJc@Hhclv}Da7|7%mL1nR3v0xig7AP; zKbBlHl-#UYopE5+J_n~@h-o9BbTG;`3Q3m@s=)FoF^#DV0xa7VqQU5?<&`WALK=!Z z88&-FX<|;kx=s-TXMnH_!f(3}#bkCUTu?1nIHQ=r3c`>?nofX01JtHa2AyFzK@6Nj zGla03J@u~uhIe#4G4(~8dB3L*kO0KudWk zS7_%jmsjYk`(9kFq@SeXtc1)NDr%zu9DiJuLN72nXd0BWx4lFH*-9hG0DipzKFDd2 zftH}7XgO)IhzC?xSVBa06-^2d>^f{>O(al|)`VMAXB`$GdVMK%A20~WBWJ6oOVvEM z^6nVvKsZ}k^eO{@lNk)D7uX|bYC>jmc1}8aPBI4m86MWj4OZ=cT-t#|{w7Zi`lZJd zB_XJ2rfDQur3Z!%5G;bi)`IPklbgV34a^7=diJUwVZzMv4an{~K3_=)8!9)-H2l>x>f9Qjv^m_%bQ8gY27cRFTD$2m9wEp2g&^EZpufuAup3oa1P$291Qh+ zd0}udMoMUteYv~?zs2vOQxvTdf|zZXTMl zYaIsPv@qyLdnGM<4qD_>J!_L9ELWXzv8urj0#^MN_!A3epA&iOT^kkGxQ8 zutE@)FjxfwN0Q?X6+^toCJ4H{2M|fz`)nU5!0@llCO;z_iwgQ6)Ey-i zEuA8T-2C*ke3UG;e0~W%nJ|xf0d!|WJ6H$8{$u3{wk$F@HDMcl0zg{;F24f&_xHJf zM@Y5|h9#E%d$ylVxW#yHw5;jqPL{hDDWR3&@$*)#Pe6=Y7)%^XXXU5usZ{p{HgIY7(l=a#N9EJ**~u40M8&2XD7d1 z5m7`2Q|h{$oMcFo(u-h-9vD)(lj-i`oW&Fs(9)bmlCPx6pyk6zMr_oA$-`*Wst%4o zrhCauPg2p!%6n2Mf=RDNlHzV>Co!YMAT>ENy((68^Z)X1Q9_Pleu|MofA@l)qM0PA z0vRPgKX^rbI{|r92}#R%R`qID^ncYSp#kJbIIONg0`UHx{r>KFNkRQ+X+dd1PJVh> zdf@TJGo{&S=~+ryNmT`@f7ikp7!-WJ{1BZT#Xe0$#pER$G<=-=?Cgy6qvqCDD;b zzrTzqv!huqqT(Ay%R}u$~+nEqqvnn z?hF@XvC%*0yZ6JOf9MF?4jg{=r$b*_t4e)i&}VBCn?SA4O_s4ZcHW>ph+8;%sQw1; zNds0uj0j=3o>BXHE|fRG8c;^sP(rlJ-V(`@?B{Z6CT^wndm>R;D^}i6kLJB^=46yL zg0NxHvBJa%63aCaL89X$^FCm*+0!W0>7Nc;X z>D6mz;`hB;H2JHCw!MA_#Zg(UQg2>ZIhz2n7*h^^$gnr{Kk9+68P6y zX-{<~xDJ}P9_LIicPB;mwG`A$bjElwm@yT@#c<{-;*Ro+TEH4RG0_473|3=a?gO&@ z6&m--H4WxR22Xdg(vvd7LIHvsxfJvVM z+W!a5`iqK$XT^qJVQ{vmC_gGOEwuyauYxE2zg*{8X<9(T|KU5sKu}cLYyW!V7Ij>W%KK%HHHqnpRbagmL4}GuI5ns z;YKwt65gcMY@HBEOhyh0li{V@jl?d?Xe2({DX9U)?FDU=E~ms_Mw*`(4jXBWJm|Rm zf{G0~bog|OchHxUrn4hojdqlqjT|UUgo?yluSroJ?pmYVO|f-<@{>-YTX`tUyHeS; z^G-eq6JkPc?C@{u==cJ~polV<_koP^7(hrjaNfI0T(Y9tkS2pDU4PzRpV@zo?#Uyh zz?ed5W=t7QAk(4uMHL%^W^Ki2PJ!ZOM#=HBm_dKiOMjhtLe#;OKH!Qd-lPM)_w?*O zD=I?qLm$_a1H>_t?aIp;qM;Bdy>f8A)Q=`dKUN<}MwX z`+l&@TfzgxjqW&`(MH5cWl076UK!uF{zAP9aWe1 zd)7c0jg%Q8p<56tmMUcA+`1X$zcDp&7ymv0LEsLh&RY_wgt zfB^2CM}trg$fd%GXxMs(MM|{_kTnR)WgKC(wfbGnT;6Ky``+(@CC z`_3_hjaxyTZc6~|WMcre8dFZjfun`@rhHXN8S;bTt5RM~afKfKWa5CsZT%soT`#M& z9IxE1;G@W&zkQ>f!XpU!E^Av2uC2Ylg0Ub_vM_|`g{OvIEcR7x9g6ZRM6#?%Nlt5{ zMZB)=cf9hi1dk(_0is0wh{MDaYYdGgi^v$;z#`q5xg1nf>J@bW%L@Fkm^Bp>1*8$) zuc-!sd;+42LXBp9ilEnsapk!vaMe7?w*snmS20wjuac+QdeHLX7x%LYw4<@`1jbd) z!P^Qzo1B>XS-M$3{KZe)9FU;8tV!x~mB6=^2C=f+uRk-;j# zE~oi&?O85Xowk`xUaZaNp?R#6vw{FUK*GOG`kl(T0vA0>OA&D_A0tf87JSiawv?{7 zOa?L3NSJ&a)jBWO$8sx?qaxRNXjxrg&0C={$3OUot~nK_Fi}JvIbDTb!lr|7k?~p6 zDa=a`N=i#8LSH<@hrl?(Jcqux#O*18LYbbG6-7{CU}*pK>d3xjtTQ?O8`nh9(@{=N zOULJLkNDtb_HibP20K1TtC^b>KqkYkn+X0n6==0kL(#QvKT&YWJ31~hz4)y8;Zr{HK_crs)vq?gYB$3fa&8N@mTZ zIRj^m{pM+#&&D)B^FFlqAz*;ee;9Q3a%H++In1LEnty3M7ogN>PTcen( zm7bPcS_lra1_neYH&L{dG*ieA&@YdTWkp9LSA9_@<4u#en!#c?6NXP6)3FUqP-lp` z6oxsdIy;(`QCd(8zA_-!5*{k##%Hd~6i@{qah6KnkC2LHdS2XH{tZJFL_6I;BS|r{ z2-FE8<@EXyxjOPiaZbZjX{t^co<`m#HlW;Ep}-{Y1k->qL7hOBD`nW}3s8~qZrITdM|ROeYipjLrk#eUg00&71DR5re32g+Hu;J&B)A5E2lt0CL+N60F?4A zB)vyYcKw5jsW5?YPj6a~v|pZAq>!a!l~6^#xrk4IafEnxy>W<;lx3BWWUr8*pQ5CZ zl9`;DWT}vuqobwOub?!(bSEh*Ei*g?>4v^0b|HC3GgT|UtgtY#|4LB)rWtNVQc{XO zmU%&GWr1aNx{j85K7vM)VPxp&^EWfRG4z?50%kIG2C1OTY;y*-XMg}ja4e7~K>s@L z07(Hhf9BAhU>g(xn-TyK0F(ECTAG%C_W_e1Km(H-!F-Z!!P}CJA*AWq;HysnS^nl8 zlis=R!h}bsPGX#+6JRyn+3t**O#lEI7+|ZN5FRW0Ex1f%pLt^bQTmf0I%bUHL%<6yMu=i$-)3 z5r2Tu;o*Csb%*|7`5BE{jUx+begUJ;TQ?-vdDPJIr@UO}n~t5$h}0aR$cgHG(hUs- zZ>7RcYBNoiWGtr!$1Q)3!mPl~C ztT1n&TBr#iI}0Cd$lhrZh=+y0Pt#~?BA z4r7<&Qa9Qm&jrCvFL^bCi0uUf<|$Tf#{xROPjhF%(Zx}CxGy|uhl4CQC+4K!oO+f%oHOM8c z^!~N0Y|L;9x))pHKm#Bj1FP)=qWtS^=^p$w5FQ%*-^nahDM+g|_TRHUcpu<91baHc zM}q@^*9*dR3(4?b)F55o|5OJIEv*zyyZr^a^ZW9v;nIVEsw(=}%QCDL68sU$92%@4 z$_y&-)eiO(2-E?^^;IHc%{wy5KN=hW0F)G2-}^xS|C0*zv@$eRA&DLno1%Nl(hg7z zB~Z~!(@4@vFH9W(3TS3bP3Beb!*r$M@_6orh~B2-%VT;e5O%NqBAP(if9w*1bN2{E${R-`Cx1;RDA=`jUJ>5+h z;ON9u%m{#53oLyEi0YAJZT3CgOc0NA{xR5@9V*PqOi4@1Drbz7Gb)N_k#dqVdlrSmx&LRA`1}%LML!#stDb<0!P{pJ(t?@th^pAJY$ zjBj4Z)w3!KUQdB!zfdE)=FVRIS-O8`H1vy) zBOm|r=Q46o(5ho)`2^+>CUU&MUVQ|o?!c`+TD0=Z_2p8$bMgV%NF!kmABbP}JRhkU zSXE3;)XP$Q8CH{IjEtAy ze$b;Edx!F&xSkl9f)~?QhRVL6Wcw@XJk_@d%~BPD$!N6;vF21Tf2*yCe>e_@iO{5y zVi^uNYXQEAN>xMz()2X%6X+a5FKBpRX-t(+^_48Oj=`Xk`!bkjd8%O~s=NVYR6t>Z z8O!|vjUMjVqv<4a7KCe&+K)={-o_iuC;^jT;wDA`tqIvQ#kFMgv}oe-6}+|`!gnN zYlVat(||ouSi(9q{S;*)p)gc14VIux;+FOm1w_xbn(UD#htVVpHohx={;bi0W+;6GhG7pOqrB~+8F>w# zjOhBKoT&Td#^>_JN12JK&yyt;CxDjYl^UU@S6$_BYcL*n9_w?38K@}J&3%w8V2sK( zo4b(H3pv>B;HYf1ESFFLtJ$hWWz%hiDHi1D)`3V?audg7WHs^B+IGNXOS{2j-IaLk z&k`p*Y^NaymBwRv;3~6t(_f*1nyb95%```itEkeOAfWdWc=W`@|aE#T?eJnWOu99dhQV zr$4Tl`({-x4nt^Xs5;$_m|kd{7(;JJiH6CJHKL%`4@rh-^5UYN1xj z&`L~Pt%gfuV%G{L{~!&H5$^RON^$~m+uqM2n5p9`sigr&$-WdUSmUejof(_AQiGTN zY<_rEeBzxkH?jOaXw4y(^6*VX%#J#F-6&pRE*X5-uR0kB6(BszpM}&0C>A`=s9eGG zdScjJkdmoAW$9KUf9Kyp;2njpM(_acCPHfhJCmG|U|8*rtngQd1M0|;MpSlp7s7YB zWPGO6A@yP@cw$9ao+<%<^U4uXC?i!Cn@z9{EO#PonBs)Y$8VHgc0M03U>%6%3O40b zLSj{ZuA#BA8zR3}ew)5Q;IvZXUiv;2mvT*Cl}+4>UOfwZdoLKcGfyef#P9VU8Wy2M9B& z$m81O;lTv~E8mvk;DHz(3If6oIJ8dj(Qjan7X@zG1`C-VB<6e3PX0YRc_p(jH+Xx#}9NGpEUKd7KSbbeyh4UvINND3)R7`dvxPfAU zmKWBk5f?;QiYTfNki*LP_!K(&Z#0!{#WdnEXpJ1|FozKDA>W6vM!+wg@8Q0N@DqUW zzgGUIOH980EGK;iA^qn{U^(Y-dBQ8l2>D0K9?gVjr2UP039M}9L&F+V)93SRn|-Tc z&#YNxeog6)Msb{$mQGPZN|ixHVv1e~;!iZgk}|}^IE@-b9Sxo2jOw@qjoSE>dO&7f zK`Fmxjxx4U9CJD6)G2FsbOzf8v_zAv9ywv3rsO9xGC(ywx5N=xjP~DT!x$jvCzWN6 zsbLGK=?SO-sHqoJ6PS~Lo{B)yg}~O;*@eK!lz@@I%-)GWQBH%6jzGo2(wV^7)7iz; zmcYW$nZVATz}(cu-ob^=f`E#?2_4cHq^SnB2&hRO0UIp24glUg>Vh!r6ew2q z?~G&s8-Hg^|6gZR2L@zpLW4BOI1P9dUxG>kAc_Om90J7&|D!c785Cctm(BD}uVrASl3hAU*|ZwxPq)9pij!TM zF@H`0B#6%^lW{UFHMw~Cx(J4Dl9gU9! zl#&!Q+1y!bCeAc<&|xFZu8Peh-$R)V+fn>65Wv=$ipD-*@Zab-+i2Uq`v4Bx*-UTZ zl-ve81b|BoY~lB4v(ht(ntPjvq zNYRU~D9ZuAT~J_HP;F3P$fEBlHRI^~oZ%V2B! zbz_v@9hmO#Onl4wJcBRdodIz41FL)H6ZAJBh*g!gMpi^2lU2&KPR`=9ptNv=k#IO{*1_(ZN`}l<9)E3Qj7`es~!aQSc2Q2n~uJ6yI{ALvar8a5NZN zO?2Lqyk%mxShR7RbL+F$bC#Fm{J?$B>vwBMkCC)eWF!e879C}iGDg+u(_%n$^=RAo z!xudFHcF00Q=%^q*gru!4*$>!z2wkaK%te$evBJT|}kUlf9>r z0<}j%$*NO2QFS>-V1UM3;IqioyTQ!Y2D73uiw4j^HJQ{yR9U(xHZqA-{{XiaQq!_u zwjVRPQIkeEZ>Lz*D4}2^C~&_dAsazn-u$7d$U%xHnKPRtlq6MQ1_^(K$}&htp_nlV z-d(Z2XfSoTbMQi^X?Yau5VnQ9tX$5s1Vu|+^GPaHGF~C$Gaj1xtvlfb!uCpklZtj> z!{>B8rA>k|vqcknD_uFO#Klh{Qa-J8;(*4%1-rd_&w^l@msv>y2OV6! zTiJFE)ri}QXFk=^&eY%*8g}DY*;8MaIghrUUMnPp@`pUH)qoqO3VLz$t^(R1Z?cwH zqn9nUAo!u;L3AY6A7ozzY&`3}%6=qfwLO&g%#8tkCGG;$lJQ}3#-ww5-=|B2g!+lR zXMl38;$hzg?9A#*rp~u;evo^t4h)UHoBdeFy){S*=YF``i7ZmFotU2C`3*Ts{H*(v z7F1M*K}rt#dX!n?_@5))&E06`oL>*fw~=1oddLSE0KdA<5gwZV0O5iJp&kH+vHd-@ zH7_FeLyCZD%|*-0GwdK{O@IJWQQ+B!pkXTi(6w^*LjR+0{u-Hgt!(;+S~HWy#r*B@ zLa<}G-66x78i3>Pllk?UA%U1n6n!>qv&(PNopxsoo`|NHf#Vo z5||8^5Mh2EIo@?28s0;WVrfv1EWs0F80a>3MqYC)o=C}eW@K!fX0triMAbOeEY;H! zSvmYHFfJ&cLcTsOD9g|*)~@XwoYkpO%FsuTQqHL^9IyvTp2@E5lWh2hNycc@G_tf+ z%PqiFN)4(G4=*o~@Q_fhxjq5fCJ&x|&lB(-tZdYew8qF(|i90Odb&kF@uYXxdDlh8`3E0OcPr;tL>pkDRXZ9w~2O?6E^P zI59h6T+luRe0*Hcr@@&^&Tc0Q;p=b0l z*_mv=Cz%30oxsQ9XSO)ynIoN?oYGEF&CAY8%P3IHkI_>pP*6Sqv8b}Z$d_y&6 z)V~@GGbA>Blcy#lGCWRDWR0YgcI&1h_;R+D+YCuC_xd>x>H|a}!?xM;(Ml1Uqh*n6FD+v37l`3P! zvWrSVGdNHujJ*R&ssaeS5J@MrYN$Mcid1BwfoA7g>$d|+og{O|4Pp_TBnkP5$Uasc zznmSqo(X{kG*|@?eg#aV1?Y3}*3jj7Axyp_tWl)7hx~F%K-tH(vLVWBVB#mJt|d9> zGIof(f0%t~{j_-*lzt@-PYIejh{27=wLo}BvY4YBvxl;U_r=LH&;GEp%D6ehc4?E~ zL>XLW0PCxyd3sQic&50gJUjs`^g;Nt-G2!L$NYG%mIiv@pU7YFCX_gHI3Ex|N0U|&YF?>;jyhl!M zimvoA14>wZw!UKoOtY!$^QNHaugj7B zo-^hdyi17d{ca9zJ%Z*j4{i)0KohC-%AH_u|J}Zk4F+sXxn8IPS!^q9F3DGemhzi&<51436G<8&VO%QIMl9(80fa@_546 zrJ|gOTVBH3mdTj`O+h&TYf=l>t=g@_5)bE$mbZBXXu^<-=KI@aq42w02F;x>ibIeO zhmkGUL^Lvx4{OH*I|%*9f1&kqAP;5Y+LWxP-i%POux(fx6EOl zgt#)y?Cr6?+;juJxp~D{1pT`b==Y3sCf?&j13***Hu?>O?2*Gg_Li3{&&f9>8*M$riDvj;WiwD;+K7svG(G?{2k5OcK#_j}9m&o^mSkirixX#=I%NJPXj?Wz zJdub1cH9uY|B7~76C0x)g!!fqL}-oxn54iXZK;4BIkjqg_L~d{esw=l%ASUZ#NM}T zuD=C@aw|eIs-z^;2+)mKe=%=etjd1uxsy?n0HP27E$yih# zCx8KJMR2NB)$FH2CNqu3NFL>Ozl)96Xu9N&p-s~=0D4rx5E2;$;1yv73JJk+F3ry! z5EClGV|v~pfPhvD9FK-^PH~$HG$^ScN0I~z;9q2G!%8f#5l1t!!iJ<$*Tf|DVPQkF z%J8#Wr)zS;+&lxCVd%NaNEhOQYa75B9${8Xr-tqVD7&|*UsoHt-f@{0UwXR=+}jxp z*N3bX&ekVydJ}Gm4}UH%{;*;mkSC4p&hT^Lib( zLZmEdH2;hXOQ<)YTV-Uw$c1G*J#W;PDrMzwOx!W}MNFE)W{C{%2XHjehKO0=$T$gp zRiqhC)QHxC6ENi-6DkYdph86q70izXy4epME1y$zuaW@cU&*c>C@-(wU+pWf9&AK~ zve8cC+=rA^@;Xz36QO6M8t+!G^yHDdx^!q~eV4C!$BMsT{fmYc>yFhR+?jj}7TOfbx_VsQqoG%>(*H53ncR(O z>N?FZ(hNmPa%Or}aY9OdKC*t1LRPw_1{Y^qi&Z01^6)8q&BZjph&sOPK47Tle0^>gi3`6?|vdCKu$*)e}bI6db{c^PXp6E=qY=kOj1PFzK z47vshB>2lj&ygQ5|G)GJ21^?r2Gu8fXOxnGGhIyl`zo2j1eo+tI!a0TNLk5QNm_}u zzep7K`p2Fz~NO;3jXEcL;`M_Li~|lnjd-JO-aG z%4W`3(g3t^hQK-p3c&vxiIBT!I|SoVOKbX>O_~U+p|&Q)OdH{bPDIuW{!dfc@J(Tj z!vFx0!BC$Avi{YUwq4ypn3R|~y?6CEG{z~JouScwcaCBR4!}$b-2Vzt^B>Qvy21a= z)1GAe00n0ZkmL*5e*+xwS4luVfPtSa#7_7I9zY;^s^mgIyyONz@TNXMKA>bskYY?4 z0#`d{OLIF@69Q)odnXqHXH!RgXBSh4rWz0`;N%Jj<|t28x@#cWzm9RFFUwz;`0*Ib zOwo)^ZgyrVLlYyDgOhyDWFgBZd?WyrViYn3WuvB_D;g32l^UA*7?9l~M|;LU-hD{^ zbi!Hl4?B4i3$tvU0XrCg77ci2=l|nUDjlV?EC{m4MCR9P%HlSVOXUA(CQ#{tp#xCI z$75*yYvSBQS$iNtgs{02b(ue{k|*F-mEiEZGS)IYi0+xFN;s_yER3>0-r=k7h`bY^ z9{K5SLhMjj9`P&|auHrK-_BDU&P3L%Pr#Zu{VKtgV9qQU_h2ZNl`Pu zjD{52p0!FWs4re$NE+O?Kx7jRCQ22axrLxNMurK9VTaqMn7{r2UXH?rVo=Moz<)Z&R>y0 zX%TE^Mly2}H9!uJONlt%PAWz3ldCbS0jrfzLyiCg@&6;2lqvn+yWh6>)mIFFI~5Gt zTK#WmKkF0fDGYRUY&41lfU^i9cl7V>-Fw0(-E)Xk?0>s}lHdo^vc~(n_ojS8Jcpo0 zC%`dH0r1d3oUEDu5xcWIh53(;gJYNgaPmO}dK><(?X{Ms^OhKrADI7$gm$7}Wb^se zlp4;&N$_lAQL0j7&d#zKG-!}8qA7xa!}w|4*WS_&b8seLzjVm18axrBxV-$!8o7tx zrg3@AIEO!8Kf6!6b_i#7IHI{_8czswUX#&)X1fe=@3G?nx*<}N$*j*aW#k#2otfbA z8Rr$>?bA2XsG!O$2e(|)-2naTYjMOD({w{xuxKmNI(U+O~0*z7;k@z2o^7|T( z-gcJJ2P3r5rT2^iO>K0tmO@p(xbov?htb*zF}F}Y%f(~cd~c(tlG`hujMuljk@*2nK(-&1;XoZzvhhDo6#QJ~OxK0=n< z2RR)SDF>!iWbt$oU|)GhCfyWG?Z1pD(7H*A@L%ysv5rPLeDJU&v%z3@A=X zC!DyZ*^_9?vurqR38~RxM!E^SLl2jZkKr1`lm5q|3$+mM(BsLevFmD!A*`C+1R3Q9?X9NT&%X=ZjR$;r)lY5_Fo?t@}q zFkTGMtwbB`d9y21ZXS9I9;c%s5GF=wD*wK$RbVW%5M8D%g3X(X{d z>LB&l3`amcCc2T14Ku*v1Jf@ms;8hksj}TGnIrv5$J8D~+^AA&ZwAeAqg^x1o_QLp zu9n-L7-LsYZo@4v#<1(w5~I40Bp`$s7ZHLHwqYV*G}v^36E6>C{X%%0yYbttq1B@K zqL2boA5}LFji{x1L%OSeQ$J7~=~xj&B2eOLFVUuTM`X4Nqr2}}S)L%A=g?^!bSLMk z>%v1Y*O}HPUjLX_!C)rBc&60JCXn!rfx8bd6jUXt6lVlfmrW*lpfF_-5XxSR;rDPT zXoFaLW7|p|g7ix?VTjeA36WofHkBzZLQY#Sw>p&U3`|Bo&CAjQa{e&yi_d#9gvxN6 z>36H7C)p`%cg}kce5Qy?^g9fJDJLr|Bm>!FG$!r+^B~QJ1kMrF%9LycY0`NtgnQ?A zj%H!jpZCig*tbqYF#e|w>}O~g)$t~qXA}1qbhNmqKWPBfmH(Giv6d(X7_X^MfuLor zIC`4ahXyq#lqwR})$94oYler-v`;$zly`&r!y~vG4O(&yL9p1#3PvJjteH{s>G7@D zUi#H~%=ygMB?oYswPYo6P2wvHQAz+V8HFWAq+UD~MQLsX(gU7)JGl{OJCmt!+fjb^ zec#RK+U@A=y1G|Rx9^vs4ylL(q zNyCZUO?Jq15^m@?2R!V%+NK0FQ6w0WDO|MMbD1L&VDbP@z`L#A8SJ6En>qj>^y7~# zIkj#k*uHdt4ov8p_##fdGSMr6^TPSG=TZj3TJleGG}BS4%*A_{sZAjPYUo0lp4cn8 z7g;wYX+IVctzf)5t)s;VlrD|MtGZFIrLsOy317`|jT9>^rqxEp*Q0UWt;Pm){_Gt+ zAF%>6Y${;2XxsLRnxl+Dg`I9<16=K2`YqNf)_IN2JuTFD`!TI2qrTwhLbJ2)Pe+9z zN16+MpTq;DzC+4sOn48=r)u76eqF!D16yh}?N(??b7Y=f^^AqW(SlR!X$*e_A29Ea z!d;k1p;pflU5*w_^u4X2;yYZX+`?fY#MA!_IY|B#oOu#-e( zLJfJev7BFPDQuz06}K83ley=mmB(QZYKvF~d#$pc=8}hSc<#nM@Jgm(U%f4Ytl9k3 zW`f>G#kuG^)hh?LlIc2b6#W+BHJznfTz{oOSLZcym~m?|&0uPLF5>b*)$Eq@0Rf=- zi$(6Rut4`|6%HzCd`BWv`sgG%(;(S|Vpig&gbCjHK(~22i{5&GhBq^GYuzr;O;ro` zYT(6QX*nAaP7gQ}ed6_;6nKR`X-?sCjGAmYxoM8)sIgiauF^cUuViLY0ER`C_EnOu zUzo#dMK$Ok^$2I>1_InDM$XNgi#eAp+R zc3jiSGC>iGMNc)J%4oEpK$WvwwgdvksuXWS=m2rTxEB9b0wF&a_mJ>+OB1Y%DY>e& z`P%rV4!G?*Xd41ToPRd zU*T0Va;vFBMY?q(cPBW&avJ&hPIQg-ujQBs8BvaokPPeYo$I85nN#DG)GjFbD-Wg( z$uPI`UzwPKU!`8*I(CQ!bVu%}1?%@FKq)ZSL;}B-Q4F4-L*P1CoclXp8Ln;#xplr( zf{Mdjs@Fy8BIwPUOP1$o&znBFvqFeDHg&mB>HUEgPw}!(8vzq3J#tFbrtGo*9z4ks z6L!f*ha7RqLr0?|-7&djmLLgja5!5w5e`L>;8L>6fg%TlT%S{2ou2>x1I;DZHgj zO_H*a@jTm9sOi#Xg=Xrw8>LbUZ9L*Onw#8u8|jCL)P>v8c8}+ z)itY@NzvGSv$>qGa=aaSjTI>bB8?VN2wNvaq?X_Sg6y{NF7?UI^?>A%AkWgz2Eo-7@$=ABIVrA7Kv10SCxFf+t$XK0MD zxRylOR7Eo-YSBnt{=nbYkg>~;2r?IAQAFA!cl}O+s$IVU41@>sI(Q5ezf(LVeKozq z>*g*QEQelP_$s_!=XjY*no@72FAVx6){~TaaLa5d$^#V4Wy4M_&E2XydZ>u1iS+F@ zNp_^J63!m3l>ox#Q;;|!+8tRG0dWkZNlMk>oeuH@*5#?QB{!f?`>~;d`i-M^HE_ki z^`c&46<{b~Z zg7CGGw2-Uj!$fY3OJZgJ?e&R9$$6nQP2+A5H&=fO$&0RNA4X`ZS%~(uu;M_^$CwF3 zKMCXpwm<$TzPzb%xzNByk1p7L^zk0f(3%N{jOS$4$kikRIkZSe3 z{BG!m<31UHoZkVxWbud0A1{Cz=vO4jX95Sa=z}MctsBO|AwAAJnc0(R<7o8YnS$_k zgZj2*+Na8*^2C;-?>RDEewd76s}(>*;xDqxR-mt;E<&wNxvoo*l#L z>LIw+C0^PXyxBDd4-+VH<2Fru*Csg@qP3vQlGj(BJZ<^B8mfCCLy|YwZTulY{CcfZ zztq96<5U7mZ?X@b0r!1L~GnG_b37 z!2DAkw4A;lIX)iAFPQMksWN{{K4lKHPk*Xcsr!Xz#6$lfyRdc|dTS?a)fNlz>vzDr zOP|JFE#(C_IF#;U`@7~qd^T2>ed=k&el`jzPFrfpP~VPV-XCb7w=JFayzwLe1I}aM zTblomv40G%t?Rmm(b#sf;~m?!ZQHi(?AT6LY}@vZZQFKsaISsb&r|3A-tVnb=SQki zbIq!?=IC>@(MBJ=wceBFG$SeAOK*D+H(oApU@#_GT;3uRkq|axOF8y5l_mA^ENDJ70J2!30LNV3S62u^eqhI zGvv!N9;8esO0}k)LB;I6VrAz&M-erC{niE^PN}YJRRO;)9r1oJ2^OGX%|8XP5!n!I zvc1R;%&!=KWAWT_=h-m~BT>(5=S}3RrIO3Bc)K)f_eSFiIdGHODD?7U3E{uz(8A*flu`YEFp)Ms&HLu}wzqjDTy;4a|X zc-qD?D7c3**<)`6=JmdkJAmTL!U$^rT)I5>yC#`6cB$T_Y8R}57o$F$2s+fV;=#s>DbWp!>^88YtBMK|yi_8h^P=85eWN#0Xjs4i-4SODZ3LA2L3IAIuH>nS;3?X9s%|Ue+!fw$t1A zGX@`C7eIBq>~_b&N}-D{D^(Mi{a8#7$BL4!%$|OC2F0?giJ$wo1R}xoap`qySNtdZXQVl zX+1Ns?E6EYDc%X z6mTY)!a?b^Qud3N{tqyfsyVrXu&vrr`GSkk*iIb=*F=|gP(6uo*^#}I*ITr;RYIpi z;W#?~>{)hBYuW_W95ktRDGTJCw`#NTxT6Xx7C%w~HV7NgCY6yI&6`%qyK}k`)Vv&3 zcH5g|7uSYRvs>E_PeNtpTk#Kw52ofa^)bind|9g7^~b_71h>~($7H^=*lxna6V3u7boxu^0VWGxXj;o;MZRj=|{h}45iH7xA4Xo)jxjiXZ z#C|6wj5*s6#i~rdjQi2zbfpc6SmMnR<2rA`ux3Ia`!!PgL2~cuf$HRrx$ev#+O^fp zA-tNgdki|WcE~Z|OcJT(Oewj?)lg~qTQAfuILm@rcl{of*0IC1SU$!fLv;G4B=H)7u{*RL_$K&F2lD%30_bYdYAgQ^GbIQ!iJZI?x~UGG>Wp6%#HRx}>rp z!`u-J!&5)lfz>IKCu8+U{(!$Gr(YS6KFIqiwD#%^qKl%akzGtGY^$uNdi}h`#{!l= z#bf(w?pL&&X*o?zVCCUFwi|*N<0UKx+B1+&*5Z(`Zn zX0D-%b^c!8z-roKA2s8X!)O^Z`hXQ}W|3lIigLaBo4#j7N3%s=G=^Iw?>$P}-`hW& zlu@3Q__uZPB`M)BjNuW?Z=3+l%w+*|z%Y2kSoxempayujUAzaaO6#w{pz7*@V^olt zbdLT=v?g>oa(m3!9b952aWtUiK+1*-m}FKDz{cgvg0V2u!66W9>evNX8+)$7qEV33 zD*K;06K0rm3X_wQ;^DtJ+>w9nKV`Q2F2R(U*1|&l8<4Upd~hVV7|F#8Nq#nJtk97+ zwuvlcMxm0xp=5SNu7OsK>go90W5kjRwA2x% zFWC#D?HmGOA56i%sXYW?E1Rl00t1CqLFb-=5_{COK4)j;^NrCkS=)` zbc6#&X(~mL2}X*F-85#R>3WxlNU$OuB{O|}8A_EL5pAzT{@=L%d)y)@og3wRkEhr> z1!2@)<~E%YEmZ%|c}TK6^?7f52~^xJAh8b;fc(#6Uo4z8?lHms6}%mL)6h&N?KD){ zr=FyfF}wwcESjlGLhAwD2f~>jK?Vr?z5QX#Ik@B0L{_nQ3clbYIteqvHr+>m-SQs) zu8|D_rlkeuzZ8I;Z(|X|aY=MEg8`BT1V3$Y9p@#u7 zT_I>Y1J?2YXyb8kIt0fM%R5>b`si8K{4*7U`j5dx?cIPpC!mZDsQmuk(?;k3+Iwrl zwNHl zoE_!V&``2z2ut$R6_PX56HD^ZkPfZTlS+#$r-m~UYZa!zQPpWxf%1*=00;^jI*iz6 zNVGqxej*k%K0M6-=a}qZL0Nj=`7hEW1{!7R05X$aD7Bb^aFf|G)R%(^%<^hWVSg8l zbr>n}5QdSbVNkA8VQI+6qSRxM4`^|IEXz%!GpBzDiv+?NvPra}%<2O&EMai|4VnUH zo|BwhUQgm=*SyNbm}{aEF`=>x;k_s6`g-1OKxoSTA@}~V)w>qV5ZH|n-P9Pr2<_uu z{{;cA(ABLkJsBUTV6;5a;mmMEzm zQ$vRbM5u_}7lmg?LNg01J*R5}UGMp!_xv_PPBcVFGpEuq+`%CT>(|(b(};lRagzN6 zw9In?VrG}X7gFKXp$WJxMx85o(tFT@2?uHUSR#Wt zI_Y8Qjr_+1HYj?Ad=D)-!>@P&__Pwxgc<6&<(w{g zB{Qe;wxL5Z&&DbDq0n>*wkN7Ws|R;rd6QaFA^y)VGuv^wNGh4=G;ge$ddN3b;3gZE;=`r&3*}9`lza{HM23%`OmcA>NwdK};XXWUHRAR}`=44m*6M$T)jm1VU~Xmq5YQDb zorFz-L`cQynZqFt*FYsV{Xfn~e~aCa_*qLiRP%9u0~Kh|(fZO6jt!UB7VoCzmd0ml zD=3vKC?#iB040w7v-ARG7Uz|e!~=5EN}w0n-&$XXr}#;nu-Vh3r}lw>oHbMvc7X%` zVG0{|opWx3dL?6F=|k*0Mjh1fKmz-a;s;20|9ocgXVgfTY2nbD#wdxMsl3sogwjH$ zhk}-_OffM*v#Q*{x-w5yA-Q~PnA4NE5f~HGT+vF>QW0MSnLs6hPGss(jPB3acRDD! zc>@P1d~(J|uBcA~N9EZe$8sm(kqy$(KZA%Lxqj0UL9L!2HkX7eikr$ z^7W?1SJSROb+{RP!Ym0S$vaxeV<02uY!aWbWauY4KQP|e%K#xZOO`i4cmR~AW&SGt z92{L?TuoUITKmzP){@#1@uuNJG*5vJF&Q~>Bm|wB|r(4L?zEsbYy9%8)XWxKH zHsfgH^6Be~?}rTM#qDF!j#=p(6RxKvQYh>3FTY^I%tmZfBeg7tzzdhf< z5Bk&xP%2^ZXM&Tlbcg1su#iWU>4ymrcp5bykwQ>WEYOe?gfyV+07F2$zor+2z4$DW zHKa9ImU*CQr_v;0NK5cNNUOFPwB}Nopo#kBv5Es{tT}+Irvu_<4^2WnL~{fdb3OZY z&cnO)%)!9mV=Tl7Pb{F1zi{-@la&l{M8BM-2NxH_HiCJHFGp>z`>zAprJaUhgOQDt zqbIMXxA-pH<~8XAh$OySv49L%&P6o zXPxD1Ah+~#<3IoGOz}C`*hg)do$xwu>plVea$UVAySq9Z0x?6prl$K`-$53JT{o@( zOIUSva_)U}o6_#PP2l!hnFfY#E zy80~MAy?-e?n_tP(T6sjpUa{P-7f3!5M%=Boc7t%0Z%hon3zEpbPSC8sgFazg;Pne z;)y{;wyh^k5F|=pi$TQwyP`2qwSZJ<#A$BGc^2;*YXRy+iPi=8FV`67Rr9N3(+9YF z%^7R4GH^93-4}rLe!I7n$NLKTXCQYQKF4L%hAnK$OZK*Q>(OJ}s%R^HvfGxs6(N%a zist}GjNy+N@)h4S7xA{u>Ath4npz33tZaAtJlxYf=+l;2=42rzVfn3X?*Zv?B(t*m zEN94zI(P91_ET0#JYR}BRtEVXsz*+SkkHm_-8OT%(xX|sG^DLI-%*UQ#*^o>XzGX^ z7Qwg7A1NCA$K2Cn#+m(~Vrm1?~(LjElx zLdzr%Ye^kEPGFo-VaR;@<RcdJJM9rb^UU~J|m^j z6Fhy;HtSQTdRN?wz(I>l6-4obA9vFViJScJ`DS3N~22)Ljx==0ObcD!CqF7s;Hb2x~5^%mc`eT`fBB5VT!H4(DjF+QVX zU*~y-N;^C~B(h2#zmgf~%^lZ^8KfL~Mx;gnTby^Nyd1LKiU7UuGXac9X>FPcMyxX|JvN!stq0cq znSAKkP`Y^??AJ;1?a4!f#t)R)WPebKxlN!>P@am)zpsS}e&19TD=%;*gA(KfMWEM3)<#B_2e_#f-4Wg$5}^S=-mJTHH+ zfjxy;G8|wzmz!L|PO0+PEU1}=L+0Yk0M%(IN_tr^T=EP+?TI+?07SpK0gkYopcy0K ze{6h^N1-F21<4)s__baD^b|430wCN5N}>3nD9H;^ny7dsXEM6m#p!6P52{xe4CufgFeNfwl#tx7c(($z@?({4fviVJ3I$lJgcaJkDQ z>XdZy+9jv`kmihEQ_sndBsihX=(~?!$grz%USZ&!o%0tyx@t~rZlF$l6pS5{zF!7@;Elz;TZ$F#AZony)EZSSChQYBgP0p#Z9# zoYRrUd%_K;=-;%6*ghhd($X>vw{7UT^;n#k-AcsQlJVt~tNBeUi!VgOkkE;biAM9{ zWBnEag-LY43<&KY03}S@N!b^kmKEnkuNBhdLwmR;BhV6us8eO?#@#aF6s^ku5%l;4 z=rc8N7T^T!%*KSgq~>YyVcEhA^^K)S0DHO)<31)W#)Y^uot4;Se!ONQ5IC1yju1gg z06$%x|G1rShmufwu_6T4gBKEnWdL$`kanylM+ZHz-+6T#XMKT@S$y8FOEzz#1Jlz9 z1gm{;qADNM;TMJ;hRn7ioRL*5PiGey_!Kq@lSc*dVjw!RNspz=fKzPC)G9*Ny%e1xCR!S#28B+BzyquU83p}T1O2Ej@jE!u@f)~ zgr|!A34v?UcFZxk5H-Z{_jt;_LvMF=G7s9yOi^c6WdGVliJoZ!x51#De9n?eObs|k z`4wuGnX?7GOnHOI2aqsuU+H`6*y`z;x5fHf%D@s6P0G_bGIyP*LVhAXHYM{XxDhWl zn@A{_9153w+7jvpoODen#IY&*C+3JTI|9o;ygj!gz=Gc6j2gh~Y$>cc^oCt=K= zot@*w%`fUqCp#4@tun3Z0Bh>rX)VyeC8grn4wjDWRYeB2{AG7CiE-6(Q8dMKhWXXp z5zXNZ+AWoCL&!@c@Pd+yGTOR`3JRJYwV<>;Uo776?SS9V*P>8mQUV~C*BDQRI#m(A ztT#uE)^cAG7%-lV=}XTtx)(l6F=s_DaV=V4?7zMnnvy`;|fODDyoe1 zUWY60HvAf8=g%+3e0_P#+s2kQFQMJ|n53X9f{c2K&U*-Bqc$;_J{46>1x%WpS-4Ik z41iHMvtHt3FI=_i15i1B zcVa%Btro^#a~jj;^zEe>AYO#N75zQm^qe7_>1Fu@T&S5&m!Oejg7}Rz>yB{9ni-y$ zKB$B8WUJcErKr4&iKq?+$*8s+t(4pYI?>eZUr7!sol^iCJg-ywn@R|$y$t(lrNJnD zOy4~4M-5d@nl6p@6IX>CN;#X4vNE+{48ATafhU;nv8( z(5M`P*XC~U_u!D;DqBRB`Kj*lX~I-DdFHgGYL~_9gpWSel>W%${G%NHW`@@o-nXkH ziaM3cggfLFj`;OyPZR*V0@~_v3(23#3+f?WlX3|9NPNj?MO((P0|y_2eZ;)CgKZa_ha8y-mjmUC(MP$ zC!xk`(tB|8cOLrtgQz59Ry=G};Z#5lM+Wr^kpsbUPkeFcko#q4sG#L@W znsxd^C(+j_QQBCaQp~T|27&iQB=ol)j;Bi00nei@$sMY|K)t@7+S0OY{>G>9f(Gd6 zs2>yEsX*0Z?X@)N(FmF|Qf724#(zSy;CZzrp_{X$pIt-LCLrIXV^8R~LxL^k9TY3(;G( z2)LVEU}tR)WRsMJY-H4GNILUbcuT2*AL)!@{qZST?eqj*1OKDkeYbE@XIpT^ zYx%c;Z1Az#bW!rBSH2jI^3=po199C*Em_5s?D0fNo(u&q0bTQQdE}gK0tK0uW$n<# z$VPu0_|uo+=eih$MrNW@-jnq3gn%Eci11HcXL}Lq$7*a>sLi=FU&c7%qtQ6`)XLa7=7iPBd zP7*QBu#3k}07{DT6;JIU=2Hgi*q>pypW6Pw>8mIQKy#(f9~v)RKf(&WL3aGv1Umle zmzq^KoC?K|eD!(?8n-K&RfZDrN|j7`iLfM<1@rn0YIB=3qN~b9^FsUe)TzF6u7P!J z?C}fd!Ard5a-F>_G=sltF&_JA-RV=jHZ3^xpLVS{aD!GQpo;KE@nyzKek)av4?yTu z(OHBgofx<+DvW8V$ukwY!bHSW7^<3~+_ER73}97NI>EZOFV9$#GHRVl@v`9j?D+7c z4f65;mY1ZZ#wu0S6woqB*Rfl``I=lPp)+Z&#Tk=XqAfdT%EF;U(`YVNo3G+2Bd*pn z&{f-5|7BjxuAp|@YQvImGa*yGRDmk3;@+@MB`e~t`c}kb)FsL4Cpk3saIc9TM?#_8 zR8EGr-kS3MtA?I_TcI*v=Y|tItwpwaP9&RHT}YN-oE*lLmI%oQy;zOf(ioy6^Cx~k z?gWl!EvMm}YEFgi1+q>zc@Vff?i#9Kwr23*7XjUD#btbh(~^y8{(|oU#A+PM0lJOy zWvA4`yG55J7I5x32W}^J91#Nf{&WP^?h`SLefua6){b$!U|$HQp&^P#?5<%zDW?N{ zA2g4{pn!-EAe8Wt$)p z#b74D#f#tBGk7xD2}BYY8o1RUAi(47vxCM9Lw0YU5{r%EI>Kiyov#!pK8a3p=5bVz zATirYq{oo90RCq{AqI781IqfB1lG`HE!YDCLJqTgN!iUuZ#H9#LE0vXk@G&T92B|S zNc}D`GF*w_DfWah#+Fms@Xy=9)%4V%$r0j#{QHogSVOGZQOU_M?t%S41I1(-3139B zJ-p0de2%saX1+qoB5YrnLhk`mW|<#0ZCQ*uqkfRtJjk3T;?WQt`z)xH1-bhoG&wEh zGo>^R*rLK99S4jT8GG1w=}sQnAJhHg&|~bMLUvb2W1cOt>VfiocXpf!_DNHY0^%O- zE)J}6o0=zIUvmt#@>e0=@N1p6BQ&bLpTdAQX$JfDFn z&>`Oe0QhEpv}r7|#w9c$sR;xm}4@vQDOnE*kt9Z!;2uCu^GUzz)y8 zRZshXoyV7a!LQkdvQA(wj$O+ZpD;IIVCzoK@qVg7Jg_wY)Y{) zr{;;QOg;?N8kpBpzmVQ)<_KXMTTKqV%#>>ZhtI)0MA42EmQ#s2z91F;-Q7Xxw)G

ByMp*RQvk=kn?S#wQ}ve@4!sA2!BRuvBulFL7cbfUESYpxI1($ zsj6s|uK2x8x99!1fEpb6d{XoY-gJ?6P$=;J4PH00EnElsf9dHxIVK~uEH6(xMo%#( zEr$7f7X(NP2BEYA!2>`VGi3$Jh!lMDfJQu8Y@3P>JHkNB*W3y^-I38q!1)=e!>$aWbG^=RRL8uaBZ8+U z{d2!F8f7*y3c1jFvBrj4gwB1S@hoSrA*=)^BfaxN%giL?c>3}TIWo|)&>wpyYt}*e%asIlHajq-WfD;M~gXOlGFXkJ>lkU-&Q1_0=+1voaK=}(wRib z5no^sD?8<4VhY-x7(1R>QmqQc7b{;?_}~<8={{sAn7}`(w&dd019d^uDN7B)lciB# z+81+A~e zT0nsoo_O=2q1MO>%6;06CrR~2+|73$B4Ta}fq!TBhS5nU48kmX zlU1*cr74q*gPbIoq(n0q>BIbcIRD`QeGaX@bqQsiyQd3(S^T+!q1&>h*l31zeMrW-gbE8vO zt)$o+vb9Wdj>2rn?g6(Prm~k=^}~Qa7>P^T?=zJ|uzjH8n)o zz}R7fiptU_F~dq;Tl#RqPRfq= zYB{Q|-&3itq?@p0Dg{a|xiUIqQzfdpQ4eM9ARY<&T`~=T5e23!>4p0@{_sSznMM#@ z-Qk-QmdSOjYSh^9voT7jV|p>x>=y=*xOq;_hheN|+6;E%Q)WOe{?5FO7|en&qrI`-#$8+YN_@F+cElAKR)*Rt{OF`{jnZ%dAQqnD;yXgNEk9GREM`1O-f7sNv^rlh9L_LU)=%0M<}?gUPPHE#k(Zj#9GAhbm8kN413E)h9*RwvJK z?W}cyygKsQFgoVh&fGBuo2|D10($B(p+4EzSZN(fFo=s2riC^*-Vw;#rPDx4Re}}Qe5*ON7 z|K7HNleWcif@)|G3ELPic!2rs1=`{CBe8H-xcLzK#9y#9+h$)TyqmeLEkMv@g$bw1 znTDSwi$>kRT4Tj@4{p0+b9p2~MDn&tAvzaeA{0@UCYhV3a!HBn!Jrb2o z0Epbj{Sg%rK<4nzjz<708LlK}88P_7#Ayp23qgI(4h3_V5yj{BOT#Gi1@&rvT`fjW zl|wR9>4ZU&TLKcEo~Lc_(?rNq52yH}?D0uuU}x{rG^94x_(dUK%5;f$E)?6rWM{6> zL?gh3hJ39;cl6 zeRQcW*iXo#9)1>)8x^zrW>Aq)6kL~I?ETr4vJB)qh6~u{7coh)BR|^pAh=JQTf6&# zKTcD%1vL|$!|h z&a!-x9V9a8L?U#JwE>|OQb6CpvpE92+_FnA@cLFA53W50SWaerBUOaAkzM6P2Agj3 zZpenHM6HcNW`g(sN{)KCQLrNr*=io*`PRB`Bt#C)qZ-1`2NQ{#b^i)BYJEd^#Bbe3 zLNiJkS=lka=9OQQ19f9>=%O#ep9gGB2y>k^C}YFpovLT0!%_7XHu%~Ya=oG+5N$r^ z2+#MAwlyB1(%y#d7`*%pR?n$nDJY#W=YNWu_I`={hA;0ezi^`0@C)Oo(wJL-MD~;X zP+1%#znLriA{a`av8)ICkHDN#HuC?iFNZn*i{pXN-6m-H|6gG_ArMf{Fq%y#g$E!e zK~`>%0V(u_Z@A2cFz6UaQ&lygBaaZu=I4qd4(uqx9mkRQW_G=-w03weIOX;k-Tpzj0aS7?>>?c+6XM+d#rfPJ%c8b%x&z`LG zX)l%JPSeC8grTem{@%Qo7FBTFBg+U+rpX5)kj*Tt-4jpS8^!3vi}N4$MHJs%x`2M^ z1hI<>1OAhbZsIeTKyeSig&A)@(_U7l5G$tne;Pm;DR%tx|6h}Np9mp8EiFeY==j`! z-5{7WlN9BU^I6E5>Cq|FGt~hZIcb>%K#Q4hhw^l0m*{_E33)%U|DZ%IHU1E##6m{R z5TW7dv z*85r4Y0v^0yxS~8-%Q1Xf%&lON`i5ukLjFotOa%a1;5Jw1sAm9OgkJjl{(Mxs(T8K z2tLu&k(j^`&HSo8!lYk+Q4E(RQ{;oc5X_KDJf&Hq(U%+>V#X7Lg(z%zTaV1C3_J3q zbF5RVG31PZvJ3rtl;FKggg;;n6#;gGAG-`#YC=WCrYET1GGWrtQls1+yaeX)oZGey zL#~Z*?iT$yjw|K;ZR!1HsDd8>#O+jlfIvZybJ2u285Vnh?7?c3NPbPHPJt9VJPO2( z);V5hr8ExZC-AbgKx!5w^@()$Az`)EV55$OkcM+GN7@pUQqi<7U= z7b^hnwb@>z3+wLG*3b!H47Osx!VLn7Xbeyh2mm(%R%-wb3%ri8V>EIy?axf@hk0Z$ z1Ea+yP&p6=OB;hv2s?pE<|1*RuA>WxRq(*Q zZVV|`LRTMR7c$Nhmt%j*1A$Eveoh|SVqc0dV((|N_FEYg=;KqRIg zN_Br;2nrU}z3rf3PSB$8?tf*8k=LtHx$oJRgPG-Y`8>nO~+yvwws)w`~pO`k3~qIfT*B0`8W7GR7Y|cN&AJ)fc5k0q#6u! zg!9TTzCd)?$SPXm7YXUnokTKhtscE1G(sjFgi}>e>;K>pJ@zoeg3ecIs0rr@*SqR6 z{3I8}aWpzeZ>y9HmYBGNN`ES!hoSizjn95Cr3zcl3XdE_OGl1rk!D;x(aR3XY z;TGEklkf$S3Jmj`sm0&ky~+PZkkTLXkf5;ZK?aQ)`_c8aaU=F_kY~KSxQoB^cIuCJt*qrYXYAl;#EnvO za2Q0*wEKZYJmG5crJqB#EG1>|(dk zC{HN!)DKq;Qm*)UC;%#lj&@M+BNOm4uCU){CZ>a()rj9bZu~?}ST7WOqfr?m19s31 z@=+Nww=C^HTN3#u6MoR|>+AaLE%86@1Xn(zZa3TAm|eey=JIM9$KGt5aO?Wr>Ugny z*T@azOHUdX8h1dS4P0mjkR#8Z)?r>|`{*0PUBK6Y)fze3lG%NKix4gO6I}9P@ghHD zsZms*pZX+5r4*BK>^P4ZTiPT(-J)Vhy>eGZ&8(U7TDlJlbMK6Ffv4ur7xgqt2adfg zXM4>fP{JQ#q<`I3@Dye|7unL`U0%oZ`La{;H)okn=k{ZI-Ab5J!?R>HRu^)Ep|?Py zLHHCfn`WRfS*;FWBQRaUG3ok-l5o8aAQIpHXa{=Nsf*Ie_pXQQsbA7RF_-At2f_X7 z9{Y*Kr1ymd6yAFan%`&E+nZi@FqU*S=EBCy%Ne%QGjQFqwJ)8u*xyeHbO`~l=kP<;yYM?Q*Loz3YnxV@#RQqsRz*8^}o*`9c`= zr8J)OdpHY_cO9=AR0y)cI?_&&&O2~u)-X^Gj8qvPlWMMZ0Ibx27@q2^Y9S?oWXYNO?_>Uvb{(v*Z@7XH^l^K>w|Ks{5i(+rg#Ci^YU5gB)fj4d2hq``Ot{!^BZmH^qW4=IQ# z!p2ti4Xlvi%rPw0Qx8EhmC2ZC~q%Yv)Q%CuYdKA6K`fmc;lZvtWo zh>t0D9m$s&8XW?T4>xAJu!$orD(Z?~`;|<$atmA9;x8cQ?u(&g9(!U`Mmbt%c%a$b z^K=sS-SujE{|7v0Ka5{?6$1d|&Sp!BVkk3esC!10lLe>Na$ny zuYQ&T%$05gIswE^@M_sj{j0kQS2_W)zYTg%JLpC{$H0V$<_nRlFd=#~d?d_l9WIaC zk{2=<_40-MY)V;5JV@=Cd)h)=GNxDO8~zV@kGQ~=ly|jLBf%wZu{Hvwe-G)5iV^=V zals!o5uNL&ZwzhVM60P z6XF;e*jH8R!~iEYGOA*MuC!0|1=k;8l`iotE;eFHmXuYqv>iC=jYG z%T>3i>aVyA)H@xvG*>3-M=o z1Z#ak7H_RiU0P^VKm{uE8VQTC1_WK#_To;~eR1h>=9{rh!&cov9PYqN!cJ>MNTe1h zWjITCYtlAX#c0@Mg|Cr(ojq2crD%C5Dx2!5HAOSFTeUQm~x}FwPeF;#Ci;!UJXe*z^h^{p(}l&9;p=$|AHBxzwWtF1;5>8^z23A;Lo`3 z0T1HNX+|DL&AfMoQ}mH=;0Dmz=2AYtT^;8P%wV1{TZ9`x0m}%I@VrbO^gn;I{|Q<{ zYz^PnuYDeQ9t%Myp@(|>6`D{R_kf|}-?bR_Moc8>u&tjs|@WITXW>3lb4I;shjH`2KeZZ`_#hih+jYlyOD5qFBnAHl{xA9S&1L#zA%$&AZezl zF*#<&P@UYZyQG#NrAbu!e9=qAm4g`LJ?pbtjmLe1thGor*i*!$r_~7G2>71u2}hsR zyYT}L-@-E#{_OOg)KD=0 zamAkFle_3ic;p!S-M$ZsDN}Z*wmbRkd4{NIV+{We9}g8^=RNCnGhK{+N#MWNy1V0l zEfcygkS*;2(9ZqCZ9XU{Xd7xpC+AB`8#>vQxLD9NgbPmV8~RtrNRlU@Xl3Q2=O<2Hb9v9Mvpa0BPQ!|$Miq!sD#25K~OHQ?%8A8jE7i(z?a zV@9;#d1Yw)o1{dIA&|u2 z&EJVKWIsd<8k%ilVM^HAq|pdzTDv51l#&R>{6Mr^bf@(p%0RWtr~Kqipy6j01*UWfRI}Z#NQS>pZjg%R5J4^h_NDS-;B-MH;~vkl zKUP;Y2H4bKP(!d{lOarX5E;#Jt)gMmUDAk{KB44*No37c!uloW`m zh8ZFq9Kt6SB=O_C4dMZ_WvddQrn?AQQAHaQTIpqhH435yqTL2BK!!sqm09v~DyaH6 zm7k&HH5N??v2fOxnj;A>{BH*>_#%I&-V7d~-<0ez`ylyI5*`3xVxX<>Mes%Ncnq|b zE$pRs5SjLqq$HLK)c5C3{q53(denN}G!T*nWXx7N4?wk|bj<(*+~x_I8j{kFIk%b8 z%|KX{*`h@y$%tuXD&mh=i=vBME- z8lqnrhcV?8W~YxI$6J}UApJq@=6tm=+7-mm3x4b4X$)1;_tTs~OE4TjRf1w!8Uwh8 z)Z8vxKd64Nq;{D##obKLyy9J7%-rvw#X(H-uPqT&?$d%N5tQD~93oNprG9{5a12-N zBLP|A&~O+Ch;DM7B6DBjt5*7 zERuHpZz@iE$SXPJ|8R8XaE{hpA>z=JSi4y+E+@Uh#FCAXayj_?S|&xd5UP~)w{|Y%|-DOLA$(aqJ|-$Dojg8 zf(D(iRxAnxa6cTh=>2 zMV&a1Qft(RaPO(hyU)|%sogF(xPmKGjAI4V*TPPIAd zS1}fx$=R}MC=9bXbG2S1zc@eEtz}B-hTI@llx05@9$T$O{)veN@_mG0R}a9S!Ok4_ zV1f%1e>HH?|CvsQA6@$>q5m-~_)k0e%S9>K8Y{Z#u}Tfq^Zp8#tH}EY=>V&}`(+)S ze|67(`FwmZku4GxEa(AR{Z4;n>yjCsf7OF`V{h%?5u)WdNZj>Ve-)kvdC-fKn#o#9 zTFIqAECx=DS@*i~?^%NFo&cHx9nqs!~CI42T*#7PL z_l5f%8T^vpf;24GVq^<~NC7C4UTF$AFgh&_Dv@JUj6{O42Mc>8RV9;5dDs&{VenfwQcgQ9 zR`yg_zIB_Y+n!Dv51yKXh6or`;5Zo*lS=Cufy2e)AEno6zz_?Dnmo4` zi)Jp@PTH)q&|PylW^ngIMdISfPIvr{f-L8s1<{M5LZk`Y%>|D+G=I9cDTpJtwA#Q> zk~4qAqew~CDj&bmHQOklw56Uyt1C(;P1|US#aOl(#C&s0+gO>Z3QcXZF2OAbzOV=k zJs7V3S+4wX6X37N>VN(-Jvo^4%eb?b4KwDK7?x;^#Nv@?K+*38S#nyITqj*Ol_=_y zTP@_U42sg9vg&AZbVTTUd7y?AGvoP1Zy4wJM?->UzNZ!YfvanAIG!`^k!IxIaUuiH zZ3!q*+g*f>#C7`8MO_lo(+5%L(ovz?&uZDtEnx^;M^*5L@@WwAoa=C}4~|is$Nl_1 zv+7pX1U9On3U@8qk^B;a2os1F>SuXAj$}!(y@PByR~33Q_l{O6dCwkDYcXkJa(~vZ zMrDb<|15rCiB1LYWYk=t(mZO}_&i|lCYK$pw9rVMyP$wmucjXPfv1|b`r78hhkQXM z^Mln+7#f6IXHJjRg*q7`C;KB1WoZh%ox8%g6GrR+slK%SigS1R;{7G#3MnvpAZhMg z4@vO}Xv%v2lRCFxPI%5QZ@mU{hVl#fZ;?fVfX5)u^4No>YCGCr^A^_jzp8$H!)Bv{ z{lyg!rsh>NEKYLBdd>%DDvN*h$xgu7?*bXwHunso`m39(c?Eu#R7M6#|ACbMbckW8 zZVymWUP}oS!!uB4I^6$j{Q@*bvARxNzI?cUNFzl{NjnZ|-FUn&GerrZ^_z1oR9F^B zGoMwRcEv=LE^LgOLynnB#%@m~Rz>39Vi<~v85zad|4`#GxoR+Pr~yz;y?!;|{`y~I zKui6k0XBIYi|D@?yn&(xRDjOK!v0y2U6m*776i~#EkIM&@}(psW~GOI*53y}KwC(F zX_^GWaEEB9PQP~GFJ;v8B!!e!+=J5O>Gi1xycT^yP+w1S&?9%%C2^nRc*o8>Eq%>s z>xb!O?uAU$TQz*RTi#x&8`m)W)`*62iOy3p;n~L$5;YG;4>y4TR?!$xv>+0uk~N+- z+8qbod6ozirA;UWfJ-ug;tV1U`b*3>sO9r5ypPoP=*>If*#`?#C`OFpfFTE^GKlOB z5XTIe`IRn05|RiEs_9|^XERF!{HgFfi!wfbz0Az9*XZ${4L9~jU?f-2qC-38`VJ}JnQDrFGD6cG9j!VL^jWqc z_MJ}j{M=v6*6_1la?Lw;9w7DDzZH9U^+l9rM+TFKFwOQOAoNFdmUv%xhKm$%$P&Yj zb8ixfDOqne*{U0{Gg47H3@mv||@t7Qj$oWFlh`!9g;0Y6`79&83IZ`Vqp`D>l<&lc{EjGFjnf z3e%^ygSma)Bazoh8YuP43joa!Fs+411_NvHWmVg(uAqMisrOB9i7$0{gdZ*90kDmm zk{T313yr`D*%i}rDAtp*EoMR17NJ)82&D4?WlxoK+K9Hj`E4?PKHm*{W#a>T2k!%) zcI^x7E~oSd6z3NM?lIsYd*)+weZe)BI#~vKttW-!kT{}SpjWf{WM$+`B~WPgL?Tio z9DEln+Q8@_hzFAD*aW04k2u7#s7BLtVnJQ)(}C^>tOyN61Wh=@Bpja`CvvGB4hdIA z2}yyu1pd`~|DB(3F1_ytd~4{Jhi9pU4M-wZpaU3hSD3~ai9*B>OTOEo9up3|{l!!Y zy{=2<`|xzi7u?nrx!=Y~GF!9xh$p$geb5l()G#PeL%$#~namnqNWb3iymdg^cxDBxt23W+ntqza zGb&A)_Vh5~*?A@R9{Mk$e`q%OB1zjG;l-hF6;31!DR#y%7tFuAKN!=u3`!WSG0u!~ zPtvvWluVr^9Y7N6nhF>v^Mh1?l@n}LdmG17b3nn7jg$=lM(bVRScwf@H54Te+rgJm z^}iSm3~45eKoSReV;wa!Fr}{>IGzhUzyO|*8tu{s9gYyEPYsxL(tzC5d9a2!|62|rN z|2T5QQz+KM!T-ENonws&=7X@Q zWAvJnZT|(k7mb;)6lH<09d3W0d09uGA45%8Yk4kX{$9;02~GFlPG%j*JL5PAg;$y!U` z(cuDlaM~E70yN6_WZlBkUUxBfb7xH(p;to*_!GBjI9>#MeWXxiolG!!1HEzgQ*fk# zP!*_dR}kv*Zqbiascee94@DWTxdRMuE@4dV3~x&od-JXRD<@jKblhqK@VZmjO1xKA z5J=!)4ar44Wi`;>07yW$zqDNI0gF|AE4s1uGNfb-yStDsBcn9JDq7{!XORy=qfp!N zU5q=D>+ZUTrU5>_jy)d@uP(#;Ip53S^|xmeqj7}Fvkpmjn{{zJ9U9pZ6{C)Lia3($Y|=a#zc@Hz0O@Kc1ZnzYx=BeN#Ar*6XEQg!q# z`Tw(NMne!hz^Iw?AH_=;^f++m#8=|USaT>yE@sm%a5OBY)Ug%9lu}Lm^-}^Ck9~^S z7aKYL1@cx-nm#lLUTd_=4~OK0Y)8|x`qjYeY(IT?Yr z`1hs%VUPpv2a#)4WC%xsc641bT4=JFBx#n%D9KR=Uho zbY)$!W~p_0{p3}$?AHxbeQitvbhG!4I&f>``dgKSWEnmWCzINwr0#R6TaTngotnF;*NbY+%G%g3_mnkmVnk zkGAZ4E0LsDG8uX6p~a8r{%lLJ2a`X$1iclYyG-z=WITOjzNh99ZxO4Iv7zwsX)&~H zR&w=bb-h?Woi3|l%mFzE-7AyoB=YCGbV2ZZj-?V$9s0@8San? zJ1S((dfLZxeOs*b5}J4^XATm9qVRh}d|4-7zYXid| z%KtCv68yiDF6Mtpm*M|^q$^lh7VBTqg_+i~JR~&n5AC93q>{NlR>|lJQ--nV=arKr ze9KkVK{89NArj(*{ha|6MI&HWpZFJGRBh!q7?8eX{D-UmFyJJ#1k2Vn$O(b7vFQ~l zv0N=2a;=OEH2>VNEJynGH7BRF#T;U3LyXYB&hhqf=W8vn3gn2~6Cz&?)WhP>R}Y4g z3l-5wK!6K%g1CE;C==PswsxA2(kI(qVAQe`ISx_tTlYod$155Lnx18-1;WVKqttSs z44R6MO6UVS&(XvaTL%i}N&`tzcA4dxRO(koS~m9lQC+8#RG-&Q`?!o-k&|3yJ7;E#iOY=&TwQ3c)uhgk-*=o^FG;4_(yc4 z^wi*wOAG))om&D6IH|K{FNlmn4c+q4W%*2Ba~LIZf@k2D2H3yo0zh=Bu@!*Q$o%Yia3AE*P>H4H|y^LQ?7D-d}`R+!L(R_+&Y$u4q$ zQ`i7;fB{O0g^lB|K9MSK_EZd3DME{P zi~@e$$^xnudj_4I3~FpqNRN6$GIf+$WPXc21yZw>eds<@DYx=Wbh^@Nre(L9_2>5( zjOh+Qpx;gniucgHE=eYasLgz5mRt|OENiK62hWmwF*FN22Y{TsZ)Ec_MOmr;{j zm|&a=RUNrz{SUtCvOFZg@e+v`bt_-(=Uox3Ljr! ziO)JU1svP3oTpz%IEF`l*uiQdOI*}g4B~j({&j?GWc(IhbmPJXn6$ zLY?(G-TKl4#DuWP6+d~k_)xNtm}&G;*H4tRiynXZ z@iM90q8t1Gs&4j#;veQq=fV3>Dr7=IY#zNKCf$lm#&T&_+{@t9VHC8i*K$so#M(OO zR86#^F~HaJTKWQNR*Ynq9c`0x-ZjW&MItc=!_ z=**=2Al0Bu{U2nQs4ItZGCNKIS~|qgaCUS&w+0q{SWRB#KyP{soaD5@semCBVBUQf zs9;(^WBCgPXlSa2MTe{CF0-r-L978)3U&3W3;`BE+Te?`({|Hv z1@iS-V%DKUB%}Dw1h|IY1^pJSb@3kktld+riL<+p1jv>Y7EnZQ*~73JU~W zn_Op$-6|PU>frXFwKL5 z3Ko&#e6VqNj78lY$!xFos;5dV?Ww-1rl}@HN`wMK;U6NzAcPHgk+A?22|U6@bxbwG zazn=OJ|!HSlkCu)pVxRxmYnnU*5uriHY=^_UmTzjQ;PMJ#KPmqz63EipFGt#SWJCI zw{v2-a_f%Eq{(R|?Ea1yQ~fjYYlroi1&BNgH`YLLy^tpSGkThrt$ke##X8T5`l;Uh zq3pUZ{t=mYsyvL8$x~M{3<|X>8u^zF0YEl2R6o3^Xb|ig2m|5;X&SD0(1*QDR~(4DSdf61@(vz{)X1nP4T36lRdvc%D8qf<0O2 zuIM^Bhh+oF9Dnj*`h4Q~kr*DMgkqOE1o8TUBt4|bB`vQ3R*AWc01>nkUIJ>2gri6k z!D7lt(iA>f?LA?&vQ|nza>hWFBRy_KIyq#oZN#FGUqpo+Fk_wsbOqjv^6!7-mh7(k z)e5()np?AGZCF~ceJyp8PMJ=2Pn{fGUfJ;dxw~<79{ul5YMjG!2F+HM@jJRlfVh04 zHz`}gCo?Hz#0Ft*vtxDXX|*Rf(;6`?xO(JCR@wp*WQcRMcm-}UsSg#Gu$m4YH-}+q zBrlcmS(ljMjsVT*(_qt@A7h*&bNpwe{j(g3urr21zq%t+SmtT=7gLUNgquABFIcQ~ z)AQ#w#k&O^JDBt+7@^@*I-8q_@|IGRJJjnZA>p`Kc6}i%D`Le&gU6I##zCJ;n(2t? zWh^48>QR`bRC&wL()2Ch6f?XW3^Xs+&I9yL4x6}nde41%&xH@nD%aMx-`YCOZNL24 zRueMNdWNf?507j3C>aeNj8^M**OZr;hnuG`{TCicu4oKO)oQMcZWgOHRP>`Oi%lQx z2&QYNr>)9Q-7EvPToC4uT5_-3W)MXd6Q0Vsk@3eSu<0DK*rGk>CWfkPRuH-Hn56cM zji&{dFGm%}Mq^&2lbV@)6X3ZwS~c$)PfTe}k$>l=L`M!Fv81zTtlz>iPUS$aJ5-7c za}RR32MHjKs$l5`q4$`xRmLSYWTtH1a9>l7%Y=4KS+r2vvLGSw5)auX}Y zRHueBGD`9Sk(3mgRBvIQ?&eg0q#T1LmzqJb^9^9x#&9S&B6I^IlAIeLIukh?V01el z7yqX5TX{$hT+kK?sRB?k38&t*1dQ%U+{ELNTi1>_1MHUPAtUY_EgGDb|AKMLfddfG zpC-P*LzZ8P9spA%S!*;wq+zUOQ+g?c{wM`F{DytHNGS%!C@^BqA>8G|^I115H*NC{ zwk_UYvIx>&f%*Qw;-kpFGlN!H^|@48WK0F6{$Fd-H)~&C1va!k(+UCF4Tv5JUpuSXi{2xXr7T z#8N0xHFR1s_0wR2$FnZK46?_HC*TJ{VW>LV63T_HXp%k}ac+_1Ruxz6_>`53&T!2J zw0MFysdy8Q>zpe-5jRS(ZsFOS}rV8-vh=4k?V(;Pgk@_&7Lm@qP7)%i>J* zzu#DgZJF1)>veB>)?fM8em?eI`&~b9z?nU=KDwv=5N!|b!_yWQlVNBY4~N6cBv`rl z;r>zfXL;wsrYa2B?kz4`ws*zzb+tk|8n23u4J|F(cm3gpJC3c=ZX`mFt))vV`Q{|6 z1pRYcwf1;TP5LE+fHi*V(=a;PeH@)~F z81fn1Ut?G6!`!~sJ?hGW)c<`8ONIVN((rEq!hduP5*`iYSx&qPY^5xee3Z**=Lg2{sKQLB6rn@Gl@il4v=TH@ zt`nf+gKG?$j@;?I0-9J0nU!w$U~1w(`0_#v`$WNp9su3=zqv7_(YYq{`JlMn*(3}t z(f-IKVkkYDoJ(1nER%Vfl1|4)bR$YdA7E+x;b8Nf;VAK)zHHgb-G;hG=7;a8(T8K{ zgQsO=CXG#=<38nEO-K^@3Y?pNtTEpT;7I#gGJ~jGk z9i!f1!+{TaKAb1bpLTyhy7xEM*73-IUBv^E)^Db*=eiKczI}iU6#re2=}=0k0^iw z29_KcPCuh4`C^-5mel*(x#=;M8VRVOs#vZe03}0AQCNT|99&rjR8*U zO9wPNiTBlV@t>1A`Je3nZ0`JqSyI-KOoj7!pI{*8bpzPCgOh~hO8tbUYtl4mp2wem zNh5!EGe4WHWTgdT&ebNANot*{)lH{xZmj&Tff!c8!vkl^4Cf^H85w4#{y2mE6sI#9?@M zc=yZnD$(2lYUs~qP&JPgEu}no#RRxp zJDhmEkHm*0R3cD}K{{YcCSHt6S>|b3Gs?&{RSWnMqhu&|&}LuKEa8;K=<9_xhBqrg zIMZ9rkZ0*UaG1d4^>U_+d>*SkZkbIa=Vi%W^vc{}oMb~|%3<^zOfsb@gugYX>9^5J zccPo?tP3(7h?l(&{S}D4k6$pxG+AdCB62JhE7UnHj;%bcAaA&fu<}CNgV4Bx=~m*R zA?R;0!sv~8Cmy?!WJmk(0G_KBH{IhkLPGf5fTF*LR{uHUobGJv zgX$BSgk*eskQCovITStR>)PWW=wAC&81JZN zFynJFQOVC;{<7YV;XG;Qziik1{N>+t2sP0y+GIUlBG+b`FWud}67A`7&=TXJRD+-vajnS!U9{WS?liFf#72TS8NKnoD%3LIK=V#E(@N z-KI1;EsDq@sNJUWwG!DC5v(210QwAC9p}5qv|Iy|FFa!C#j{d)?3YuPhuM)FvTd5A z29_!Xd9~tV*b5Bst~$-det_(#z-sTqCp{8?Z0qU$_~|G2TOKUp={BWPsjx@r&C(_7 zR@yt%E$+uSZs}madc1f?XYu}A>31}A&q(=kk9tgu*b(0QchAYZ`}t@w@b|EO5Qi0S zk4x$|Z0OhK^EF2}y$2vvNuC~55DiiAk60V0M45QVx(00~hswqA{I8@T!TBb)x_UQL zcd7W1r8OU*2>IQ^-ThtASEw2~lAb_z<}0@-k%mrs&j&yMZTl0)d$W%{<1)mfli5j> z$e-+5Lydi|v+FN9*RcE!uOOX9yYC>v_^iBvq)lm2a3=9MwE-(Oi#RS=PI}zOn5==1 zv`i3B6#MzV$t<7_@D1FoOSOj2P{`!s!326r)zpD}{N!LH*M)0J8%A^y^MkHRR!Z`I zid%GE-hn!43KbWr2=Wz^|0(Y(K2gOEjRA4#o-Hb9nJ`3xIsos0XA&-o1V7|m#aQA9 z>#}N%_eN%CNSXI@aIzYqO{E;xX#yv0JR?WZ9OAUfU?nuqM~z30g?~Y*2AH)OH)e#i z69Dnv4_`u8Sma+=w~a@i#qOwr$p7XjG%}b&b$aXzgMN&?cpUB)jRm0}8`bst&>HE{{Qnn#b zI4`KTY9%Ml+$;zCrq#cT&~DTrUzsPUXNR8%Q}D;MX{>^_I77-f_7HWjb9bMekkZ`+ z#ve}6EG$iqa`bP%ZMv`Q$s%ywJY*W6{$_Ascu_+ZLS`=nyI%&dGA3kV?AL>@|REi z5l2x^5$WY2llmDp<*`HsdXqin=HsnhV<1YPLKzTTo(V}tHi7e%BtnQ8*^DR3hrgu; zQfr~4Wsvh7)74@j*Dz>?i<^Q6@<<&cU&4;hWD*dOQsL|25$Tg4I_;Iu>5H>0l}i_I z#CCD_h~Hpi`gzRDdjtg?`xL5+zw&$eq1XC}x-RgZ`0#vrLW1>fK&9id9g3?r0Du^B z^HTfZ*SLNUCfv`7jbQzKWf`OA&ej*C7d;A|a2C=kqTtB{kv0>IbYiC(YDd{aCU{rF z;xrAsd=%%JBm}hSi8EEu*GUXwBDVO|(O03WoO)#pO4DVbk_R37;tnzs*a&HYZEq%n z9LD&u4It1ITKLvzhjkSmHc4Q@UUo>AnhOVAaQyVkl~1<`dTH z%x=f|B~pz^8{OHfcAJsUJ=ZB>wdd)$na5D9e}C^al!m5S4gq$212Ug}LfYo+WJBT8 zFYkOcw}N(~Z+X6T5Y1pWxNTT=9*DP!fOUZ7*|!xvh<~M1jwbYO+YhpG?KDs3Pgx&r z_zKoq8wtYHU0@dwy`LU3J>u?-miL+ zL_hX*`CixiLXdCX!??!$#pMCWB7N8L7$jvA3mr>aOEy9KPge84^O^Ve%1Zxx&>3Y( zX_2Dg?0Edw&BXLL+Ch!DkX~%%jDF zp#{i+!KR$99~G6P1d#kqkP@N*&|z9&1TqRHAK~H=Ijqr@oFkRwoIq z!odLBSL0Non4_8Vd-Ux1IuK!mn&2ukt9qaim`fb~jRQN6ZE4=jQpQq}L2X2!9j zt3eHHHR8y!K<5fsLfse^B*PTDINWMv3kpNIQrbX3nrGJ@&?sVwgctEizm1lON|n(m+XU+=ZtEFLRg#eaLfPOP zYCm^#BZ?CkSul7DvNBxmtMc1X&L*j}H4uL7;zA$HfwQO&%cOxH^#N(Oi-8o^3&Q_g zAlcV&q!1NSCQVu$n63;GNjz<@<^fI*P%$eu91AeYka!v5+Cez)b(V8Z0Qlp*7J zk9yF%b8Ey)#l@Bh+|04c?ct{MabB{fb=>t#Od#Z#E(%)C3Mn&!dU7b}^@vR_MkR;I zN_f<>8|oHUN{p32+^@37mNiq^uE1urR_7sT7GSeA=^8l)R)Q-*cXa_L>|smAB^@L7 zno)D{i&NY^KA*Mh_8jgxgwR5cN}=C~a)L9w0W~1L&vKPN5-4b$YH@cetWL&V>+m9O z4ue#FR1Jc$bHLD<)s`TA{{jt$0yY|C8}}&RilF%T!Bz z+2u|YmODUhI;D>Da@m2Dpk(msy9!`=0AC$HE`HRK}>i1T; zag})oq}k>YLxEc9p-%q~n?oD?7>K>O#-H{N4pYJeb?dAlawM?Pcx~app5iw}LPe=L zzT}Pa#7DTvmRf(<9NgYN59;`R_OGIse_}U*oKk<3mKY9hhO$rv305DBY-5*Tk>6*F zxNC7(3!B?|JhI^O;Wcw#sW208M%SE73pQ|0qHpeDx)3o%_j9G=12I`JtcRr7S*hW^ ze8w4N7u2dj^bGL1s2Q1MJ+D8>|5QMBLH{I#cWAS8jnz7GyEj&o?jEdNv3LqLU*zY) z#?9R|ygeKvl8&pV%U@}A+4kY@dHdSGAoP2)@_9Je_`W?@xD^s3%JO|YeW@c*UGt)5 zM!Rkpbxm}-uNVG6cp!KB^hVQ*7)D?l)a>Jh%t^iI9d#r89eGgsF$8Bp-Rqvj(>MK#T7?Dz_ZD$ zHV#(({kWIxL!)qUmF8D`c2BIQ@COtORz~2l{Halpx`;i}YxqTLc&gJ^d{{qqAF}NJ zs6gUMG@+GjJ22%>VL`Ar9vQZnoj30uFKAE8V)sD|ytjB&@y4$#bak0WUi&?6Iq5A3 z^IFh#`NO8&GuL5%rc3Vaw%m`=p|5=xPdxS&gUiw`QCs;?j7Izj(D5SEd3H|>oi<3PkGO2q`mIE z{Ny}eq0zH}{m48k(fLxJ{EpHrp9wDCu{yeH&{OhP=h!IB<3cq0O5JYEc=r#y)CO5N zwasA*D_GJEZDz_g$hH_ZcD~SfFkiFSuv0&96&>HuP0=DX_a-Pef0?8oz4qr^-%Tz2 zT%p%}^#iS4hQT>wiRJbH*ed;-${abMdlc6KMVBgttcP!o#7t-sz1!_ySAHrh>S)eq zq#aX(Q+kIP$O+AP+DCmw;0vnV1r2ZPB#LP!qUmhh@!6SdeNgn@@@iH7b6w=V<;-)< z?1mSu%U!h@-4!6rG~Exz=MaQL`Wlg@k{=L=V{th6yB*y5_W+e|frwA3+)6ly+{6>7 zuY*uLSi*~Ol+ylV{y_d($h2sut|(XTUBnG=E5+HO?((Sg>7wt6U7lO`zz@e%N^^>{ zIG-{NHFSkv;hqpu4N#QPSfaG1dEnkSLLzLP38|znK4yrt=pEzet${a9MX7RfB=Jb1 zh0;;swKmrZVueuKq1?2pS;cd6l4NJ$1E>hht^EOyUqZ^YXiOQV?t_z6J~Sj({>m8Z2TUxrkyJ18&lYk{7G{6}34GUA zo^e;HjNE~gPE>Idn$)(`g+X?}MCs{SO|VRL=&MUqNa7Vs&y0Dsernb`K9L8l2$_zA zw2ZJt$sDYHclDS^c$MX3G%8)Dh;oTYwn++MjjvB%HFKAbc+a)v^$k1qY742sYXs-$2S{Yrd);I-*6j)c1m)RqA${S;?J<- z`{$Z(UR)EzyP&o)W9#)XeE1L6LhH7rz~r;h<<&V+^5h&h0dUzof~{T3Q$o|k9v&NT zc(RY@1%El0&jrpnc5+Kx%}t9&DsWBitH2g7GiWFM%vWlph!(qwOFGGWY_E4E=F<#> z4e5M@{ab*yGD~cl)~{jT{gt<7p1*gA`+kCX!>{w$8`kLe&Fj76y(g_6$JyPUyRAb& zexNV@vT%1O|Mf}PKEkqR`y(dJl6^IB1gu#@pv>TSM8NY=w0@Kr3%Af#4c6k^s73LPPX8E99{B#VwrT37% zSWeYgCTTC`zD2yGU%7UPhn5xh?8@}+%g`Now~{qxz=iYe=5H_!aJV6yHxAKwXHx5? zWSEDm)G6Vdb+Nk~2+X_CBFWISbO=ScP{#5Exf{bu!|4#9HqI?`!JE%+s%K{iB*Y9Y z;4bn-i)R2Hk(LyYzUrD?G%6!0(#s@|KBdZP2-lr>Sc)RFj)s(-N>L;tf8X1^4Y{aZ zP%2AAN#fhVwYb2sTGSg6PjDZ|a0e9G*8e|RH_suwK=`aDef z;{QkN2Fu6NL~X6pC3%`&Jh|N{xutOasmdlQ$=cDHoku!_q&g^O&E;rPJHhLkVJ~v> z1c8@l{OGti9a^c2Vb64xjaAIv_1L!%NAO;q6(N(XlL2m(et1`k`1I#XSQ2s_VIulcR&7sbeayh=6(d%H}@2)k-N!_1%{>@(xBr9W=^FGTV3X! zEkNByUE$bAUr-fh(PyudmrJ0w5(*AFC->81lTLkwl*g+Iwl!*&=-f#{ex{th8iDrO znBb6y!!LyP0f_tH=xExbnOU#DzQRB`S1>95DT-{gcLw7Hwnejc{2-(gc5L{UoKv%A z@6uIkvKkP9V5UFNgfNoBF<7Xc2VmnTo3_oM>GIf$#u7NXRHTx!Ya55405BLCtV5&( zMKU2Q>B$Lt8b$Jvd5KM|!Jm<#-|cI;541mlyiJkcdYC)_u1eBYgA7Qz?sAMAS<4E4 zfVM)&^3kL)ilu`UsvLiwONb>VWyW{99}c}W)d;31YUk0ttyTyYxYlqgs{oY`y`Y}Mo`sAN++ zq8*NCWzoM$k^`q-?-|QhA-TCBrNq`f6%}~hNU7ufdeX;?1J$%dH@&69KE$Ggzpiq| z8&9zXWsAizU#no8iN5LsKSj)OhTa>kJ{gT6Kt5<7zd z=HOLZt|{u=(W=JJF{pZRunGwB?-nrMFfKrV#{+F)r1c?khbnGT$i0sA;1sq1l0A){2L19-(Zc2Jg26U_}it5yw za_Ho5;$gJ3i0ov@{6G8llulITMtl!INLA@=`QLg-LN+3jbFeyC3LcvZfP27GALSu76I~=N)ojmH3+Cr_WxxYo zzV2}AhHLEgfl`Sl0O8x&EmR_8F&Y|p`|}JZmS(vE`{y||ir0mtA7T$g%|m#-k{=9usSpR-5u4zlBNK=wzF#d+P19)PJNN%;W*w9%Pt z`MaT^CU^zjMv|Ol5kg1FF4khaQS{V2Or} zc_f0Std^FDXbKe}KfVjT$pDtY(J*7SrP(Z^57G~TXI`i51lHl5??3>4-dkj z+*fNpwZj&8H2aeQ8=2M+BH0C5a>p!-* z9UB|9!HV!EXs9Or4$rg&x@2yny1TKV&wc>`J$j!LnW@o4t2+ja{K9Qna(4T7PtHgJ zXah|{K5|i*%-{TmD6Ue(^skD)c{aECM-Jvpe#9@xLB(4Us%*{asXR$ro0a$>Ox<}_ z0A)iFD2+N7g|TKX){IJ(y70ieR4l9ppWVor3!eyZ+;mZXG4+D}|2A?wIZ63HjU4HK z(z?*BIzT)C3;#Avq@Wn5k*1McngDWo{I8aYPEtvaNe>U>k4(vJK(Cl^1kDToEcjFE z{(rTSpWN?gkSDnu;YT%CExw+Bzs?;*&c~Z>Y25sAj+=KR7rzRLh!QYsv4(CU51$%xcwSxnd)k z@sm&7XkXBot&BW-JDPG~AtFc~OPM$e+rEk`k~L5-i?%e~$}Sc9Q8K`_$`x{-Y_bei z46jE~nXHV>=3$hy25{CoQ&5aYVoy3t?!lXKC8X)+DR%DMC*_t>L;s<*k*YPbp=a}> zYZ@D&iM&(>I}8OwK{wB!{7}G(amCbHJ69=Dg73F>vuj=`6U0|@zG`u!)FmE!EbouY zbLaRYXd)mr(w+hnLabAd`1!db%k|JvM7PsO zY-RBa=XPiM6_(*hBjM7hPDvM(mT0A!y6p)Y=7i@mX)LTqU{g4==AFls%q!#`3(7qM z7n7@A1b4c;sY9>|MlLki?i}M*Qm%+ovHIZG3T|-|u_P63ukf(27rTy=cy;u=kSnt( z4TDfdV;UKBUs+^}J2h;AYg{!Z#!()_1zW;#w5wCqPI{b|?}XhZSC9)`c+X%vL|b*Z zr-iy9mf~f1U~Yfl!Z(1wLWVQ9jV7##8pn`iHc#)-w`c|He`dtrVqmZS(yhwwg*?F$ z`KT7{;sGWr*S!fM!(7OExEsDuUa#inU=}4L%w)dn>=T>Dd=JE4Tw|EVMl28#A# z@Y?(d;>_3W>FWAf3D=9i<-qLqemKSs2}z#~!tze~Cj+>%25|^zW-%bFqJ+JST)_C5 z*&uz@?8-$GoGTMf5@?pR76%r*?GPyx+NavO1LLRs3P-rznCJWJZ9!#Nhd?!Krmc#L z8fjQMGVNwYNcq?~MkMS1hqr$W)9eY}2EnIn+qP}nwr$($vTfV8?W!(x*{&|L%eCFV z|2s3g*Y3R6eA=%Ok#RE5N!$@9BVyoD)7(!R?)kJ?Yfg&}rg^D3eQA2#^!dQnIZ+f$ zqAyVwXAzOoKA4^r#*dTPMTfJ9aj;Oo;JTCE4Ur(h(j-JxaL1lVo-_o>9B!IYo(H~` z#mU#(&5g;&?ei_hup~MznE(p;&&T7(!O10v4`AQn*)5_5p*vx0a%;mI9EKOc>=*wv zPt?+Vfpm*kz><1vSE^JqE^&iP|wZJipPv=jWGNz55?u>-;X8^S^cz!;I4BCiv3b zTm{$Tj!7{3?<1l`uM}U-%DdS{yH_X*Q|-s}92J-y#eE`@SK8l?e%+Kv*w@yt1CDkW zAV)|VaXuJ4lmaJ==C^x_AEP>7pS~U&n`FRBB{WdIi`hIrG3FWOck{OTe(XDKtGD*Z4#jC5yneP?+q z>8fC5d8;IT$qr2h5vzM_bt(QjPYMkWg?`UdPYex<{MmG^bu2Noz^a46u0xh+73L)t z8P*O?iu!%!EZSlEiBTxfNvudQ=*eunwcMYo7#O7F<;EI(>p^=Js>qW0NQy zqL@NevadnVr~`mPTNVZnjHp4f*HSRBN-@L`IkttCf4R;_yWctm`3CL-2YzYuR$LvtNd4DG*|E*WYV<^MnQYJ_LJyMz1Pk*fTp)U+(f zHjj3W1_sdi!Ryn+^4GMRlY=C5X;xC--X{f4NRW;C8@M>|0A8&*yy819X z-kPTnzIWhrn-`)Vo$-^(RgaOUcL~-}>;7J-`tG)`AawpfMOgOXJUHN$zgl5yt^@f0 z=3E3sol&H#qL&Cu_L}}Z3JDtFjGGBPbNmvf|D`k*`|}#5)GS4^;157U2Ht22iUQNq zt|UOI9&8+IBmT-`I!?Sj8*1})JK4#ks&$gaLDb`h-2K5wxqwb4vvN*gt)xxSUBX%; ztQteRQB9j=+tBOZhr$t$aPc0y=AX>6&ST=VFc+oFV+KciK?U>VY~8fE8;7UvugG<# z%1^|h&Y#z3af_W&ehQaYwF*@98r#rc2ckCPJ+U64hi>+M?J z{qA%~ltZQ2sw^aJBn1YhCNkMvHA`j6#vtw9GSXZ$R{UcXn(s`;nVJ-K+_d2tU)_#- zZmIZ~Xgy+F`B*LTV3RHudeBBANyE9O4x3u9^W0g(u*fMiEj>fn#x!B6=m>R3foW|oQZ$>&5}B$SH|*s%r-F&N+R~lrvB~6Gv~4CN z=0N~g}W^IX~%eYl?;P9b5Ah|WYr=@D7R*4U#=01 z8~41J6<}Wj3o#aUDTI;!c`Q&z*yKRZo!nOqJ;=#G^`s;}UtR{7gUqO(ozhiRb2BEt zhuTBIZxUUJ;F<=d4rT@KL985nG~CxDKd~6+iw~Xokup`4z7rQMnzmd=Z8fa zRvVe2Hh!-s4$lj~%e(sh1t}~)kidz{)SQ%|FBL!_E&w=UgxmWKAHwIElTGU^<2ZC4 znJ=pu{V&%vh0}!Wvng!;N1B${NR|v2TRCTHGzw|4VYQ*9p(!(0VyV@=ZP{c`&i}-n zLW3Qz=(eH=OvuL>p%c$V%tq4Q$0RE>Oe^S*P(v*halNutkDJ1<?V@60phoV&gSCE#L^11KLQ4nI7={}5Cmd+=5&*-(J=3~R5?pqYn$s= z1xHtBn^Y)B_H^4w3VQk~`Zidk*!0w!{0J@#N}N23mTf}GmufmaIxVF!J&`*xO3kbp zz?{pI~K*6I2-#9~4ZEPHyIGrdAt7FLzqeo%$ELqWfc6Zf9VNbv@yn7q51! zCx|NtX|hkaLa()kwZVqQhOkL5D_L%B+sbnHsI~?=o1wXx1sG6olLT=96eRespPVX= z#+v7%5(|^*nI#{3GZQq}#zdau%|gdvb~tbJmCQnonnRCF#Y?$gqu|3ILd!?8-SfgzIDD3A>u zdw{W`hTNpsC3GG9Gf05kA}tg$XOcPqIl#U_}B? zSpdr)VHa}Py>x!sUB6qF?s3Qj%YxD}7ani0yQOb2w~5PKAn<}3uzOv48vh_)UpKa{ zY%O0RAdTyd<0#oVtZgmf!R1ywqZ@J^( zVP@Y#5lCsVnrx}>25!DKLAHcLMuhYP?TZoWlsA&pCOx&R1@Fe_GH0BVKgHpM^_68p z(CACzm()^+=dCF)n?O4_ZUsI~Sk_I$nq|y*lnUUZt&h zs|=>g*nVO@jonN&;Z73sXNPF7$*a^a_pSVl){V*#={qEoe4_lDhAW)&l;I;xZYy+H z8564J>o&=s97ZR%5{979ZHJeBO%JM6xgwJ-BN2o72!(Sk#u@5$#Hv4}D6ohSYf4S3 zn>`sSQK#kAy1lI?VnV*-zMu`{zx^p*!NcbPz#=FTB(&7EP`@NP(#G$r%(_aYL?zN0@p+YCBHFuKT-{R_+pv1MYotV zJyPGJ{+DJ1P`SA^#T~7LLOw7F#Zk@5K*m-t3PM_EH9Pu0;IfQyJy#D6z&T59atQt} z1=FlgyvHzC+2m=a?~nhGrHZr*%mGXk^Mmx_KU}H9%p>jM>`YBbN&24~k<@||oyxNG zIPHw`?EKuxE^j_(a$-s?EkCnKE5i+)1Sg}C(TgV=7e*21^vK4x3ZM^zH`Vrc!>LV@ zvmYiz3|&1&CDBN2Jmgf;NX>bKu5 zIB)A#e%a2xlA!wq*pM_+lv>lWYY1Jz3hLsJE5FO;#(>3dMaoTvM*fY3qk2qkG$4O( zEm-;P{NPQ;_B?H4I{@BVAcPq{h@FOJ67Bo7dfa%%ztTCs;ZsH7N$<@<7$IjumoNW^xfJm1#d zV{dQf2$^B%much^rqIhG)@-x=1_7z7xx&4oK&qrQU&B-FH~Yot`)#bPjC{gQjrqCZ zcut*R7dN}_3{~xNt*6@?+G~#Kn*{=+N3t{Cz#X^;5Oe_;*lYA46VDv8_`!b}KEyK7 z7qGU(btjvZn2GEt>qgc>`w2TxWU?|hAe^wtlWj{n5Oq0@Ts{!K2m2k#p@=)MGTyH{ zZ~Eek=ZF0cUMre_$2I*G) zVA{w-iU0W=rn}}L_Q7(RD(z?imn$NpV)g6YL(XN@KlyOFN1IOUNtqUGg|g&io%~mV z+q5qC^E$~*P+dDV=MeA-6yX+df8H>xB2=ZUWho`}pt7r;D*53$s$aSStzw7- z+6Pt#_L6rru)oiv*H)wm)SqxmAPx44(7VZsVR-HuKb(B$x0{GPssKMgz`rwj{5>rQ zp5G8tzwO{Jz(YL$BGp6BvA)45rS1YsmU>b-5h=B5O(_bN|JH_tl+;p|3=pKV@&l?Z z+Ejrxy9P5elQnuu+P{fzMJn=ZIan&A!do_vTd^oj#=z!YoIHA#A>#-Ws2mS}v+w`L zwRQ~p_jpS=K@WuLHI<*kq?ecfVflCUY8gva>4Rec0trxd{vSEl{w>D;ajucU5_J6i zz`3e2_Ct(_daLCPh9V@Q@B?+IYLaNb;b>R$Skr=0M&a!ocAW_0P+)&FMSf;*IP}S* z2%}WBXdin@LSF9j76!j1&tEO+^=7Bu5X%RaLsjlT|Jf)ur=;>Q z49Rt01mue0{HZnk#~9lW6V6>qthlqK2B=OejC<#YA5a?hAtwa8RA^=#Ypp29=w=Fm zx-#avs5T6Iz1x2zwJ&A+rdZupGVhVRgwcqwGHDl(7K3`~&Pw)@{WT;R2O<~fe{fr9D&TJD3*kru-Q;%QAEGbyvSvf{J=zDuyxJ)mIef6Rw$pJDp6 zNf=Etj_8IeMqmIpI#|G8rp13P<9$TvrjNjCnzF?-)i8lriNL@*{^6-v4IPI~c2xhg z0I);g$V<+4KDdXRa5y?e!imitXv`+jbx~90;xkjN?C%{HB06dJZCAHIG)cOoQ(XU3 ze@{02h(<+iy^~ufHq0Is?t1o6)ZvY)@tMi#UyK_y?9tU@TBYe7yZ9eF9YxB~)4%LI z6f(ciAI5yNmLxB_d^&yV$n4?j#xTC02&f+|RfzykxUM4t>0zNLChf|zmbYFBj6YIV zmV}zpF2wJhiR&nel)j}^%4Fj~U!0tDD#s$Rq{inv(-cU1=TdS{&GjtQfuE)oXpn^9 z^F1+si{JWC%R$5-HqJK|)C-RzkbShTBGgjJ z5#5P$Ss}^I3n|d3NhOwf;`$i&rP%i+X(hJdW5JOqXY>nS~flDS(VD_ zXaL74VPI{mn9`Gg7Snmi2oVP#rAxAKNBqRw?eH9=3GO+JY3LO5@YU5)dNh&~wKe(p zL|0_Sla9cXfE^$3VnZiLp_eSsS;!vOr==VjUpe2TS_55Dl#=8YNh$jU4-JFoBD|3Ynnv*itM^D9Q3>9*g+zwQC zEHDSbX_l}kuenZ0qh(F*Pbg7V0kB!=$_^X*=X943s*C4kT7(qvE=vV zOn*~4)X#O)-c~k+5|)Yx4NLa1^aQN|lqmufh*Asj?+^jocW#H$aPuJ$bc-il~O+DNY53bui-3+N-!Qr1Q?ylQxmx>qQaQy z9HBD&xnLUX8!qMarXNvS$WX;~7-!sngiqxsqI`OKT|l@hVNhhwk{iXQ=())HbHT@R zn@&5}z1h0Bf2aJA|G8g_{)5sPhs3mc9k5z1LtHK1G!}mQn!pQaNd3TzV6Y2V8^epM z=BL$~aW{o721*Ar2y^c>X_qrPEunFUm-&1_%XbVL54nEYMD0gjJav4cVM7zJuY1Ys z=m44_;NR&DZ?;lJ+xIEPX?aqRyz&n(!Xglh)>MRAU z83a!by@)Z=q;2O741_jb8l)tuZDVO@MAKO04{t;$dY7Hw%QwYbFH5q-9H;ogbz;IS zTV%8y7x|8luyE#RS>bEqNw4zjVjt-#aUX9?0>vdCIN(q4rQC+-pJz-P8iH>M%y)-s zu0GV4*;~HAdLJ)bxN8ldr(Ezokca@!9G${vMKcj%lKi;;qLzh>&6Rw$m42Uqio=Mz z6Oyp;Gg;h&1Px3&(e`9Bu!P@(04f1U2)2!xR=V39vD)uN>AOeo{j|9sJ^(X+Cg^PG7IG_K>;sj!Z5)Lx$N(ROuYw98!wI;EgP177C zmi_ss-_0=9Cs0xFKrg8*H@s`9#+ij*2_!-e>A_2x)od$f9%%832mBI%4 zfF8~+SWl2n92y2DuiR@jNhCBJH=Icx_>9Z-HX45=*e^lHMnGfs&EgyGJWE|IIZ^4g zXP^KLI#>lpkU8+e26qFe^g~5M1(~mfl}T-ce;dS1p_pksUqjsWuG78 z*C^t_Y|p+h?;`v-3ePqpymONS#IVhjtNlvf1EzxSnG0B)XRxdC*6#0z2yjToA^%Qv z?)LA|aPW8$3I=Jsh*IclU$wZ=VmL<#iq(+(3j%07bF#^ALjy#3rjKN1u(KJOI+#HK z+%w=}|B5-A#WBGTF~W*jI73(4CQ8EpObk&i1GP31Mx)T9zK)X{1;{Q0cz=&C@Z1hu zp;D>jz|d)`WT0XTFh>dc4aA5cS2!DXktJwT8j$HnB!jXQyZB6zw7Ue)t+12GZX;ME zy(ze@6)dUaROhnHNSYyPZrkTH1kQUZd{WR($SpO0SDj6*G#C=Vq4o4SJb=+R$YiuN z{!j9@|0DHAFh<1UPkxug1W094Y{f!^RBADt8_aq~_oZz(qJZ5@Jp&X7r3y5vJ9B!A zxg4x_Ni%I@@MdGSe6*=otvuX?pv5&l6>d6ppVtP^RNakkOAB(~a0EGtp8Wu4OJZMP~aUOF`iJ_0CU#D9=)znsiNzOn&)TcYOVrB*uvpH-E@0l5kfFg*R+tC#wY|>T9U*QrtP1Tw{tm z_i>%soog09b$GJoPSI?vZou&Z^mQXha;n!3Y(HHE=D-^D`YFYc`~5AX$Dcz2jc+Hx z4b}`ZEf%Dz9%NOB3;op(cGVbQj2CIK-{|#>mM;TOP71p;ojYe&J8ezfjMj}raH!IL zYn0asu7pS66*{=Vghh0X$>{(GBnda4SbFxOTZ>ZKP&VD@2}s^sLOMqy+Um5BR1(lm zM@ETdK}lI^-YF%%K32PpGw+$SFxHn06W0=3B&@*<6R4P^Hm9d13=PF>VSYpWLrKZ~ z(Mf^G$OXBZy7AjjYwpf(FPt9_Oi)*=Q3=eng&7%! zbah*bm6|{Nc#paPhtutppkblTl7(i67EVNx7=rPMx@YBWEt=BFngcng!zBvA$=_b!6<6JBcE zUP7JM1~L9I^T}_=sCr58;DjWSlwlyKFN`d@p(2Fhq7=@=s-KHSkW| z#?erkJqepQ6qM4{x0xeO!B+p2lyF_JXV#ET$ex*X%w{HT+b323WlGU7NVi$SiAj-m z4z28gN#d3VrxyELcz*H%=9NYd6KGlrs|m|jR(?6$6CkDNDuu%!tePc>+}vi6u)IUL1Ei-wo+J7Zl{SgD#vN<;mv@Ft8apR#K8sO7m}Yi)6Im+{Pa)!3Som3 z(*8h`;x_6R5D||5_UIKNMj?@Wng8z}Vemv{DJoed`MCK>Svke&g(IV-0$hpf{`bD- zE3tAOnJalkW&)aIWB!l&le9r7%FmhW9R`3E z0V?a@^N-jN6%c~@e&qbzGFgVJ4WLs1z1RZ^MEy@ooJ9!a;R&NS$jW~_7Ie_FYoI{J ze>}%rAK^1o1M$g8z8GK>3U&v06W&Q)FQ$vb|3o{mU|cVO{+^B9bDzOBL#>m)V}P^4 zu=1JY(M?x!W~PZ-JL9;Lpa3cNkn=W_e__{PYn;und)g#{))WvyAsE^bNHDu+&IO|9 zRKHM|n=@|qvZ;>x`Xoz`D_hFWz!0|=K{c`_{KU@8*vc@c7r75Vpve=F((o^+yBFrn7M z*s402s>iX=?_r*{rMII?R)#Auaio9Z?S4XQAdObuEjq9%Oi`&Tzlt#^!-I|%I^pJ5 z^RrXcz;XtzZ|&rse$lwg9|^R1ay|ZQ&=eh&dyzS;Tb4ZGIxSii-J2+NxzKNkalu9_ z2b_cl)gs$2C3;j^=+(3G<5i8`GwI8q%ITI3Gclq$x-|lsGyGy+L*v0(R)X0sPOFmB zDF3PkDO%-ZFs?ipe0L_~Gx_kq$00wp10f$d#9Z<;s1Y}IN7O27)QIRCZJqjP{SFh4 zB?I!+?^V*}4UiYGzO`H z770w0I*4=;$vej`aQWeLoE2)mdGe)Js8L3(vn@|5f?q+VQ+3)ceu6&-l zXUFh>IfsbvVyluoW&3oNg+ z0Q0YkdJBBWzQQVs#lqaAfMKjNUkdYTN;=Sw%u0g&7;tZBSqCQKa|PZo1_(nN({th(wS721}1;3YVebmQT{uAHs5)2Q~& z_7p8~$HtT9nPEJsxitjYXK3I$k-B47Hc%b%L05K}W>oS@zVd~>M5)_yKVk*K-TzQ+ z3JIt+W5li2pQEYV`#1kW2(v3vm>H1Qon%j`b%!EObm7t539cGM<~+XGspyzvMb)ZH z%uLFo>KS$=;V6||{IXJMmaA7%Sj3*)X-KrL+Ii!fzFhu;^EruSJHv9+R@O(_C(E#| zT**3A({O<+A6uAXSJr*9o}|x@S+6fN(S66PnPisU(A>;5V}7f&MZ^Sv4x4cY+dJmQ zz!{;TqsN27s_AdUe@Pu4ih3?(UUU-Tj)~HSjkPP=jlnMDARJO^pNJ-oc5lk)@@c9? z?e@=%K3mx^8?qtIwwFE3h(L&{K+FKCmR@tz#!NuxriWn*_kCNqEsw*{USw{9d3{$l z+Fpe>1#>gSOAauu^lBM#eHQHJ=i>H)?%&laccCiZB&lJQioToZPhR;YIu0bt>iA$?fG;@gB)=_RZJE1t&-7#JYX*;rZ?p=VmQ`=Sw;QJ0vQA+Or%o%C3zC&L< z@|+}nv*mzj-?f7I#_jbUl2mM<#$)UMY`qm~P0-FuBa!NtM>&iq-9AiRrdO0X@L<)_ zq~Q2xtr$oRp<4S(=l6>wQ5{RfYGRaA1V19OhGFc^3Ui&$>d?%Dpjx>SLwJzBh1yet z9d%Z!VTjIR@t~fGoWP+d7NVa5B(>8oDXJh<2$65NtVT(nIM4(W;(JY%ojRh7e4cy{1*X{id#a-cd2Vq-%YS|G-w_EF)+G~2+m1h? zlSHo_xg}vU3$jQ@t3)@c(72&Sp-d~oNJqIEMzIT|qniG}no&+k%j8&B)bu>izn+9c zeol6fnJm&eJZX1zsHM$A`XK(R3Y(RaK>g4a%5 z8|P!P<;YAlfdret&1_>S|M7T+ErX8^=opm~QNu>zhsKrDcn??k>O>IQMx zWJDC~5=U}1Gadr~1Ez$G0Fk1g}RDi|K>_8=^W=1$@a z`~U(tkfBRp$^Q?shxqlsYC54aJvlQy%d?rXa<(;wL6cxJMcGkBMhH_Dz=3J_Beh zz;HVuJabgk)gdXT6y)jX)hQ<@Xw@aBXQb39=V>PuC28p<=jCSP)hH)5DF2F3$;qqT zg53*IKQcdbI5Q{z2S1SyLq0`9a`ZybTI|q_J2-=a-~KHWLtzFiv5Er9X4*zlHHMIA z7ywWP75oLzU)Wtuo1Z{AHk$blUngtn78xj}Xr*Z;RizJ(f&qSzLBVyP{VRAN1RuN-Ztf zYiOotj^`tyH==^pFR3^ily(xxvTb%8-433*P=xbj{WUwjnApOV6xC)w?;|kFt;oSx zMc2MnP`5ySJ?b6iX$yCBl4wCFfzmjVYX$lE>&S60BP5@y1Hw7}10saXLN$?dgC;rX z_zC0g^b{v@)pOW7km)a~9efOP8u~RE7jpo>E&;`|M*DX!z%$uti0wq%h8}=b4f4zSh#EA%f?Q0$LORN=ZMq7Og}v2rE$dMhl;^inWGIGNtt2c@B6+UxsMAWABSg4M`7 zi?K%*fqIwr3nR$5(a0J9k5gQx-MdJTYSq=ttQ`cV;Aa!|GA%qbXaLe*Z zL)~o~P2iFrUI~?15p7Gt$eIV4c7WY2OlgUJ_-$`w?+sYYlQh_UAEcSJK?<|PH?COv zcnThKIK{zhfghylJ2bmIVNfT(rzNYI0sCR5_`^5xR04=N#k89}3TvKl1C;7AYD-1a z)D2-1?-q;|dGJ|EsiWN&y*SXMMQ+0^NPaZy`B5Iia-$JhU&O}kMyEQ{=&4L_IK_mL zOpjeMU0S(c=r@g22)I=NDI88oVG^r#g1GczhY&W6R5G{~F%6hkTcta!!zUve1~0Ue zE9~0bhm?@K^1V_$MusPdIZ-63Qp#8jb`Do{sqKIkBs;tZeqCvH&PCIKFDM3iKsS@o>-YsQaBX8H4* zE`y)yNwe$;IXV3qN3?!kGI`#%ObOcYj8R{(=#N4xnwEQ9M5!CjAhN2Nw$6t0PMD)o z-W#F*3GfbbC%QKRA;H?!8tp~GaE3r2YE_qtG-MFo_2!;6gN@g}d`&$Wr=2HC_;@qy zro7)~z#QYXU1EVltHkGR6{D>MTI-Q^2i(cvpY+8TIeQ&2!ZKxtap8oqP=AcvWRsdM zFmG#GYGf^K^r(6*=~L==*{8428kV#MUALTQ#<#AJxHBx3|Mt#QpP$_9%B{6{PT5(u zUDW?@lbtvw`kAex%ErPy9om;|P<{?nANf=y4=s3 zYlh88qPMM97&aXk@hFA-oC3Wx{oITYiu8Z7>J&vBo1&)|P)|)N%+XKG&kG^R(O1$6 z{>lgzGvbpp^Od${t~yCs+yX`oidhy_4GJD9N}5TU`QSxeI7lj*>2XypoT*xVY0*`s zNG}ooG=#wb>T1JOGcj|LvZl{Mcx3MA&?ONL#y!;I4G|$fWu8>Xn;<0#!sdSKe5ESo zs`QTROkQQulJ}n_<#>ff@nD@$fuv%cH%blkgs4WHfRKDPC^W#&I@Gi5c36C_ziHd z-(PSv$rbA&LO>$p?61FmG8w~+xN;O7Qk%`edXdy~qak+`x;9ET^xZ=W-psR(ux`o9QNAHR>99TD-8}$@>H_?EKHAhTX&id3kE_MF<3+>|{1POgHy7X4{h_LD0s zcVi5TiV;k%k+s@P<_x1Mj)i!~lwtg*=_DM^O>(ax>%Nz~JXvRn-6?U}|Y!2MQI9Xkl;t>Cu`$@L}Aq z9Z4L%k&%_=y@e#5GS_jU;B;MRA8)~8JB6L2=`Tt6{=EKf--l-e?+^cbVbWxZ@$ud3 zt54$&KxTdNZs_32E56*o?mP371Sq`Ph#>*xl?W(t@+#{^_he?quJPC&Dvgk>499ff zU>9gcL!ie2;!$%Fjy@#C%s#oORSOXAfChaXiM*nG10bbA5WB2CWmo84cY{z!4;m$} zu0%&%W{Z{@nK)x#)2bndCV;=8JT*h}wLHUgaUDu>$D-%QkylgB*i*e5HB02-OkrSr z=?d3mzw|&8VTr9;+6Je)yZ(S}u^}bc$2K*0g)biEL=_ziulG&w_!Kfx#L$tM!_FN zpnR|U36UQUlY-3Ak+@PbcjO%zVwP`AQBv~RF00o&_SHZ_Yk!(zjXJYkE|z<;ov7rk zrV&Bqe#hABjlx35Q{fBbvvfbl};5XORw(-sI#q6Zd@&16E3=)J^ocw`A zeYbvc@L8=vs>0koXeH>Fy>3MkM%U!JQ?Rur5vAks=0ui=b25>Vx&$_d)fUCZeC5=m zuh^PevYgZvXcyqYiV5FPIs)GZv|zRNn9~K~DQBHLrLIMeQqM1`ph0dJdM;erc*wXw z8Wjd(Pkl9%cgrCQx3QDr0^~4J99LzgaC~jMxQA6+uND1so3wY4`3f9{@J#7ZDp1{% zsRPc-!|(#hQ}Mau>34&GZcngLEU01{em=iVu4N&bM>N__WQuMD*dlP^G*RQDEsEs-SM^JMqP8M#5UgzSaTKsy`HI>z7{!16|+h&Bb{xrq1;D@1$t?v>4XogMa!3o^2;F7Q{6V4A0_iC_omFf@kVlB$g$O{xt!4r3+x62$#RNvNNb*d$rXT_-#MGqfC4rwg$`u9 zA+H>rIHGU@p>D@K3HQ;H?K!WFB{2DkF3@L`RfbVW8dJtCN+xc z$%qk*yW6%Q+BYIlpU?&%;~zb8JJn$%E1GcCZV{Dr+qY8{=$O4lMuj$hWUq-_KP&dB z?}&O*GF`Qw+Xt=B1_eP2c?6Mfc|db2K?|UDqD94#F5RTU`T0{b>mSprp4^5iJEtb0 z(1>#9{*o`=t}9%tn)A9}C~~AdG|vmLsb9+Um9BE<4hO=4vs=RP43K- zN@|xE3bf)B3C_JIwOMhZxE#U2j!hpsrE;655L7Omq z!>@QvFz`ULIbs39Bg1+`Sa;X#pj;XxWROrg(SM0P+7Ha1WYo5j8`86!q2%XMYP9&3 z_>^@zQHmtW(|3%hQnGcTJM(EV;oIVBo!2gcx6PA1Fm8_D+TU^GLbK(#2wK2txN^6o z>}UK5T-N}j_1uLK@}TWtEXI&gyj*kQUey?~#TnX?Bjw=FBr;i$`eBuBE6T zcByso1y!T>kv4^2X06EInCJtEeLnD5#`MKsAy6~PHG|xJ<`W%qlEx2v}MYP}+Szvxx`$3o(qHR(*$^&nMlP%>l&c zpeuVo@i_m;jmy3v=ocrX>Kcvz@i@xC0{5YC|KbkozHwubzQ-eCp}V)9<*20lk0R9A z|0zs-6f;5$R{KBb5|4iF;2*w32CL0k=EVcUq!6I1#vFZ5FKtMvUTACL0JKhzj0x3>5h94wE(i=Ko>_ z4`p-6lrYK7rL%(o48tI{F4zKH|5I(=vyTVk(34!W16G08cJnxIBjRzhePDX8a!sQE{1Ksqdu3ZTZ*CxZ0u=3KPwM@sggm=L;(IrH-P zV^niB(yh5h z3bmWwn+GjHpSh!^mzA2S6RtPu%Ua)K3*mLh*&0&KPU4V}QanIkX^3+WG6--ra*z>Pc~E9vLM3mPnP&QnM|avbwD*95N&bRvyA6|;LQPxezJdvJrbu;i0Lv#Vo*UZStwKq{0pZJ=3~Eg5SLv)SpReq_<fBrWDS6hc^0Qd#Z00+SI( zeiut1`512y@Zq%L^JW?8{y2BaOm&h_Wrp6(itJYRi#S|N)n1g`1-(NAa*~z_v{fZ_ znZz=j$u3w;h&hO?wkXZBxO%A?Ll<@=o0bL{G$p}Hi6PCHOhfF6aIpy4P#OvF8iM@6 zIP$F~iz7Ti7G{i%l-^xBRRT%0x}FKy>KPi~TZEbPqC{E{mwcC`B?wJ{{U}K zgVmpHHzAuobD6-!+Ow5bA@{J1qib8s9#`-y4a%|>7v4($0YQCxJ()jq`4x)%8+E_@ zUiR1-!w(`PL1b>Sfx_CanHABjShoQ+W0KM`U->EUY;0RxqbmRg#2y_vhi?f7)N^OdQ{I}mxFf% z>`9&FVnXe`J5(?7cDN2IezCYugbes=+9$r&8LLBuS^R=O(Aj|s%f+g|8MR=a)*Ljtu}6~$_+HfA_mx}ZKfCY9!Q z6q2+@FJCvZFjx4{gE!(|U{?&t$G;l=M}2_E$3Bqd2~ zw5#1G{_$G&vqO+ydhbhX%elr~8EDqt*GePerc><4ou=~k&*$QGH(7!&Hu-- zyg6UokJs;?qHn~@ss$oZj)zFNXD`4Br&6zo&a3OtuM^j=aQXcNjhRfjc_jtt^jdCw zsb}^BWb9j(4k{s34Y>A0P_2dTWCzCSmhUFMz0;OAn(_uchyt|t!3!^xd2fu3X&2aj zL63HlIWS)F_vNkB3HlVoD_#0Qh%rACKORrI^S`N-8Z#FsnJ_WM?>pMgAf~xCMH41Sxy~$Rg0O^Lazy3C zv0_3WdoGWK>U;YQb7!YyitNoD`%ZmDVze`gpe=aIS)ItKmDsLESI9wH<~@k^gZo-1 zb3`$-IfsXTNPb5$ZFDa3YNjHQWrlDWnQo8n-gLPcTIJH6_fJRm{VBDanOK`E)pD8n zl@C!lC6}-4R~}w@(+%NjbuZWsy8P_alOcVi=&W7*N#jPJPiNgYy;pczn}{<iFFjaDIY{f;x9Fw!pCUdI3FN9}@O=?X-95%h9h-h9(m01v& zJOR$fCp`QBkUykAStl1wS1Bko#(!k}#owN;{uo57j%B2ENzIY+j3U(T$d(_yJ0dp0 znzSGv#QfR*`_) zkNw0kq^y-O1=oKbD7Y&1JEdme08o|htjYUv-+4x2&pzlW&Hj0cm$TsC!zm&_wW>Nk z8RKeDXy;iWt~(kLdT8NsGP>_|J`;1VhTUgJ7o`)PvVKm@%C~e@N=Y)X$&eT!`UP$O zXKewq-Rs`7#V9(c)#mI+T#pseD1zkDV_yqdL~>iF>KmoKy^W=n!h79M_9{7xZ4@U^ zn`P*Ppx)g}%tE*ML%MEm_r#0Pjy`u~SJu#~<&bV6oA`c2_mys)S7S(wBJ<_NaFSkp zEhwCGTlCwh8y7)}Qrsr}=%=>zD>x66o#}P?Ld%No8F=@z$vXgg z7getd*tu>H1&PscYqw?XLeFgH%SO0ak`d_~W~&8$odtZkDIFN&eb}wRVeXl?L&jggP*DE*FFKsRYdY@ki`SwGAzZhQ7 zGsnluecV=ri)zN8$ex zi_d@->_+#@aZC80-)O5Rs3P49gjYbQ7;R#p=V)QbG-4;F-vy4L6HKCgg~jo|;V7vJL@@ql=?K@gsa z80?}H6UY0I!+LvQMk@!Eb`Mk2^G7$WY-+k;cXj^SR;GM{^Y!v#{S6W*{CA+Utl?fE zAjSI5;>L-=>i+@we;#goUnz5WX=`6=F(G69C~;?heWyrZQ8^)FsWDR>aXx^*1RA|n z5a>SzE$LRmgCkxRKxn(5l~=&1o;jP-E#X$ebSN0BBVB8e9yw;6{|nSUwxS-mNGBge z(?rWCyBxBhwmf!r0F2?`3;H1b?_(h`G|5dbHX*yBNK>5ff3F5z(#5r=j12<=0D(!FWoG&p1{>DoDla`gM+Pw zkX`<+Rn>H+P>s=(n*Fs#yrpHGx|MS9m2O_L<8?(_7LxcL)_{7BpcI>JU8FKrWqdb( zT3!W>`P0^CNeD#UJw%wWQa28dBaJkc)CUe8fDBo5gQ#tlpyB}UzkuGZYyzV^d^o)% zqL~^!Cb)l6qhJ9U$JU1sYtOP{BZHV(NR-%&kT$ZoxjKih-XJ2}JFo1Jbut~vXel9f z{r&3J`=uW8oz!?F*AXI;Hj1XccRdn1={tjKp5M$nKUhj;)aE#x#Zl6HamEuaIrc18 z;rk30FjgJ}a%7c`mF=*%VkPlxaWR=q25!ZQUDRhP@eG!-)P&f_<(bo}#Pj!+A?6(# zI6=$c2!qh<6D3TkszOcKmd-7Rm%ukMh(X@%POi&K{eoMdo#X2tH;W7ey(}l&k`$If z`9;P|Bu`!YyG^vCNp7j>;9n8=qH#)J*+}9h^a+8&{lw!LK*B(<9tB{d8 zHCQV>EU6TR?f8L=D0n3sc884JRHB2kT1V*nt1mghwfVeC$K&9^xmi~94asc{O>AC` zbxWyWN^_hACZnYb(jBJDC9=E}z32#o?r>enoyo`&RZhIiij@f4-mBM`i*>k;Oig0L z{0*=3+IYg3%%}{(RLFMeGcKe>i)jf5;Q>mxBGWl-(D(tI*ABDo@*jA)BpT8`rz2&E zz1Nr{KsFJ=ax5LgwNm|R>rFEb%ZX~g zurZ}#pjq$FUrxpTTOUYS^EwO$tyyxnVh3IR;JKTaea-OkS0+dOsO#wOGL}8wPxl>P zA06v~Z}GKn(dwTNwNMGh&j|8%p5XK7stA4#PDg<9kEE?tl%XG3G+SC z7lWCBRDMY(kU2=RZe=3>8?Wo^46{+em*ljOCtlN7i3!cf{aThy4`5c?^9}hDggF`=SxocjS(q|ashOok+hk2! ztp$*f=&DACAY>Re_7`S%dou^ zO*f&W2JsZy>0CpTu}NE}=&Zm-B+;nmfKqN03Jt4;r6R#r@fJ7+aqmzpw|nuGJRKW8b9S0ISzS9u#bW}qy%q^)Es zpJ($^elvZ1jpk3{NAd%IJYOtV$XDvL+gvHz;eDfePCq-05YP(SBU(-u3)e+pQ3rBM zkd1wzF{fOgf)fE&(Di~S%;+Za?YQ*&p@j&Ya4np(-h%Z*m)?=b00t^xQ{Ccc_4>-D zet>7;)NWYSrSHu2j%5u|Ze5k`BkS3$*r|pZkHN2<=N))eJ66vJ`PHx2<|@|!jbqJd zT)(q(Cy8w}yPRe{>t(_8Tm#ikV`bjryM~8uY6iDSNox<)b%N?98M7PbnNLk;fwb+O zNB5-5IF~9u-<=p9uSCbJmWPn0MJZ&b>(Njl-Tu?C#Gb zV`I7T7+}7|$HB6%4JQscmAcB$I`#_iZpq`T`gR-o>#XLD-Cmki^sw+PLJhDy&0Kq(mj0RjE z{e4^F?U>{<9C)39Q6}*~Nio6wzR*Rg7DrBi7lDdsNL6FR3&AkICl) zL4Fl`nCE2^a^fNuNydI6w@iWHuz9|?y;#8GNeZEW* zRA}Nv@U2=;l)tbOfxgc_<)nXCxs;*sR1PtT%QQj;$~YE`Td^>;$86Yok9J=8ufpp4 zXXmn;-+uHng_t{mm)2(hcW$?#Iie62mJDSsCLNl$X5GNqFBT=dCzXZI=Vg-K2lUcm zMP(aO)tkAJJXDKinpvrNt!~!~H}&N&oU{>aZ}qq+k(n`FmNaVU+`PAd?H)3LMM#YT z%lxRMG@kO>)rNq^b!Ln%1?(UcN(f$ALV_6yzU!o|U8`2RBWysTRq{-POw`sepZ>cUFugv>0I;R;~5??#zA+$0r*5BQ1>EM0E579l6 zoT^&d?WYzUmQ~kF-tV8ivf>xfL7bw`T-r-Vgq&1vQDA~sBpmhYp=Bt{Nf_-&6YDjb zpRgoDm>6pmgna{8;Q8N<$|xqVYt$WE19QhQrNzR&UYNp?f&1PmzieYqZHj^{ZVXvz z`mEWj!6l5K$tA1^Bs>Vl*Y)G>_~ZCsKm9~v=7X|$9}~!VJG`ggJkl;JvQ7wD?`+lp>`DrK z$@3&S@E`lK=a2XUz76DB?MW+x*OJ;MvD@KAcnj442jL>aUT5hctY$*PlY4qhFSkAi z_O}k*1G(|tg9IKSKE-$TADenFM&;8UxOVKeNr~*WX~hiQA}F!5;Xfb4tcG?!9tl5u zLHu_D{vhV;@amL#7;f&3t-xPXym>e1FK*#DH$L)eBFcb@(6jZ+-G=XkGVxiXAIXNy zWZ?BKWSw0PpD|JOihpx|y#Tu2yE8N67HyNj1E8cO{6I>7u^CMdtgcHMwi=JkU9)@l ziO;iba2{bIV064Xi?pc&l_?t$;Ud7V-3!F8`+#u6pGjSXKzKj25kz$EqS{})Vrk`? zX)y41VtZmJ8QtrMG(;KOyt*cBL``ufe+-)8Wwg64^1f+cu!EIRa6|*Ur4Gqno zW(u)}jHEuo!dv~CFcHcctD~R}XA#oY=p*a4xwX%jwvCW2I`)n|n-GG(LuMPkD zHGhjwfpf3>f;=94&+k+3w*!{M)U0JncZj1pFAjE3_-}B*E8vPFrBngW9J9rF`z1z9 zfTJ6Zi4;wv(6lP}s1#deuCf(~6SbK3W=j<0d0N>ARzYRJqS8W{UQ$!4^^_Gw$Lkaf z07Fq85-M_<6+aLo5MvJ%f^%==n$;qF?ALt0KtTQ#$z8|G{!-1u3)Msr({#*h%p^7=z1fUUI2iSVT>{3%HKoL~KpsPs*=v`SpAMasHS)+ySr%lRzw)Kr*et8{Bff2U}9tZJdRPgMJtYGNE)19c0(4j~SI z7l%_uz6^IBSTubyHZX1ed)$j3UBUDu3S@seiWakkDIIF6i--XM13BU~dHZTWvc&|pO|$EEKCD0K{zUkp zNjFcX?ObDWH;9Mn?J7J$2+wawg)~-fiYx&*njmO5nQQ?FB$J4N4kXSQKd9NX+`q-` z<%bC_i9gr_Am>AiEn^0IL-jghzP@!TW`ly(&wtG#eeed%`Z?XHQ-W^&N%t=V>Wj1+ z6lgq#(G5s2#|pdbI1y*~&dV~!#Eh%Y9d8BBh$axB$Z=KCNHhPrC~S=8S1Sr{_MRc> zz20ZwK$}}73-ArF4DrXwa0BUut^gvEndkUTX9(*9w|%svm6nT|AbeFeOB;>de%ZBc z1>FD5V8}Bf7#BTA+s+K~wvGM)orm}~Su03{97-bpY=-1#@Zj_k*Z)S4-=oKT36;g+ znZtA9y=*qjMBnz3G!?vjFgxDSg_YWwqN2RS{Gf~$Me`tyOv8E)_`V6@XCZHNppLy9xGYr7~(?TVUmFC&9`zl0iv{IIB! zN*+#mCRsE^K~_e2lzKv5icV#hS6eU(3TVjWFx`_3g#Nbz6l|6SQ2~yNt)N zjoWkPd@XD+VwCtT!b_$ima=W@%K_05-DTQcHLc>bY1l%jH#abkd$ZBVLXSscLP&!O zds;n^{z3B0&7}-{q%0pNvpx?u(O>cb?@pA~+oUk25;HfHt#o2!Zqv`MsWsg8CK_^2 zOiR`Hi*{vWY$ZYlwPo?(E1uTFqP`N5%Byray~9K4u7}X~>@IW{*)tdF+hSi4UM|0e ze7dH$TZnlZ1|dF5&5jTck_>FzoKx zOxO66h>poEFm6nP80^K!vfK*L=Hdo95Bw7wuZquPWaVmF_ki4{?^rr*dIP-#UI)n> zIhygw>xr=@P|xn6+|7kKj`AXJ?%ti4{qwuCw*djAW70nqB%~A=Bl%qi+AFQ2;d^1> z$Q0I|8st@4aH8|}D@g4y=M|shZgZraAES8=Mgj%*vTH|Sk{N%x-@}0ck+r3>1-R~^rfE^YJ7p*SXIVW&WGq= zjOZctNvZrKY)c5|BOaz;hUpwyBeK#k-^Weug-%v^WS}}^ES9|lDV(D-+XwnV{C9@_ zZd&>~L+fTOI(F{ucNiANpa2SOkR*M`o;hmq)6heLuwttxG{D<%)&c{uYN((}w~aKg zY38;Cvnl+bNZ;G8)WOYJKFK-RBj7&`|I}3GV!Xu?v4bn8`5eAuH(s(xx;PiBnu*+S z0wtKkB@fFC(yhb>IM%hUXp}@%>x?5{>nQn#&;3avfgulnuy4y7z6Z;KMB-V1Z4v0B zBUBC#{hDparOz=u@sr|!as}fsFy}P71;>{%*oPsnK6G+upZw~{^dCKT-5%f(v~7pf z)a?sjk07<+Sis2czbt$Ka{r;1yaya8|F0BBOP1A;hFWH?(fB`}PC)l8 zbba>+jAzab&Oay zqlc}WPeq;QrIH^1_O1&8 z0W92|wgzl<@;(;5OVdl+yIr3`Hy@XO$~v&~@^AXCdm9N_c|=}XHhDJqxchl|W(2r- z2&%?;`Y+G`FJ~Q_{Gf;p6Bu#==e=JCoqn2cB_1n&YrcVwYk012y)eG@6K<3!Tv9(s zA~p67&NzkZAL0dNgJ0j*r0gfwf&Igg%yiqpiWydOXM@`)woJSCjsr${<4! z?z6^N<_VQb72H1#qb*^kflzY^)}JqTJ0KP8v-JdjcN-Co=B6_eH~+j7;|xuNDdDJN zQTQCudBK({B2Bm&Ur{Lm9eitik{!vT@fe@h`*08!M*0znDw@iLo5k_$%b<1d-LR^| zAZrrq+%qpJ$ESITjfgMPdhUe@f+k9OL(Cv$D(Dk$b_CR<@LfzMzt5MmT>Cf-mZ#{8 zSJnsf5Xu6sDQH~)Boxdyh72hXIh4@=xg-jz+|{ANoAeV5ev~E0yO}kK&SDW6&k!*r zK{5v?6g?)K4}jmUEC~^pw7254)e52ma!ml@sfltz62qB8QY>G7OPDd?X^?n+4j*;2 zxpRwooFp#>d=!~1`6u)iFnkN|X$15b=cL9|(LJ{iG%^QgL}f@N23rz}LTmNyZ8Ps7NjwV`Re3Wra!tQzjB&eTMkLtuV#Eld zdfbaaaR;*jd@D8LJVyKD1HPzQ4FiTo5xvoP2W)|a97bv_asIT15O^|}Jt1jl4dPH* zT})E%$m}O`+-de<=WQv7E%yEtXX?vT-VfT7;mG|hE=9!KAMuXplFneH$)!9HYQ{ac ziu1AQMR*;A(g#29987bc)^`Krjh$$Xx)V?5_Lv4W0d_zK9}w8Au%`z@THv>BRPwo? zXY?wFePsUQKz^BVLc(FI`&*Gn%sQ8^2%t5EWY6WfX`WXjJD|0|)^xEI;nL7$`ZvL2 z5Oko?AXrJ=3Hl**S4f1r-HEi|`i>znz@h{oy_qoM$SFW_WtF=raBuuMP}WMs2BB}q zvm;gNsaVs3&N(LMkTI8aZsc%*G$|77M=GARqvnjU&C6Q2BD^9ar^Gm_8{$AjDRN!}Ev-xbN48%A}x5=g_`aggJb<0&P58Umn~-xw}__^RYW4IT=EMY|!5 z9dIvXQ>O>EEk*hP3p+C6MvQSL?2g1qfR=Oz9@ir%)3ah_sH8i@YTUSpu2c{SlrFy( z5I!}kv%!z2Ed1(5$L8k5LNix)7t*^S*8O1fF2|uGx-%Wg=Xy*$Wi-Q(l&v?7uL*O` z60HSP5OtW0#dDT12(%KYZJ3l*6xJ;9hC?guEYRs>-W2MR4GQC>DUiEo@+?%Y4;rO# zf$4+Y@Gt`d?20Vuz3g2RpjiCUVDgNVDSH8srzS)u#qrv_nu%C6&MuL?(8Ju`yH4yQ z>?BmI7=lbWwnBy&Ex}&D!a$)A6bD5T+vUwFRse>Ly^aK_t5Q$7R2`XEJyl8AV2v^> zQ$&h_6bc^LkUBfEFi^f;ufq+mXWP1 z3zNAE;nsZ?%*4Pb_=yf6OI+`|^^>>Hv7OcKI7JGL23eko0>*5A-u%?}FkGiv1Gmv* zFA2?%v|%;FgGQ=esAm>dfYc%ug?N|)F;@H01ZgjHeVQYuVuVOT%g4+z4)lg&O2XQ& zgbIjALVzdIK@FWaN5$C+hF^9H&rA@5VEOsGsLz1n_rZzXH{A{AsV_PWwq4MYn7HKY zRa-jO35&4-mRCrR-E+I-XPt|&cyIIEYg$1w7oj-hEUrRL;_fg5GnhiQ9E| zZ!c@y^D@nmIV4sriearHsbd%c3O24BmjPnof-a^*_}{ShWa^8W#zU4Q~AA8P0TcN4B8IpW>V?MO6^Cn!&oS z;^PTxNsi(kO4p*Tt%-ueFY4gLJ$P%E_4XT+YHidJvS4!q8pH^ad7^nrF!KnyTSZ8I z1!g8VkBc&jaj0V3V8cJLsljy(3Ia289JYbw`@l!Zbl#)(56$jXt4LbS5{K zg(NQ9hp8N93;IuPJU*Sz!UH&bW2Z?kQUxoZMnMA;h_7!5QuRFGISbzsr0S_(`s_|e z{R*?$4 zjCb}3bz78YtjLJ+=%wV1;`hdC$S+bqgMim=NXhK92kTv0DClkr{k*pmzou@<0;E9K z*&6f1X$37k$*Tb?{0EMzC~OC|0$~gtOaADItG?sJFD} zuu{PipcNmxKr|JsQC9Fk>~pqDT<~G-#PNcJIm0p-&_33lcS!txF2SMwlGXD(IMmsny|_OU}?2XiTU$yLjb3)zVw!R4xgE zgvDG!qsBSLKCW(52U9|laSV*}H3&Yx136Pf6~m4JiaWOa0{%*p5#xdeL}nm#5^hlZe?BdN_o?0y%jWb)Po}AA6u{+@fs2z?x#scO*L!YG_+v8>`3&P{fgO zYqD|-;KklAdp$R=|7=4{+wf)vFg9heGI#C zB9Q3a*YaQtJgaBeI4IgCc;-&0xa#ZZxHQN?=%PzrY?qwzdgslQbMH&o2|y^XwuO-7 zIC-T&J{lsE>(;b)4%Fq z>+c9KOEAww!xC%ISJhvgZO-sd`KMhK!^Fc9Cdzbo3LuQsdly{CJ+u)~9}kX>e?C>KuNcze zjv+;DZpEk42ClkE9y=~YL;IlhQ3yRSKt$Q64TQFG*qQ}Bg?uYdng&tZODWJ{EC7WU zqyS~GY;gQb&|pVu*TK%tui9F3KF`*!GwA!NOA#{bxYJ?9MY#F0KNg3pkNNp(?ySMb z)oZ1r=^5~%X9pETlY6jWEO?M261#%Vty}E=J$u&f-tQ#FV$`e_%5`5x#Sb2?dYod& zVx3A7gDK5N2^sJ;95KC0a;(KxCq8BLI~T6|Guj{H3oPG)5ws>UiN9;RV}RvrUgd2b zMIUa@YiUgFipp4;r4BNrnehT-Z~}`CrwZQ{3#+?8b;)|c`)aVlW4S}R!MoEh-fPz` z0`>PFw@`#!I<8I8-Jrsy-+mF*pSvCagB)0SY{_3k9%-B}1@JzV4huNOJ)#9EuxnqJ)J=Hn_grmT?ICK4A!nSfty;er(>r z(<_9x=Ql zLArGz{lG;c5EmDdoE7T{sCE%`(2$vCA)$j#M@kcPT7i^19AwwjZZZ;u@grp*GW75I zG+W9#uu$@8v-?Sl)Rz{nCS{}8o;4#J$!mX{C|P$0p$@q|4;1b;wo@|IAsN*gYnxtz z<5bGQ^^7YlDP||_u0|FrxD0VIwvK)Yc6f&S@#Pt%uD_lIK|oec6eWi1tid6$CKsfN z>rxIEJ_Di0Z)PLq>%=qE!}JUm13fgdp0bGOx}turcgqa&3XIEo@gwwSS21k#FJAeo z=$k$ilZXfhXBCYIKePi+(gSE0e*J_g++?*zSGI_l;ZZcB;!W1o)uZLSp3|3USKrh&wTebT7v(_f zKD3-S=0(%%IMA87OrnsoAkT_xY?Yq_{@JzYs_Q)YsB}~(MMm%Ss^XW9gd{#vR5JCo zUh=w*wsZ=pdxMXU@-aZ7-z!nmM6DL+&5v2qVuT z#ZRB%xe5e%{?u_yxpGd(i!d=&g+G)Tu~3>ROZX&*OV1nB5ST2P~bs7 z$RTfFY2{(^5I`Mef}z-pP+Ct%H?THxmRJ*btIZUipi*~JJ!|v8BPo%3< zwX1%G+#kfzP|-dIOBo9>mqIFc%IF~~<x$dV@7PT5F+Yr)DP z`a`C)L?tQT1fw5R(`Wyp`W+A|4M5t3kWe(v67)R#l~f&gpEWs zQ547HoKH}?XF=XKQR{`#pWxP+wF7*3&30y#I?Jt%IR>_)z5yx7S(W53|3{D*6m=vN~8UX9GF)v4WQ2O z-n<^ZsNP8a_*F;V@!`4;C8Oc~8OZLyM|g=}c&(giG$`isE7|C~NvGpvlOM~KpfOE3 zG+j;gRVV8674rD%8$;cc1>&|<321!4IQw%OGRi8S{v&4AFWDQ^LQ0#SaGG^hI{9{!hIk$oeWkna` zIKaVL`7f+w3#_YHckNsbFUh)+f*w29`_9B_+_EPMH@ec$3kB+nDhc9P3uQBOr?5Fv zfmJJ+QQ>}hG|`+As}Y}lKbo+In5EoL6LZu-JPlvkxtS^T9tms@P5jMO_eU3>1= zk|M<8s!xb87GeDM#5J~&eio7R^)mx3$vrQRM2hl}PV2Js+=STT^kJa>6CUxd=u|F|w^B}CIhr*4roRzX z(}&B5dzDcbTB*xbTcaF9!F=644n(I6EFvb^K2XRS?~p>8f^cdey&gW%M*n>6hiBFc~o~CiQ{nlVvnG?w@3dTTa@Gvb9Sl zg`CK+kL5#07t;SC&y?n?8wy_?)_&t(3N;r3i zaieAU3$uBrLgZ5U2UDQVYaXskt9kPdE+6l1vB;|GivH&mI{wdj!-~MQKJ1jUYY*Kv zRTQqZ62hjZOnm}jzQ0y+*PO{P2aw^p@K5n#>r%O+@HG0@nlSA?=EuNBn!5@3QF%g5 zjUer*gTlN>B40;|uAxzi>0-@O~7(2G;gUuNUQu$2%Js+Ff`kUChkmQ|e zg~|{+Kf1XP?7dcN*-N^gt-$s_WL}RLABuiCmd$a9az6Co?A_I~4GYvZC zo{MUpUxH7#_AyNmmemcPUnG6VAVW8`#r`g3x>oDSwqYRj?L+FWYocQhv}29#A|RZ` zOl{HGSEs7cxvp8%u55|O{RCFl&x7k?tdY(0t+E_t?2&Gmlsrj=3nFHTb@sF$So+Wy zUGMH?F0`}u!^*~3(HXup@9uQf0pmgMNc^s|RpMOJ@5cI|aW65IBiPWYx{O={jL6nf( z&84_oTcen=T~^JrmW*q^jKU*1Z}-oI_JtV6?d~9wBzzs8E#Pm{ULw6 zeqN1nlUa&BnNSwe(0ml6>P#(jdcZLEb;7q(BSf=Iv;dMLciT{C3C zeX9}MF=iWJnjeNf!HL*nT8FRx7Pj5D{;ZN$&B-kuRin>7CdJMM`UF?WF>7Ro`O(c= zv5)B;Nzgza>oS9^6Qvzu-@VJF9#egjdb%-OX)0(QS)C2pllLG)BN1q?zFhKTV}{y{ zY>`%N0;b{RRNN!UWvo-}d44;sjS*kH?Cm33dB)lOgYG6d;*~b>J%E9l zSoLSA8|1?^L70ot+^VQf&>Y(%x-zr&CvVmOI*Q`2OcKvGHquSlih|ki44kJreD|JG ztzQr|XHbu|Ids(QEq2>@6I^Bpj^kA=tE+b-8AoF+~wn!E5`HtNJh%_?b($;We3i#7N}#M47;U#4?ehYE2UDEdtKORf|O zg}?6}^Y~Mo12_44=J539H|_%t!Se?um4mQ-srd`z?u_b$2J^oB8?%x@KE=pAJf&>w zU||nH0IXy1fDRSUoZ1v6g&{`N(EN6Tg&7Q@kk_~@#NaN_1yJAH%1k>mjeca8# z2uDV*BF{#^!hCUW++xENtqY@US8xCKmZ20z>2XGa(~BYG4>N63T&iJcY9IccUL3i_ zbv*wZ-t97#9Qmc!SMve+7cB77@dV`*nOF0zO~a)j{TLSMM(17^1mmMk`283}b6H$) zq2&Ul7~kKQulV!%1mm8Z*s&JPb9*VE#G^E{@F=`?*|Iz7VfOFwL6Wy!7h8#9E5BjNMPjL@A`O^VnbQgt3Z;Y z+McHhed|_RWz^bNV9aTYJJx2ElArN?42a}2K6BF`n$fz7TAeeI=;Ugjj-6V0n*xf2 z*0&Eh%v!i6qmE)+TtlC$fT-)A=vAy^BXp_vWV?0XKxS_65B z+kPvI1{+3sUz)I^b)>M6yp^|kp0K{LeN}K8KZb>~yt$J&uP7^jA7?8mK4~cs(oZEt z;At8wZ5O)_DC?*Dq3{+At@zf8VsmXcvRaRyaJ!QyS-H=Qxh`hThu@IlZ!1`Z_i%&|G(9%wDh zHEUvsZm_gBc2@Flj0;x&pML$|=}a&q23$|T5jFp-2T`hK_pe&}7wu1#zil`_uSdw%W-0KZbA7#;!Ap!ev!{}iz|DP?Z+|dLeyH0Co zVJa2s@)A23;Tr`?{Z0m1X3HNP5Ojg;unO^TOK{170)i4$TJ=V%lzY&Sn8R^yV0mI@ zZp#Cd^_(X4BEhCnAJ6K5+*kncm7apR9~- zl;qGV3-zjYq$DCnYE97Y>AU?$bU}S8CLTH&%2|ipUv?c>IJSmUay~@+drJUKRb3Q;zYv;^Q5dkJaEy3 zTROpy;yp+D3veL+{k9SzHSNOj4U?IuYP9=27ZXZ^V7H8%-0|)0+Zk~>syI5&Dl#?< zvtH}iVq;|(CsKq_7GXQ8G*U~tX@8ylwSBe9@c!{|{0B8|zjyM3%xqcC7thLquu$rZ z3S{)#xX78?%9>eJvOc5DlUuH01Scf2L!2cTv)p`xFB~b2@zi+g_81~eqAXEm59jU- z19(gYR#MKhUY8laSSSiYziSLTdG{{r^QY`{NvL`Rko6#{<)c2w%Fly99}usp>B_PJ zZ{w(bq9mYkp<>WZm{F8#0_p^Ono)4#T1GCJ+EtW`v4P|nRmQ6YWfCtlWL6KT=;l#m z|GN}ML(%31@EvzU%ZCkSupIE@j}>AzH;Y8Ny~K7hvc({j{VFN>{h_Yn?Sz6c=7>W) zu?NxItdb&OW@m@IJUz@1r28)eL~(BGl~*;}{kA(g#;rFn_|yFXAOZg8eWuPtYloap zD<%^~^v+ULWtL2-M~LqwVT))UX2%SXA4>&Z0!``F4ff00eiddr$#K141FAVledUS~twkwObtJvvFBXqQ(#&bHci++;A@NqD7txK zE)56DG(?ZwE4H6Av>lsxTqMHwCsmnmS7x1YrP^oxsIy;Q1Nw=-fR3H~m>j}D{}r=k z6fzVcMo}@}IbkhptpQL$fPS8UhvENY-9`osLyS$P$)@T4m(kTej(@N&TP6cIgKO|3 zp+IqURzk}T3u$X|<}$6vF)z5bcF0uc8S?JvqbF%O3K>i%^eAWMAjXq2;2!$f7NBEJ z7ER*D$axg2l8Z1^8`>}}4p^0$q)}4HhJ_)S`r#zBrZOhkZO!h5b5I)9 zmPneSz1ac;a5ztgbpsTr@ZUq@0z`ni9i7Cj<>P{Dh5u($%HZhC<--9CQNSG8{wq2C zS1c=F*sg3gJ_A$}h|&v;Z4W32{vW+R^ncMeG|A^J5WoRKDd6AdKtVMBm;(6@|HA~% zU}rFuGs~$NwrBC;_hAG?YCt*L2D<+f`jh1VLh@h^e?p56AQ%SO_^TQ2AKfG6f6*0Y zlF`;e04(xg5;nMh5BsS<`5r^{v+yxBwgAFuP^)8LrhinAG>;($pyQdIqnyPQRj};G zBH&)w?%B+kgP3dzCb1^juMu=u0D?DMfbBo|>F!7m5wwew${O?-0O2X9!a0z{|00Kw zv6#G>(wsn#^~`2x#FO3O^I+PlC+y1_ppz(%Ywv>X`C z%*#YJC<3UX{!6rq9Gei|8kS+4X*D}K3gs$l?Brx+PyMq>HT3?Y$T)&8l8fv0xRMIG z4f_9@tcp+P$+a0*9f;ua_U0=VGub_vS^-U@)m4x`UrQ$yyU|*prK1APW#f!f^LP{0 z;&2Y6n7i|uE@VlQupMjrR8S8xucrXqMO~F$#ftAzlqI+y9R(gb9y!HT$VTy zzb-$b$Y4j$$>ciXQxPnoPFv?e*{0k@Cb{arSKKl`m0O z`z>7acWayVY=-DTCTY_52;NfmJp&6!)qU)lGYrr@z(}Nl!w}gELK%9{PN0F1fDoHy z)*BBV<2S|o^oBDbB=MTw%2qL=`$V5!l#upSEnFXKZkNl}CHqlnm1Wf^gL2e_<~_J+ zBQuzgU7R#$7@*jRUG5f;n8;JVyZu(fZ&egHrR_E-r+EFyX!NJ0LXKR=2Z)dok`!XF`lgaK5xIv zEaM{KMzqpmgR~4|5AJSvsc_p%xE0Fx&=zsTt7qqbp3*qpOf1tyV*NZ+-f(vQESq>=4sAX;Sw`gnK+?so9~ z0|oXbP46rH*%OPb6R$N8WmAhEPE~{EO!vxXiV;xpYQ*PNi^F+#PIW2K(H#Q>iAXOs zS$i_(Ep}etqp6rMcPUL%8+=w}wZ8S}dK}oWHpKPHgz%S}j9bq6Fdl@aM78%9^K8fy zyU@i;&%v0uE(AC}ISz2nN`y9o1)gT)lA6g(R3m?lr9=+5*{^sH*{>##fgm=mTbwP)(wNmZ zieWZi`;F5&JVY5Z?cbkm)18Hm_6926ggn6-i550IQWz*j_x~d9AEPx1mab8B*|u%l zwr$(CZQJT)vzLutwr$(S?cV$S&iCFi&d)o>ef~XJnUztQQIT_IMnyD%Dkti1jd$oo ztN`adVBEyYA%`7>!#Y^+QW<~CavRXetq=yYz9|=s$pUcGbai=r)EW^?rk}~5!mk*k z{DD09o)@c#6n9H6EZB&_fkbn}9#|W5VSD)I^0~pq%k9m}hx-Mk@9m$p(a7AV2st2h zdT^-hxrOA(%{4(?J2;Q=an3QpInteYH;}azcLlrac6(oaNNbXqPhPogsfRl~UFtH2 z6h9?+jyx`VK5E^%9cV#O5cYh9-6mVVri;9lme$A^x@@P7wj&>3hMy(rQ=qj_UR00O zo8y-5>hm2hm-h9ND+4bj`rfEv($GQwu!3Ycp%jvZz{}{Eg2Ub(r6WR;NBx}**^So+ zk!Rtqlyi-@^%Rb>a#i{C%hIa6;vJ+kf~%YC*!6@YcALilcbZVza$d7hO+IUkB$UXLJA*e}QIjd!C&a z`O^5Fk|!y>OTK~neOcHi=uaZA!_$^#4>N6*pSq=cmYC0UXplCIq}UE{IcV^cx7m%7 zJR*u1lZr2!3C-*No6h$9q_OSwZuYNIx%UVno)xO>;F8Cl8)L10F;w;s_pyc(c64PTe(-HF1Gt`nb6p``r^0blQ)N=xfvpGIlnu?&x zmQHq1Sp!o$nV^`Muw>AUT)<-*%V-2|QLaSP8gs`~Ex|u(4XzICz>My@by6a1m7&w71##H~1i+d{G4Tv6 z$o0REU@Q#$aI8Do`TyFFNA}g4lV)3=4!d~1!OGZ0+cvQy`^-t4f%v@j;AP{Qm_{-p zfJP8u#1UZNzkp{oJzBnln0mv9Q|6wWn1PF~J=8P++ArW=S3rTx9yy&gezLxUeuAOD zg9`tmV3yebAm!Knn8lo&*Vo6zq}R{=q{79a%_(`1US=SGHa}$HU9i7|ytA}N&UR4L z>@8@h@Uig~36z#WxL=KslfRCnxlm*Uj)vh4#Chsa0PSNcT(c3A{Gw^h>A3WiLZBG0 zam;>u%q_^1iMsCjuvup~8Q+OhhHsLtsXdiD0T^KVl;~t1E&%sGeTdo)R7L(ok^bMn z2mb-(j}u7IOvuSjO6(_0r3_=}Bxoh+f6^%|0x|!>uCX^y(h5}44mX3qG4c#$(7$;7 zFP3LUibnZ8&ZIoStV~ATKp_if(va_yL8^~S1TqiF#Mi??%t}tq$H&`Df=5)On3Skl zZOOY9@U&y%%ceQKiGm9nu?D|($bMteWWGN6M{}AZGgaODUW-mpupF4Brk#V6c>#q5 zg`EG;DZ?j2*UXvv1#WoiyUQphd*W?h6A({QKH?NGkn``9lr2}c>=8X2=TEB1*!)-4 zY}-}7I{*OhbjXMcz(Bo!m7aB62WjG_tU1`2?dW!uOxL?|#A6&EJhwg60CESQkPd(X zi9K>Q3R}c%2dMuS2>(xHzQ@R!adKzqHT&&;4PpoY5GFYAEA&9+fA!e}9S7~i$b4(Y z&_SojHkfa6X~r7^$eSq|NSOKQdqfC(4emA5G-U*&^5kQvIca(MdIg9%*-anBmZ8MD z|EnH{pPQRQT`B)nko};X$)u!3q68vYP;G5ca)1APkN+yC^%^SqN#n$Y!JJxFx~4`} zl<2~7^JP~|GV7}c=RA{h9~2w^kp*b913F2N%{VZmTwec^F3wojUse1poJ^9c--NOw z&vBaM$rMs(pWJ`lUlgjxCaXJGo~2b$pjDmU+dn)UI+l-+!VUc&s#hQgXajmg38nR( zocp$z8Msb{ULO?!C`?1zTtEUW+Hic#(_>5nK!+N9cL5!U@RwW`yh<4cgD4yPiw*K$ zD(3T#n92D>2BrNciwPXMIa88}lb@ZPksg!=7bm+YIF(LAcB4 zg*45$jLf*?mQQv`Mr11ub2ATeIe4|1GsOps7|Snt94ncie_2f^29i96a$iv-!LDGJGXJvXITdSz)P2C6*(QMwn{=>Cc^J%U1Dsz&4eLS zcK(u4{`z`E*&#jSC=U$Z?tnzLl(|nh>rd-hKmtYE=gq*`0ZS&&k-X-!4K<%vZWj)( zFuU))Y!2-?$_W^dvLh^eeTjMk3B;&5H*dFEsS^L3D$K_d))QjA|=`TM$ zC9emR4;11S7#7%&z}$M*S|qPl7*K;j{mqf;U-hZ&$zNte>@*JXy!JkNXy3U3_a_v) zr|)70-TnVu{Eo$MM9`@#^F6g}3(`9ao7IKsEG5*iR7ss2xqD$^KLp3y+`T`*3_|nB zu}zqg3l=~L1^zZI$KKhM65>Jt-LkS;5M6*>7P-nIfH5V4fn`qFmG5vjWv1V=eg(Sr z1;!r)bX{o6%5Fc&yV?9`erR}kZ`5WS7wz(kYK56e1ka)tycqk{vYj{Wqwi;x+!Kfp z#WcPUP)0HlWFRM!fciiHNt~rPXOO65H-WsR>j}4+1{(pC0zoAwg?0>*)HoVgPf81& zhD>IFna0vJ0l|*I!O)4RFFa~=TSvAqchpuTDz!ROATDx9D>QwvYWtKIsAZ1PXGZf@ z@S=7CRtUK(tmAqqh%MUCux2E)(Xyvl^VoaHE>LB)@@?(jX83}mPjg=I!3W%A^io}( zS&=XUwhyaro@oF6U7>0iyN78xs`cm5hqfPQJm+r*i!Fb(Q(g!uwxP@*nUaFD)}YIYv{l_%CV7a*j>k zZ(soD0+c(OAi%%0f5b1!H<)O_OtmyM1^^Ej`1=w(2;*P*cYyDJmQqm!V1feNY(j!YX>nw7TypN<7&J*C zMJqWiFPV!oN-+qnSZS@ElbDsv?8#)j^WRRdXX&aA!2Yewecy4eLMy|bX)!rcC7x@Z zZ%3X|$@a|C22(Q1v$GjK*^*;o%E{5mO)T_`?5h20zkYKxORUru@Zb%#9`DoC(oB!Z zuiW0b$G*vcR>?SXIe{@l&@@SfHYh2`Dr9*BXaWKtSRzC?MEu)O5CcM(;^XWq6keDWp=O6y z>v|DU%GLrNX$py5AtP;OiWUNj51=Xjz{&&Ukcr|W6T=Swj}N}L{)avNi1;uhw*=@3 z$DU<|S15T0nSUGp(Z|9`Y&{sOcun;YpqU_c2sA=2^f}|?g{?v&OfbGkK#wR6=_Hs6 zUmmTREVA$~ZTw7Ye3g*5-D_R;jxM6?&fFDqXXun~l<$pKEzmp;S*2l&vBn*I$e9bj zLreL007F2$zewBG(y99>eR{fd(!<{ZV4wq-C`|N*+BE%G=w<4HE=mni36u74?(jW; zlB3#UjnscFtD>&-AOni8o}Xw29|iFi{i?8T5!!f)+RjiyaYOfI3#BagaWA_YTp}%u z4-Y5)%drj!X=6G~_rw9u(H|pG)}SiUaAVM#41tiOoF1r@LJzO0m9By+fc#tY9?4g; zT)*g3>`cOP<74>E_2&chz4C#B&n(9zoS<5Jy7(^AUj>JJ(fCoB@kUPOzf8Cnxa(<6 zV`;@%4$t$&#&u}DmGz)*MVXs!Z1@>o)+nOmo=Ta#x%_{OhZLhY32Rj6F#&6a8(8)e zM<8dQJ2EOcB(|KG=sNM-oEQ{w-#_mxPA08DaJn$GFo=A|SC;KU7uPw^i<|i=R0OfE zG^bk$upGFCIJbmP+==valx~NPfdi2}asb%?#(o+>%Rm#-5D0XjAZ;v-TrBN8oowiA z3=?-S5^LWQchM60Ad)`-TauH3kf0o#EZq!UOzAA3#NJT(ZAJg$lWDG8*MZ-WH>7OW z-eV8|RIp$MZA2b9p@}ncAq)uNH$0+EdMOwl0P!L{555oCnKF4~G^RIz&EkV%(aI;LrD;ZaBR_D>_Mr5V!HINn&_NcH_56L{XW}(xU4B2@CafkJnIP7q&$~k2dzIMx!pg9_1g= zVm2N4Oy|vFqf8GkmU1X=S<6XHv*@>nvy`EnQz~QkvS1@!7%{QkZ{e1h^61x6=|OOG zl$by=q#470p6UIHZ{)cg%&8zn&oE%%3@%oRf&}I=7X{3+oGKxho;Wjkrt{+edUbO` zo%;UVl835&pr9-^3w%jmaqO+pF)6Tjsx^dRO-Bja%A(L>IMDbE4&U8Z;F})`r!?X_ z!|c1;(0%TMmBtWBdc$81I0B;M_ zI7pU5p}#A0cyj^_n7oy&Zw^=av(FO3?-T|z?zF@-G%5N=K{m|l?!_rm49r0p6JdVQ z2ly6XjwCfKxQuPd6qDm-jLYNA=9}F#Rg+$1@;K3s%^D%RERo%uA z^BhClW?3&7N_84WCEI|EIf9wK7jXtW?R?*zP*fI2*n*W1M3C7F&)hhFwrH}Z9WwmS zW70)3t??Al(ICvGyaZ~~66bnC4fk1fOJKL@OpLD~OH$;xQ+dOw*aNo#SK%-Qa!~6y zUaw$+VltUMGvJR*ss@YVMfg6*I_Dv_fz_;G$@GZR zA;npKW$#^{oVmPKfoAPGohfU)amuPS9LHbREG#tfjS~$l*heB)>ehuCiZ4dy<9QHx z-UB8*AFKh_%wLi&;3M;~opRrI_JQ1uA;T8(J|`qgdI=U^k&RE;s8toNSn?81A;vNK zh^{os8(&*SgVM8^4fvy~kX#au_9#AM6@+3nOYyDjO1N#7Kl5ayT6N&x5AsDP4s0zl zPf9k6ud(|8-TNeha@v-iVYKE&(B4EYwjZ8li%Gv`GwH<_W7EOIi`7@O;ggNGeEBP*hYIc|Heam)zY(&N)lVmB^Cpdtgd*iUa%z+W ztrrC_NHu>=s>q~Q@|NGaRy88G+IUfhnu6Z#UgK3N3BnH~$(CmK+aQrK+ldxOs3(TL z0q*xFqg#Imt>E!^BJg;vG=ZD5p`vJYgm;tdq<6hceQal|ulQ|e@Kn||kVKeD{6d=$ zWR^${&c#J4R_FQ_fpL`N|JBigUP z5qp;<#12n@=J#My<%xR)DGz5sM%)C6?{kis{jIBSf0lG5q>DP8CGHZ;ftp0Vd&W;c zF6{Q}uw`R6^9^#Amn^0j*j%$_wRyU0bAem#`2+<7$|y~I*iG;S=CSu11W8QC*BP&B zMmnF4DD%)JV-~?BiUCfvGTcK-MPDy6eqw>ZB}c^9Wx8tcoQV-XLeeUXdqEl5CyYfG zhHmqh5!OM?27HHm>)s8R9~@uIXFwUJ+D*0ehpB9R+=57(*1PB==0-(?1`|jPr%ajM zXLgk~6qEL0khKnfisn~@9mtGHuJh#75AgWA9OnUKtb|97wVH2H%P%#Hdk{J_SzlT@ zP+HKJMWoQA7!^?Q69jpG{{KVoLx+q)MM5`+4huhxYR8~4ON0q+WNWSHrYBiIVgKwO z7ET5s$%6XQg7$tU#Y}d&geLifrucx;`qIfw7cM5v7xI7tThqzae9r$n6waA1e%((Z zD(HAknFoT6cpfv85d@Ifr^`JB4?*zA`6%z!^$z|WP}q|eWS%7?WhE#XRud>BDQ1-? zWF=}A`5#Xgv#g-7VG~P0RJ;FdegMmc{*`8IUWRNxCr7k`v_#Ys3T#;?r&%Y*;H#q} z8CFyTq~9j?uW&}V5$(yo8E7(m1Vi0#0R@E60DIU(>X$&?9yuGe-KyTfv3(}ifVwSN zSafo7f5x~$O*ma#m6f2Sm{`cmAU$NB&9ge&wPwRW0T?e}?XMsMnEy50s^BFwGS-7< zw*Hr$_4Am25qdc)H9aHw;Az^lA zmPWBbWs!P_VqSPqQf5JxzGr4dik@fx*<~~{li92$CYa{o)N1p)7cxYpY-0+Y>_Tc& zl9jct9s6l>B3prUw9TU>8iW8qRA&P}1q%4fqAwP|E1UNqng5;br~j2F6ZW4Rjk%d! z2?wxEfEicKZ;U5Qb^sy_aF2FOe+RzuN!1!SAHewB%rB5d4S;$Fq`vjyFCFYwx3%9F zL->yI{}WPP@eAj$C+xU5gqTwrM-uo{t0KwtlC|2%ZENcZQRS%D{rS%@!st=0Dly6A zWYYs*JbQNwxNSnVDuuD2^HS_xE7}$cjamw`0?sIMB(x|2P&J&t5R{N&2oq)ulPDM>->^f97#LExPYi;$@t@^9<|^zrR(aY$1rkVJ2A<*fSzQR<-kYy*~% zmQhPNu35bc`&hQNj5;+$=@z)-oC_d@$jHLS_iH32$RQ*z8R^On+h^n=uqQO*7a=WgBE*ZwpZ>QT5y5Osi#yZ)O;@M za%r472`p5NHHl2v={lA}n7rW=(gH*fS5aXxBZ(w;RP=$k7SG2iPlt_b^Lg%CCrW%J zlwP6ngBNQxD-ww|8B)F`fJ7j9`94^B`my%(yN`$DZ{*f)1!zOkkGq6z`FaA7%}+Pp zWg(;(jA|>dj38y!xCN775Y|DlhWyk9AtVmSo13bk{EUvR0Pc$T9i&!O_9_QH<#}3~ zsB`O;x69jsIBZIZsJrlV9SjjJG7SWyeF675(GoT>KXk|Cv@BT*q=8laEN$3>Swx95 zkPNj_e)24{Aoa{ncCJ{l<}=5v^>R-A#zZA~i_Hb=)O95n&)i4*b9G6LLfub0$tf*> zP{OTtIXgc*Risl%(ZUsr#Qg4o*icMwMj0ZGL0vR1Z? z2NG}QaGgy8BZ9IPJ#eejj01UrCP_Ynw(T*dQf)pR9~{J4S03jG61QgHV{EjG8##|x zL_-^)et~=HJ5L-M3~@^tAg^$_L39v&-)zvOEpwyuZ5&p?GFSPW<7{J`VmIRyGEEl0 z^s7$1?^Q|g6?G85;+!IDnTQnPzXx{RE+4PIEDz55GP(EjHmS>>fU1f4B9`ro)iN(< zx7MYw^p%@`E8|K=3>9jm2G1kdWjQlXZEQy!r^Uk@hc7SdqWAjiTN5Wi361wzeW+p^ z+i)$lV(Bc#(LK1l-mVd0ze9x^l`XV}z^!&SY}8df2^4$Tvc)w|u#ROlv&BDEUMht8 zh9>LCC>l{kq!asWEQ{?dOX;)8IB@K*c3Yh~QY0iLD74vkn(b>5_aoj?qcnQ#9|%M9 zwORds@>{wLkxUH7G#%=Df9jT!5L;A>>-Xy?y2w+Psj+7~;x62u%ZJkVoCJ}*XYG~3wFq9y<(9Z5`%Ei3d4jK&T12&DeKTJVFCu6lg z3{G$d>jQ$`=x#cKMiqwOM*hS3_VdH7FWr0N=U0L{PGkdS8{a=D@H<4x>`PS0N_BJb z__ikP5B&N}&`v@hX#8gVoDscx`f^^!OqyQx!G{d&4ATw^b}x+YK=LJ?{{RY29SwiD zRV+pja5wyv07*~wD-FcvvY3@{Dm{|*u7x0xo5s*ts8JSK7hzbxF{RKS%R(Nq642!M zl9)rDJUIEYFU;E&2Ha$sW>W}e*Kmx^kb>MIIc79G8i4piFxFhX+`N`q-Y&jf3iWoB z-7jfEZFR+B#9@El7%f!1H=^5PLv5%(0;1_V&f6n$7rVhe?XNGE8x0YeYfsEN&sr4g zH5Uk*<2%f><=V5_Wu9G_B9KMEzufJ!;qs2l9L4F4B*`UQ`%t^*J$(kEnTZ8YX=kiuuIfZb-A7lG(s6gkS4dOW&-vu6Bq751pjm0BHf~G+hZXv z`Z-*P;U~{GR9elM$Qc+t)=A0INa}cln$RbUEL=4D3wrkdlN2@fzb7~-vetC9W3HQ( zEo+&aoLFO^nUq{m{dw1fwSqkYl+*VylQ}A&vG+rhNChY=+w_Yg;^O@R%7SxhfFy;M zyl>PqiU7^1)T;-OAxQs(@Kv`GMmsp>5@Quh{9n1Eeoy}XeC-^P~bn@f%ZvTZwS~aVPqyLXci^LlrXD! z3;lFAr^t}u6Y|9YFi-*QcZnRp z#xzJr9UXD93zMbR0je0NS0kTZnu+roVnYAbyuLmNfj9#Hzr7mv;3XeSATDF-5fMN zAvfR8)3FYYEWcjB-_c&c*|IQjINW=Trk!liTXI61UlQ`z+_){?z}9KPnW?X=g9-q{ z)y#EE`&G?TbjLK8h>t=oLy3s{hSp6>Vhc)*W=k?QyU~jyOpd{~gmiLI6Z_(KNg6?G z58N}za?goFju<;A>Qd^^3dqc+y1^N@!5OhIY1e@7QkDLi^N5=fUY2ck7&m8OAtoDw z4Utc%ilGz8$L1y0?Qetr*%QCveXu;LR--A&M+Xh>8}MRnxcVoeAA%FT5o05CZ~|oE zC|541nKC%&c96`E)}TF`6HBh5^^cA+BUK}7qDqhJ5+z%yR2$UWYlZM76A}nVVl9VA zOMdps@9nIN=Dh=)WbV+==;V6B+KQ$l+!(PGaQWNVADD{8FN#61e?X>2BpHBSm z*iYpAfe|_GQjfU9T>nkKto7ezh}4qL1KGNSV7=gptl766?=$>0%g~QWHW5 zVP=;LUgmT(GktLh$W}WdWY>>^!Y0ZK9m=MARofXo!b{MN>@Zv8sg>Dv`%8}VOzzFt zf%aQKbq!-z24<4W z#VSk)^9WFAs<^pHi(c!0cTUR>;wS#R73*l8bT_ooJ2B%RLNQ)oIj zbnY#I+S6KE(++TH5zDDIFJYAxw1`+g(TeNR*|HIs1;vGNJ)dNBV5k*#Y-$7cQoH-3 z^j!}o9z2xf-P@q?6k!cV0BhLeS}!~2M_4Sw0NsC&p>*g8ltMQ&t;)Sl6-Yi_`p z2z*Xu^ew6aYSJR1n_;ccT49Bh)c9ot$Ry1ZS{t8`FKP~aKk`GCZnr{Xw37bo04eO~ zY$g}p^6>MDBYJA{vToBd5iPBs&}0{QU~w{uWmw+G{Y}&6-brEV&93uP-Nw&|gsKNs zo-D}vwMhF8#eVpPL;=12YA+h^r!JLt3%>hxV|KI@9$}RA4V%T+^byO4l<^P$FB1?+ z^%hTh zrm7FcIksfZvwcdrHeJfpd!qMUvi2?_xWpw-t4}=^V&@-NOB!^wL%=8$j~s7`d4l>q zm<2OwGwZamd`=UxR)=j+0A(%kwM(pEACDYuGJi2cp}wICdGgXTNhsflDDz-TPZ4xeBYa z`JdN_c_UQv{V`OjMIKHFu~HOOwA6#e5d>%fHJShJL}hqZp+OaZsV4QQHKhj$8j1># zs1r1kvr@FcuR%yglybO%z7iNCcm>RmKw(UDb44pjOU1l_LlHl9fXLjG)oX+RYmXf6 zA_hsjLC(^tx(p~xa_W0(8NLCek%K&~!rkMuqn5pJGec|E#lMB9m%@D+9{5lKF8L-KzKvdJju}DkY<4PNq2hbHY!4aCSz1P}-M9 z`JLpfjADbD^zb01L@niV6|gzgBO@C#DKLCkHHqakMuD}zpe((QoGi`s@W2v4#lp_q z#B-E2w8JRb2M#dgNSa~u&k-h@WQDwSk8$Jp#AY1_fQSZU>;}~DuhLQZi~j9g?CwAK zWauzy^0VuobJJfPFl+?qeKe6HYnobZkPU@e%O;-Zmnzdh}S0`Ny7yt)7m z5cbFc zyaF=@q84*Ab1-<#@3)h_5>EHpEwTJr6U^Dfz)Suckt@r+;H z$kEYCF;dLQZu}7Mc=xYn^w!JjjS}}~XOhw}}#?$M0(T4{K!&hv;& z|Acc)WrFn$ApOxqwui$M78q1pJM=Fylm+$vkLS*7LV%EX4dU?0| z8=Uh1YTyvy>mOE%OTYm1zgUmz<*z=99FIL@ey#m;eEK^nWZd-;Hs2#U)35+V8&LX} zKmh{(D!Pl?0rMjl4Vd|rzQiDny|uSTdQ#rqomG(D{lTn|jPyLi`sY^%tD(~lX!Hti zY{T&vY!JI^|82Ek21tgl2Y~+zc;O60?q6}Mw%wqw*!O>NQ3kY5pU>@ZIXYvlJbo;5hKFacDagcf_NmaQFH9#Khg>*?^!aPPVvcH#rgH%mXa`OCp`&6+C8wl8-EYW9x!?;veMY%Mi<88 z_~fy87T=7?$at`OE|qOWgA{`|lHBRMSLqIq9KMIOn;RJ|Wjjy9s#wRIw*C9_ts$NE zrRDno?IQR^yur4af*s%!Y+NJQPKkt`Qebj}!z#m6B*A(vgd_T%*b`%+c~*xmu=D62 z1|^I?WBkUbesOd;7lPMQVDYqdKs|NgyrYZvZmuqm6a5^g?t7f@+P{&7;Hbjw@X`HN z5u>rI03}q^`60`y!MXz2iD@JP+1MDTyt(lq=1@v!X_U#O+*0Cznl^ixTt4D{i!DT- zx@9ZbuJ<(zKHVCyB<65BSb-!BLH;SEP(^KBb>`H0GSEnt$WA9Q=G4&b3BRk^ku~_i zD|Bpg%}3v3t?jaV%mkwyXpk%A?6!W~{3S3YCs`M2^g0*#@h+xaWB2iz z2`TS$grh#jCAL%{^r=keUW?vYHg;BX>V9i=wQ8EG^|zQVZtZ)d6WiCklk(s#d8X|p zi(3mU4-70yR%zXMQ2W5@?~UkcPB%?@?xlu^E?8VMZ$(7C1j@Mo<^R}*TGQ_&dk%?T z(_$)}$#_WM8T0YJdFDkAH!BRJ#HbcpERVzch)yL)26L|K$v+!Qs$=vskCP|(ThOM3*?FEEwP}6NE+SDFy(VvgA28`cmeqai zhA8tHGX}6eCUfp22LQL!shVtP8YXf}v{6*Eu%;&oj{&;V zAm_NCEOM-YAZJ#lw#w^+3sKm20n8aVvP3Bdl(~YQ@I7K0Na?#_XN>JYmMxO1eI7Dm z1@Ok+DXM(GtJ9sp>J>0Q-_zt{fi8ou7$Vc?$mHxRJ0SySf`Xq&-^CG_*w9Q4)68QQ0k*4kl#yW(&)4 z^ZHXB9wG_E80g|V`#x7RLqCn;JxtzZ!JIym&~0{F>S&^V_``u8OrLY>p^Mbpk_^zP z7hi(gEV{78*ug1N0%8B)`AknS#=QaQ8l5Tat(ug*@p6tF8cp3;uIgw@pGazRZ~SiB z`jD{H3o&dT7;f0L4&ctZ-ogv=7*_IIGD+5>?dH^>Jln5B(ih3anZSHw1 zSd)5_5#v>C8$l(*Wvm9(lwR^OEe)2;f}%)X~zi)H}*uXnJ^` zgAD+)4utCj2=y;i`129q4$O}2{(o~ef122_xuWzSZomLwu)w~zQF!DuC-7Sj3c&n1 z>69nbk-6GM>mXAGLx++BD+@#eI`&GlPL8JA%=e&pyXNgw28Nqbm@Onfd%^3tkf72h z77<^_4H+C^+y5-?%&MZ2IHY0`%NFrewAIlF&`b5m_jzsy;+qK_bsheo^Z`L@fg8T-ACrFt`8s^u_&=m~J5{M(P09}Hb zs#!frC(7TIx>A*WfqO)R%#z!4wTX?r9haTuxsrT&4EHhjJKizd>zVCk@yIDjnv)A= zKnbh6QhpqOj!okQ9HXj<1HlAr@id%wscsvFlL!>u*(NG5ar4?cI{V45D?6#1+#8lh zr_nGhI7|bz+}-)Z@oWiXuaiNkd81jfj;_hD7Qm(?A)LYHcZox+#jYFcHO^0LEn({$Zrbm3il zy87!~RnK+nVYpsBk&B%@9-9@JCm1>z-;$lIknr8wt!_`6==L9TP(-Y`gxT2(ryq9P zPp~hYg%TJ(&C%hp>4yFK8trF8YhF`7~wC+}(hp`UN0JCK*!!fUt zR+v6X#}zDJEcj|{1pXJ`f%1Q~Z^kW0mYAHGa+`c;WPx&&add(8FPl)_P$T3dZ{i^C zAt+Ksvg0bbN4hfj`dS zn8;6b-melc0|gBoQ;QLpK9m!)Ch$yg7Y>#7>YgXB{4qlcJRk{|`4B_HN_qXafUvcCy-_8gg(% zJ4`7xKSsScNg+E&M=?z!O)EY(b&y3fLCL+GV98E|256VU=CsoP%e98t;%x^SV=t&O z{=Qcr2Kx{w|I)I#1-c6HDc2902#RG!@+#p#b^O7M6s@2n=;14CsR^>P5*74QjI?t! zwNvtwYp_$a^0EpIQquXapY?yD2I%?7SsHaAp-aRQNW=%rmm7D*M`yZZ{x1--$KZiF|EhK5 z+X^!z2f>0+c>LAi|8K<=UQM>nECywIV3K}JLN#i$AvAD8NUjLP1)(6(EY-rwz{bSL zCMnA*$;`wm!NkPI$igHmBg@jlAj!lcEz2a+BGZ(!Gj0R~fUzTNx&{l9{f}JPt^>4$ zPi_C*rw+=Qf1K>{;H7NU2CB3EmQWDdw&%4`V?&59gC-~%Pb$Ijcqrh+t^)vQh zoPpXmBJd1Z1`z#wfVLpVpsAr<900@%;IQ7m+V843VKvBrz@x2Cm=ldNzruN_pkx6` z7Q(?vUrDX%H-h}gVN{0;ng`3E0)G>FSK)dJ`z zKBLAHWmn8;%i$9C<-`K@4&crm@j?;BDEycL+$m%p-JM2q^>t{;#Ji1F$FF9!+Hk@6 zTqc0rM+68qz&}|DGR-NV)dd!5zd$Q%^ThlZeNw(cVFtJ$IcNtrqQrD}b#0e+aqoM| zut5rqtU#wY>Z=5+WSA`{7MN8wfOqhzJ@&$h#w`EhB255#M~O5R!Esq)VPcnCWpT_!PyRjZ+wleE!8)5&LhvmAIh4=F%rXzPz(czbn6}uBw!E zXK)cqGbAaB`}ZLR2;rTJPj-}CTqBcl-PNN>Map#dyhl+yw_6iG`klPq9#BV zA3g)4uHCM_!cxkr&4e?gWJ1BiK$S^D4Li9X&q~`7xkS!y7O!yHwGc+vyK$_9?)ros z^`hIaEMNG=py9csyYgyW8?>*BQ}{RL(S8npWj;B<``>1JAs4}piwo$OB*J*XlF!k4 z)&lrJ2c!_IrTb6c+d5x&d9;U&dJ^)%kei@SvG}k4b`$}H)|E2SxF~Oz$^`VQ@TS-) zGdDm1e;3J(k;NkAj}JC@Blaf%p=EpWO0z^m%6ebWf==&Pa8=CiE5-YCn+l}Grej*`644< zANk_e0{!;P+zM*7*?x>Qz#neJ)_owJzxLK}dx*y{Q>5NG!CXMXp)1-vAxO#5NzqJD z($PoCY;FisA7C;Z=6er3;4i@Ym~sg;9k6l5hETY5aCO;}s-cji9aol^mY`9ZrIMo? zr=g&XqnDr=tIy-8O4&jKBAd>#HUI~Nl1!^e13MN28zvj8Ftao(6|)o@1`9I_8>@&c zMFW#86&tfGjZBkFOP<2e1!Qw1+V~CPkt6-zFF8gjWoIU%XDDT3W+o?S_N2tnWr3lL zqsYk8O^#0-0RifyvEJ+djzZP(zRb*+ywqfalEnX8%Z6bTIp8Q`L^&C{vB{aHbC?dpK5Qb~HvS2TW z&w;)6)r&$j^d~rNqJiPNq<v9L8d)|{Tw%oI)#nQ&qOBFPgBXy@s)a0Q-V0*~tKb|T-2|}eottf3 zPcP*^Uw|ekSMNb`>nIhR0tVpxo9WjmMRBtuS!6Nqa<``lj+t~(@IG2nLG^JY%2 zZzvXQT(v7KIcet3P|3g0@RHGf>3cD@94vN!UUaO8=Fa;HRW0d?I~qAnStBuNBEu(@ zuv8*9i=LXm7b44QV`eQ6NN&u5YZBlwX=SZ~FgRkKiJ`OL0BEg_S*I0Xys^o%koIut zqEqIwVclLXQn7MCLv27A`Yp9sv}@8Z)0mB+V)ullq-^~L)0dy0;k~-?uk7}G5izuL zj>K@TL_fW<8BYgET`~b5rnIlH1aWr^S1cQ|3QH&VR2R>8{wWCJE!bT`Rj~1YdQdex zW@i|5Fv>m}=?;wut%llItWKuJ`rkI^O^L&rQg4`&}E{Av1iR2)z+ z1|?f$&z^V#f9KIb$3^4bv0jc_1($=AwW+CG499@p_A0-(jr~mr-?gu-&)4zrKyF8} z#QD4bpLd#CzuW->LiY!?n8TS^gdYI96gGiUcCAGM8sr#Mypeh5#$F%D^h zKF)}F1xk%jBDqYUZlij*_F0(_A|nE12x?`#P|D(0D>CACy&}kO`iu^eAb*rsAd5q zjvBD1NtRYjyc91Riv4?S7IIf3OKAM)QS_kE-1VGzo7(=j3k%;jNO~tV(ph0bgwDpW zual_Jgo&EJT;f=Srb-x+wt+GuIF*Y>2-BazCi(0&R7i%EXP$yVC-Kk$UmpPQ(CI*4 z=)Sw3HqT4|k#G8O!57K~9K(h06?4j;hHk4XSE`H_)PNPRnIut!gYq*fYV@)c*p48c zz3YWlv&b!fML`{?I#q2Or7=x`$)bOZpZ7r=P{p8SKodMEzz^$9r4BNdG@pEGfUZIq zK9TSU^LRg<0{M?r=dLOu5(4%3t3K%?4JCcZf69?i%vSpq?1cA>tx~7ApYH)iyuso+ z-OvWT4I<0jK{h4wcQ~7C^ccKvLeem`q}AEZ+fVp3`Av*}%?~zMMJl10U4gCyDxkfz zBJTK7d;KQYxp4XheIzoKYK9G~qKbIc0LAg~hXKm#J=vMYH!JGP{$S|HI7ylk08DpW98E(;MO028GQ!Uz? zIh#HoX!)g)+lG9<7V%*ltS)z1aeAs@RY|-2A=lvM<ePD@^nie|xthm}_yAI}+QpK60jNi{+mT1mbPGP8bxm{065{ERW1GZpzaW4yY|7r^ zoDNt?VJn;HLHL#2mYAc|pY*GM4H(IZTD39?qnd@UEPSAS6YVkn3~+Q=Q*{GT%$OEyg3dpmON zX?cLXmFh_TChFsmo-YE6P9$g(TRzs=JkpKA!NXfdO$M;|#yb_@KLazxN%F7!H-CQC zX&2ANKTqv~@a58NsXD_ajrkbnJl8)0jg1{!Hs80Oea%n$(~#u>{AV{j3bQq)ER}1E zU$fC}<)&SfjIr8e{mLc6bbeC}CZoC>8kV6`x?W6|cJA3Nv*XPZA>+MxyWPp#J;B%w zUtaBl2bp{1Xj8c9`3zFRwJ$~`Ef(_p^ZX4>n(P`c%z2HO+)w%}9Dm&(YFr%ilQEhk zh0;piX^5~aJt93WwbF9lTUJVeDpYi72yn6G8%G=j0VtECJlF-)_)E6v{gixyiBAq+ zaKN%BIEga=xS+rwTE9X6np7=s`^`4QAN~9wM@4h@tEYon+x1#@aPX5yAPzS~Zh>gw z`dKNR>L`$>44*BrT;to*;TuV1r)Kx=TN()c4TXSX5HMCx0lq?i_jnVC_( z&=4*BPGXKpKlPL5Ao4L%ku#h*h(OIfB|#axJ&bj9kCL_yS^k(O&3%@3{Q+&;FVvbg z1k^{!nj@`FKFmvPr2&6tlr$pT58q`=@-4ASUS?xDs29&Ms78wMm?leB_8M9Gvq=4m;U&OcSH+X~;OBdgxrjmDDVv7ScIw3F*tf{Hf^<2 zcDlR!^x2QOU@gXLWw$c(;0eGSxh_c4X!;!8z&@N+Crtq7MLWDQV(Po6~q z>xU3hk6|EI*G+)+apg zfFzLqXGv}UN~&Qib>Tx0_5rOU7y&>iO{y0>g16_Cz|>;YJQ`3*Mo%U(Y+CBua!bSz zlStguG`qOaegx3AMX8L-*B{yK08({@d0?k1Zsfey}-GapCd@UpG_jDtewa-j8r5OI$bKOfdK@e@ylC7{D92+e3w}(h%H4>k1mq+EU^dOo=Ij0gWK#spADp}Zjk49vt{NumK=2G7!aFb%P0|uje8)(mv*fB2ON7YmO z&cz06ECrso9SyWNNXnaSCB*1{))AGaZ^nXr8_HQ_x}!m(Pc)NfUTN~JFl;c<`z+^B zV?jewYK>V@k~v555DXti#eRrVO$(LkL1ENy3s?bZJ_Hv}M{^!*)U;?NtB8y<5Nz{& ztKFu&ykkYBeTSh%IB4!*bO@$acSE~ zEokyBJg}=SHOE+~AouUELOlHeCc^`~R=P6nHH76@=Xa`y_154=djul9vT!ShWo|@U zVTX)d8w5`y9<*I5koRB@+R>h~JQoDcq9CIX&}oW%WE*OuYLF@GNxmM3G9v#aWf7(3 z4eii0p3jqTP_)ilB_%eNma?hrDy&Z8+uuB{&q8Z=1zw0dl46X$*}QT8CM&gEdA_i>bEHa<7c_S-0CyJH=SH+gsh?1AoQg{X?(m5!_wanxkgomRP{XhkN6TP6 z*_UJ)Sa9gwxf|QiuS`DOWPN<8OC29B?Si8W6l_DNz+t+AanEM$59njcRqPLM1{o4rd5i*cI0t%l$am4T}jA?<`AWfagNUgq_QMemsXhNzF_BB8FP*Y6>2)32GbJe?#RM@r!6 zr5Zog<-5{=a)r<;TfN<@k_5H$w#EA2H_1JwSD;=?5$dLjPs6BTKH{BUkm%`6O+TL> zkNZ%Mg6O=QiqRxcOQXNy_l^7yQ|1Rjk`gIH+m+6N`3vSFJrVjsnc|`t&&w;`0GZ3+ z>cvGLbS|&<9MET91A{$Hl_=OLsyH!X8>w-#3 zOYfm+XrkI$)kC5RNf2;@uRpu%eR6KC?Sv|a2O6UT>*|Gw3g3U+m^iq-Eq~*=mAccL zNE8b>2$GN!;KsSO#Bny&m@eCRUp|Idgh~f6@~;Omkji}~f$@_>Nc%_Vv=&C)S zD-}5IO;fFC>QN5^R+xwbqfB^;dyooZjecOR@+hr9pvjtVS;Zy2&xC(z6IcGn83RKevvxKbv$eJoqyc1X?^)9M=J3lwomFh*tej=EF2$c-Fk)MY!f&88D1Gl z05q!m$?p&6B$`sQv3O>YitN&k$9g>>Oo#u`hdn-6+#+K~+3lD~-AJ2q#`M1!S=^Q2}GNRb=Eyz>-%G@(d5F?s}n` zs(K?zp^n(FBLA&0Vv9{4oE0rBNYteiL^v)vz{|-Hjv? z?swq}e!MVuGgSJXaTDL6I*JwF%iD+&-)gvlPj*pIagq;|`WFVrs%zVzsA5dJZO}HA zpg?bY9Jx$fPhVfwC`7fP2nxlPu8N2Rh0ttVuelAlnK3a}6{hsOQb|l>!)IamCJaT? z4Pz9F6^VJWMs;Br8OeCC5c0j|Ph93~U87}{@~-^c=ic;A>i^-EzTrI=u@6T@f{-Ci z)q&D1wQE}yTXnF-<)%o5re+#y?WM30v2=I6 zElL^=EEPl5b;R^k%_e3E%sn~O?c4bxGVDFbAv5PZ3LNFWnn_^$Dk@j$5lZQdlZADr z+eoaf!*Q(^&G0(w+0+AWi&?J^cD;`WyOVXp;3Z3e3r)#1g$|5(%SA|#h!99V^E3|! zS-#x}Yj=5EYfP-7(r%Zl{?N-E{?EPG2}Ao<%_PCK0k9-XEEFv#T#K%%pLFSk;maCUk)A7tlk>TN>$4z~}{ckKX2Zf6|qdvrS4S@)PJ*Yhtdb z`0*N{)dBvv2F+weA+y(jAK=+OL`OqPlwxfP2p>tF6sQuIWNGnr;M6nVKtL)=63#S~TXt?HA}QSJSrkPm)DY6 zN(2^^4BHmdDt*tlNy(Njn}c~$uJr`sc>K}^^yw0&Oqe&i6p|OWbim>Rd09I{s;0PE%VxkKY>LjC6vv^JJn zyd-?kBvZa7tzn1g@=!SwtW}kD zDLU1xi3f}j-lhjTfvd)rPG$^0KuujLbm*~#u{BnfpzO(rdsHa0KdY6tJ##_zg)G-( z?v30MZW6K1SBu`EE9U&#S*cOMy1iV!S=+G~Ej~q*-VrA~Rj_#nALvjy3#Q48UYh>U z&1Dq5`(O4nt$wr8qgyy~qo6M*dvjB4g!4LAX3J^z z8?;oI?VLUOY4;Z%c`owBK!(GEC6KoM$hH?0+NDLE9hNq>;-^dPrN?`cRfH-7bk78b zn}?SVIDT0*Q&>(_1N`)Ivs7dv{MREGtE?B>_G-xp5NChdT4La`GOPc!9{-_!)AO zR63Qec`xeu>p;3)K4PLYzg&y5G(1 ztwwg+kT_Mc&FCnOf;V^wSyU_Kv-q6$5y~f~Tva5rzw!}IN5IQEUTx!_qx&`%_4ql_ z!%dOl#*l}Bb(3MjIa0J8nb0y$H%`Qgm;l_4ADTboXYg{kpPmiQ6?>%FBQv^z@V!dp zV?{}?bv8gq>k~PAva$xA_8F&naK>wV&c0YhZD2@MQvG)5u%fey=N)0yzy|%B_~w_uq!rY!$M*_ zCOv4@T>pVzYv%=GOKAO*OEM^qma)07PWAxe2TC~p4gNhuK(j9q2jP)ZqbwV}Ab=s} zwKgUSGSL`x+frpVKQ$lWF?)%Jru$1nO<^S%MM}nuEzpEarZkO6`U^7cGl|#ZmgpPA zKj<46e!J^cF6nBya<^YP!;?Sn#WT^9=hQ0coX)@gf}hKXi@(yLU501VhHe+iY55AMuL~xV8*P~u`ufEc1NRS zfk&+ZR2dGT9UAeR>#xh->qqf$?b20XBZ0iPFppfQc%_X7DcoWb$q(b9TmCU>e5S*x zJ6nfRWf3oCS%;+B0&$ z-p<1$iU7dNENv&1UXz?gP?j1cyQi)ALvkcOb2B5V$=x*kb!nYS6(Wc;h#@V>fXjVRLj_*G_|Apm z#T!+KAxKAnvFyey&@tdCIp_?D!Z4x}qq>>($e9duC~DFTiB)7_A^t&l^Z|uK_RBv% zTd&-1uCIsJzA8oJ4Y8R9NN;2fWNf^;Bw7tNyEyHddyXlz;86i;X_;ck1Z7}GBLi32 zrO^((cg;j#GB;NOT&Axtys7b-E+tYUhG*KF(xNI>wJDgShGAB2z|)O#LUkD%zj#UN z4sHSh}t>6 zmig|kT~FSm6P)o=aL|31b&u`UZwqFU^d0dcHoi`!LJ17@TPSm9jPeqwkEg!nZ6c|) zU-Qnx@P1@6E}7U)bN!3_g+-uw?m8qAu%i}^$gCh>_ZQoTvf&Zh)%=|UQSwfqAzK3| z5?gd_ZoGgOW-~H-;yDj2u}CfB3=!{x^*7+MUykK5PN1zvj`!44sIyRWqYx{)xzoRI zsnq1m^eX@UvD9-k^U|}55;D`1vI=EYuX#EYGs_)A#|S0sNn29ezTDA;tgvqOi2b1^f5FPMaK6T|Te`EZmnDNqZ0}L>rFPx#E*+{>R0dPvAkc4SO z;iNX_xAD?vYE!wiHy-kGL(NOZpr0YDna%eTMj{-L_Djst%OxwM^W}!ugfTR7MHwK( z2+*qC@ezvqRyaR%fEyP}-~gA1Qr zzJ-udlHd_iki!x_EmX?5Z+sa?wBI1cr>IM4=06#iqiD%jmC{(+%Cz3TMOE9c0`C4C zcx-9JzgzDS&c#@T)=@Sg$y_VerRvd>41_)!%^{y4LbW}NetbemqBt2>fe!AxryVGJz%%&eV zefdV>a(|3NY)OW&1L_u4^H=Vm{rO(*KudvrI+)87Xdw0HF z5E91UXkm;s)!jN-JxUa~Z+RTor9 zTs&K?=cXEJr!vD)h2Au;B`an*1p+z0j1ii#MRM&7&Sk!}+%4VEJRVX37)z3IF-Z1U z$s7c7!UIw)qQK`m{AU!VQg8!QEmHzZQOYlXplz8H9iH+n@HN2qV)i4DGcdB_Pp>m2 zI29MXO48RaT06B%H{TXM^BX>0U%lKq`a1r;{(Z;9-sC~sX8e@p7&@8Ek3=6|_dk4j zy1n|jJDUR&>UCvh8>)q+cnhbW>6VWxNBPFK5(!klA6CY}FWwKQCyto&3nlk{7ZzAZ zdBjK^B%Dh>h#beNA{{Tz0pbrju@!m20{E=7Xw7}4`BLF_7>VJ}nrdJi;y7V$eC;~i z+G-<-+G^^=#-_?xcvLVxPcWzt>Ws`C=EB+Z5zBg>=liisu(Slie&NY$Yt#1ss+S9@ znYUQ5wNJV7;ZlMN9p{Ql8gI>dnRSaBhIoLudgo{nNt(fh`zfH~I+66`PX1|?^&)qp z@5}oAP=x57Rs4qj%uagd8##&EuOlujuil8?FUlpUBLDd-L$_S+fmZ)L1s2PYl$B|- zhF&jccs74xA6?|v_WLei2(U-a$1rQM^`LXZ9 z-)m%=)Bkh0e7QLO`g^|X@D&NPCgu}~f!+Q=nGBf>K))D)&PM)U1J`utV4Q_xiqbC` z09+FgDjU=P+$O|%P9C%clyelk!w_N2(z8!hDh1`DA9lD(11tVRC?IBtkD9$1*VkI9<^ zz)J$*J_OYIPid&}0OIn0B40#?r?O2jdock6XzGFcH_o7XK;a=_*!L%FJi`bghN=;@4F3XsITj3Rg#I;#FN}JQbvt` zSFUh#^YgCr-(2D5<34#UzD&(k`95`Yy3g|R7L`h_sArB62%;*e+_ z&2h9tGj@_(upTikZ%D|T90hyUO$>_C}$^JMD`wU38cT^u~8dAa+QN4>Uc<~$p_Iw}u? z#_ik-0-FT>p~z^BnLyENvEFfsI-7r^?wU4uj|};C;YpDCN5mFbJHX;9qqBu!ct9ZOPK}rhXYT%j-JgQB~yT zju`~>-ke}C+q<;ie&Mz;2*>kTyzhuejozmK9DxfEUj=~m!JqyuT=tV(|D&Jn_2PPS z((jwWct(UlVgp9x4-ePJH_Wrnw8 ztG;N4mpXA^$JZqba#|HQ8~nlvX#~&v42^WcBRxOCIt;{`(3Z+@fg4~!%x4siYM0>_5!g7oB;n}0pHV->>j;_WkvWe%UphL>6Z^+DK-{196~L+?O2cahe9e@!4@71ZCQD z{rbJipW6Vu&;J`Ruv8#$MUM#4nIiVU0GN=yBaDOTEp+v4uTC32u`OVae$3nHny!!d zlc08gd+mEJQAUV6^uo%jI=b0`PfSY)-WrYz; zOhxxXtaR@6p_Mw~`~DL=#Z%$5sA2ZFIrG06p(R zKXq5<(JLK*EAZNpC6P85mwWpf8!o_^B(F`w9&y4HA4|kEvo#!80~@>suETDdV0vQ8 zj~+9wNZQcoN0!W9&X0$aTfMg``GEbSELH7b`1|Xdp1+%y%a1;>_b(={eZd^FR9u~~w`00+_YPY7~P zP6Uhv0zC2Rx4Xo&cop>t1Bw_}9|&%6R~OzNOCQt|Dy4FvTUj0nsiflF_O0@ZQ#0qI zauo{wxo3KD#Yn}*3k^}v>h~rdaBU->qS~ZaEZSm;eu#Prb{K?p)FKi!j}Wm*cQSL8sd%E!f(bY_OWE~V|?Pw(0Sn; z-N2eDgEN+qvtOf*^&$ZL279iK8yLX^43T$lW_Bz)E0H8~WTW;T7`D}aS_s<1XL`YP zTP$6`u7@O3UbQNgu~d}TJh8E%-bIe0C?}#D6%79w;}AL1Y3*X3b51nn0MDEZe=Rlh zi?YQo24yM8lwwa%pG7JCJU={?y>Ymi(o|OgV^N`BO13p)X(SyVdrTj>vFzTfqfMDw zyae=Q%XPJ?kBy(>L)0db{J|^|6B$p#00yV=aE7#xOr`gLn3s%_nID9+6~i+CM|A&9 zIEyc$F-tdX_*12*MkIwOzJ>b{{uZnM5=OZu)6a|vDLJI*qsc2~=ZR+NIu=0Ym^V|} zN|V)fd2&Fw7iBTtB*+stu}ZqS++m!4Q$1<|j(KILb^Wm5uB!%(zwa@QB+~RA!GT{9 zez+-$f&)K!=I1UFh~5XZR3DWWh#7BBDgx(C1Y{U!CIkkB$4#kb6w+0+fD;-~bLc2O zeLGr8jI=9V&x=ElDyM4t*0&Uxhg=Q5yCqGW5R=oYBKxrwh<*9Ve~Ps&au!~vqO^p% zkQJD@Q=O^TQ2q#0;t)+!8Eu6D`t;`n`TbfInmT%BnM%Ko=DVmXgzOC6Iq4Cl6~M$6 z@(14G6yCz;^Li>fH%hQ)!yrN5%c#Fzwg=5dHJ3LN) zmldd}@$EAh`)OZ5nF>Mv!R_)Cw>Uk(mw~vaW`1x`~j_!P9Oth;gRV9s!M9js0Q;5SGz6(8k|p1ekwO(dTAOnXU;wYSs^4cCLyt$LL|ARtG&bThPjWD)3PlG{n7ONYq#vr zACuRPgA95j53(6)(lwKQOzA3BP9P-SSAEf%b>iGQf^_$Kxa} zM0jR6pR`PIfJ-@ZK`ed1=fw%lb-ZON*j69DWx~Q-;}iziLO8BZ}M9@18h2 zMs{A}@_y{zkH3*yigeeoO_SStFeeo*$zuT18cILS6(?Yie!`7iJynLFL(YYs2#|H; z7RM!N9axlf>!rFju#o27xGrh}N_rXS!p^iccQ$fzc(=2LlD{8Ixzb%{kX~BSV3j$p zzEF^T5frhFv5$AhCm~^HBCEU+UCF&Zk6^SWe(8_oKfz$3e_23%P<_`F`fV+uTZGw8 z8nP0{0p7PqwUe5Ue`o%V;f(l5VKZ#uK~M@KyuKt}@y31G$<52ndEWkdwUyP73-{e* z#!d!ZfVkK_ycv<5UG4tn@v!d*KastS5q!bCm5cv=?m#S95{?$|@x5=^0HNg27K~^G zzQn_4>3^6eM++;=9NrTC1${`^={C+@jvEK96=E;m3i_KV{5S zDe6@3Gj+Lp+MARF;cgJ$ugO78>!3)JC^hsFpl9>URhu}Mo#egR=Hci19y!b2{vO-F zcRYjhvVWO=(f7aTU7ArqG1?!71=kl?&iyoCM(QKOgJ)xBM~`jWQGcnTAt1)fXCa>d z_?UaU(0e&~xV~GP8@tn-HM_a0D(da#_C)7vRd&(dO=+~zDi=)SqapnYE+t0p%LXy# z^zDogw8gePy`97FJ3Me9Eq!8;OfEe{6*oN($eea|P$`b{<cr1nHCpnn-oIZ3nFhw(E!Wp>;qzDi_H8e=;!@3LLL@NA3F823OzkA)<*uLmK z2xi|}U_Mzdq~W&#HMrPMKlG(oq2&B?83O!W;{rb7#=TqU5WyP=q zdGaYSchvz$H^|qpTO&2%0N$qx`S{v0*~YZ>RoT+o^7UEu+}Gpq+R7R#V729;S$A6* z*t5Gz8sjb|ypW)vI7(-2IfJiD(iTH=F$~g8^$yyOj9@eB=4y7+*cg<)f}BR)`xy6XO%ahzrdbZBC6R2fJkyqhJ7R3b{gYOET> zKC!gqa=fL_mRQPibB4PSc}n5+@lUPw*6f|)k;n%C6Ryr&HrCZeK~)W)xW+{Ccq9hV zgq1m_*PP@@&OlW9;5&)+PA0D0xGU%|*;!Lnxp=srqF;sc{Rjp187yQATaT9dY&45+ zPMAtZ(l1^4wBf$ERd9lSJ*x?MX(s=T=YX+TV`2_x<;Sm};jUb98_0HJb-yuHwlx_EA zqThxkY1cFSc{xFxb#ZYson_(PAG#hL3ii`dKT15-vu+$1Y}v}A#de6Hjy%^3-CeL= zWiMF2zs4wAy6(`{+)sNmu}xL`tu-1X1mZU-d`?DoeOe35R-;=xpNLmtcg2s<%ee3BCS|)jGVqwo30gk^uE*6;_C%RMZZm6% zdCpt{Y%C}s0wfs0L7kU^K8&2<0nhot0g>lfil8Iv(0c0!d;W5}jJ$!+kWtRESTtBe z8fO~re(YeM8`9iqsS+VlF<6eTdQBv+$)hYyzoh7!5_RqdHg~(g4)b%l8&_^IPzC<% z#H&__lvxuJ)b+M29R|3K+BI3Q2^bpN(#HN#m##pV_?dRPKA9xgktQRT)~q4jGoG}^ zGOcLSe$q6a(ivTC3r2fI{t2Agy>M65pXGy#>Xyk2G!G3`*hNIMr9>(PuRnv)dT}dv zyMb2FN}WqfHPQ@kvJ?SD2MOZBYjGH>@XrDJp5$GBl_ug436$}@GF_BHgY_A!@SJArv~nPohUSVOIBkMBVoAn9mt z%NVF#Q7=|%iuaJdJJ-gR@rpDfpi>-X$P(_!=4}OQha)s+5y56c)fajiE=0crQ8DZo zOLH~3YsyX{ScW0%s zCU=5R#Sfd)E+EV>`PS;5sC8rABx}FR)6JNaq-@baP5ZqK*g_9&%5^;ajmq5!+q&s8x90)i3h)^JDT*I5?lUFVQ(!O3EO@NwM3nIYT@&ghs*`b&-Q4`szqWvq$l0;O1Oq$3HOO$ap?&NZ(wrOT|# zq|R!z4jC4p4YMG!lz~|jQXrFad(bGOoolrW$0h%;o`+^pTDzK-Nm!kcAbN&v$t3I@ z_Ko8je{-pWtS;nW?lFx1PFi6f6&l)dyJBmu)}|l99Esn}&JBpI9i`AN?r|G^E-^|W zO0Ltae&b18!m?toOs&xkz{dGyam4t27?NjVqiU$^IodBO-H?o`wsR|PJ5KeT0s42p zUOG~>wV*#(K`y1Ci6~Y2Ev?(i`RX#lJX2SBR~tPo;H3V0Z0WUJ=iX$9#?DfL>~9aJ zSrd^CeYHv?=7;1{Y$tB#Q~opek+m{Ine>Yi^Ta_Am7oJ|`fyDjU+zo1oI^i3+@P3R zrEUGtzL+9W$KNh-K5?Sva@)B@E(0dmwdSBd*P$cYJZ9lL9id69F9TTJs~HExmP!uW z(GyI=TvhF6n0n0fl350RXS_?id}nz155o4J@>y_Yj5J7csd8&BImzc_0W!ce^}|qL z?Ge}tQO3s7CF7L3BZ8Bjm!`#Mh%zNs=@V?342TrfZTSTskYEp`%!j;#2d99uS~p5q z+yZl_Z&v%)u=)Vw@-*`H-WEF2$co(LBO}s zF0msCJK+O^qd#xc!*QD)>6edr!DQ!EEp1j9Za1s{* zjU1VHKf8(V2S_mbHeROr&f3C3fM<=TU)?SmU_`)X$lOG9cLImNQdf|Kuwp7YoX4c) zBF%05P1jPSSKEvg0)`WVSzY%b3{{oYYe`#4eAcsefBS}0pD%-$s5xEyD2j5Z1FDJd zW_!W;gth6yD}H5<+jyDYlb3qrvV&WNuTYz-?8^6m2gnMjagJ-K%!NwMSQ7+PBw6fq zE6i}=p$4pMpcBG|EYQkycWTk%JPLJt^e=6|Ci^iF!I1a6&iu&Ih9tfGt!NBo&>jYKyx=YJVJv?Hk&oMfgDU7dA_x%Zp(j z_2?`xqxNG8lsV|v_9SKZloV`XepMFYET=+bD9EU<6f6_Djv_rWJNgZ;hNm{H*!n;h zYG~aau+;ICl*a-$?pSYC+KC)$ukhxUqAoqH!7=;BAqqPgMdx6V{S%vp9T0wlYb-Fy#y8ph*_e2>)6lRoa1lN*SDZC0D>X`Ti$96Gn zV|_UvlO`OJc9;`!Q>dtcY)pRcyeW6XRS7!YIkC$00`=Q_gYLtqoo+doBqA)r22{Lj zvA1BZBf)UIY;}l}+9k7F-ptSi)6fn=S)n04CMRiHpj0F@3VD5+aqaGwzx^Zb3632z zu7P!tB%GnOclCr;13+ZJb zp8Gh?E-WfQgcB59s-=an4nU4rT-%q$g)$eg9l}nMPr<5%PN6@+ABo2m^Aptp+`ygFxqudcFX6r4K8R#S=Wv$7$Y^kf`lmH09 zqV&0zKGKr>^pS@UF{_sJg)hZCe_^xJmXlpGC*k14-6v3W8FvMCzTW{wd@z!0UCd-g z4K3dk>{675m(U2+yOh_%*==x4nWYmm5*YZ$+;WkPn;D0oT&((L1^RRm7&V%EZil+QBP#5JNHJz`UKpS3!93a0=pSmh3z@SBsM*bfj|O@B zE#?5z@|2vvzlxtauKP4g6e4xGX(+CUObo^JnO8THWX?k=uoJu_EuBhHZ)%AJec`U` zV&!79MljY!i#u5)B#9-=vmBTRks8q3mB$wo7{LfnL9xJ+E5DC}H*cUwnlM(9*xZ~e z%ogop+xg6ir=e;P0JDO)G;;~fe1ulYp`oz(yN@B2^(3x_9AF$VIAc?~U(hXhq+J6@ zI^0`y*`)>AFG0n<*oglOao%!Y*e5Tg^xO$oGabu`HiH(f8e@;!HU(TrU{)g)(sew2 zXezFEgFz7;eMz2`&xxDH@1PfC8qbFiUt_4ZOAUZwu_4YC8R24*QYlX4W3QiS=XBY4 zwo|`oO80zz#KktgNI*S#mKbu{|EXIdKRJGvXqP+n1m}V_E%hQo*lc5}EOy75Be5&T zkY9OxN@Q}b14LSHD3ZC<=?iLhOJuC*1B_{-P<2dx7FBpNEot5nS7aJ?n7Sihn!w`R zV4ROx3J@26;eZL`IyZ4&F-+xxMS5+qmT8RpaOI3o=JU)d_=N)wrAy8kl;BcjFkfSS zJAK-j#8qGzY8+k$Bn9w`1$|?2wWo}BM<+R1kGlboe?kzQ=C;Y7g)MLEO6BA}%#q?` zQ7X*@yv&YN?TU|-%lA`N#rV}`yCWRpwFgxDqS@|A5xaBzbJSuwzg15xm;O=`mx z38uV>1&QYFDbf=xsDOf1c+HREa}}Ho1!%Ag!M>a3XffC6HycgVpJ9rLWdA@}Swb8x z8H|xHq+hWC${K-8stR!!it3%>Jf}$-8>=V)m5Xmi6a$Ky_BFO0JF}EnE8KZP z=@A^_lIJrZT9hx4BIh-2oV{V8t0!)73o+$B75b~qr1U>u6di*}U}Il+A+9V#uuIJo zENAGZNOBVUIfkZ;y$jEaR1RHW@;P7JfbHV$=FH?f7a;8Y>;htbQLU&4v}@*PKmE#- zJ1a8tU8p{)G!eq=sMgwarI7*umIQsy{O;_`iH(2oM!v)AhXumOH24y-OhD2vQ{;XQ zFjR!Vt_pPu@IhJMkj81&Ty=MD4u-7^E|`uz7N&C!#)%)$Ej+PPIxIb1C29xS(Sgpe zxRqyU)%?9%!#$7w+kTiAY>0|9OYQ+i0;JN+r%CfK{EqOcC6@94o0(NBXJ7edc-B1S zQpzLpnVot3W?X34bWczy#1kiuGOL;VGDH!o(JZHo!C zF=r%}t>^J9Kk39PWq>}=Xnchw)VWKV21>)AS8h*ZWvnEAHs3mpi8~!Bk?Fli z=DkZQ>gaOa2mSO)KU0lgJX3j#8hT5~aE<=|VeOxTb$Ncc0r1$iZQJ+Qwr$(CZQIs8 zwr$(CefEBT@4LITTl?o$JylOt=QHWG-uAdk{&{^M9aeaxiH5NnQ(0{T)B@hP!lvqbu-zclI<&L|bg(;MmH`?&1*?8-K zpHk;oEeZ^zeHnGSY;RKm?YZFtt^HJ0TC}zqB&0Dy z^R#g4c2fLZCgoKh1f<=U-#k7La?Y0lcg!!--O3Kh-1RHoAv;!9$F3@{j7wQCMD+gd z1`%i6YEKO6xi{XP&j8R?I&I-h(^;5#;TWQ=t5Ok2dWH3Fx;O_94@48(#gv*b0iI_) zg|J~^eo&~|cUa&8tyacg`Npt4Z_gW(>0wN^dSn1(xA7|!0_Hlv+ers{imIiDj*In= zdY7>Rx3bJ^Rw+4VOv#NzER|r6>FVay)!!~zJRE8>6<$hsz5*5~ z5eV~?Dtcd1b%xtLQIm^?(z8cCfGJ5;D%3tX&U<7er5tY+*XriLJ)T%0d>mX_F9V4Q zkQSY2(Mjc!E?=2bVp(rOzvy=)23S6 z@?O5H@Bx-t&ykUR3Sl!j_23%Hx$tf8Z%ne1=|BWhr(R%31Wheb)jR}pgb2VYxoKT| zl#RGSPlVjCY=*nAF^n1*tCL^gXXi))E5sO>d@Q}cv6r%wIFb`(SY8UGcS+{T%5 z)Nda=mY&AmOOQ9 zd*D7Tk1F8xz4bnKQ(@|j!Ne7=JkJ+O^u5EdR^u!YYi^HPueg$btL?GJ?lD77h4UC% zWU#%G;)P8%LLFCdOESDR=F+8-a)LCAEV`T|mhRrD{hLzca@qm61EKves3esh?IQ=q zGGolnNNMAZ4=hJ>CXE(nm@|X9ecxEok)9~Jt6pT(!DN-1u|RJ~J7_p?IOOt0mtPAa zUg0D{v*|7A02z8$evdPGg8F{izr(9_Dx|9|*DANDGRMFX3+|iabRk)r@;Tj7k0<$9b6YYT4D2-mf4Q9O(EB$w-%Nd85EHTyrpT7J zM=utC{JF#fhl@ut10>P3i=T8P!HM(BDo%z%_40!SPV@+nHXJTZ`NvaRve(h-+=wI& zT|_dI9+;kfX%Acf?-t7{zmDk30#0#tN+*V;N|n0?1Xx9a2yiNNlef&N$s(d%^9-TZ zbMBX8*l9=cpXx70@TilGc_}hcMV3P1Wkc)fx%abo7q+d+wUb*DqubR2xQ5qBXq6y~ z6si?2<+G(mQEsWdw6!!X_GL(Zgl`k>uy10^z^F@W-^T;&S{1cJSaMfXI9eVtY*krpc-eZucLS%cszwlox_a z8uD=Vm!$dwG<(DYm){=8@mbJ|TY!=4X+`PVkdZPcz^m$7&I;|%iAL?sVW4pYj7w2R zl7ND}vduijK0cGJs?sP;4+@~aA8y37l!DP@G9Qubeejy4~DAL-wU8?`Or;dV_}iXn+->?EpQ# zoGrwn?p5M9%RA>#6FbFRQ5M~J`0%yP+k~CjRlDgEpXz}Gjf%@GJ7E{ikyiJrg~TCh zuZM$HP+v9J4m#9hN4~A<(bV0-+Ui2fd2EOeSVLTOfQRHWcY-On@pV5WbAR+e(C?3J zXGq<%Kb@1#4`oVWdr8=TQ@?m20R-(KYHomL_}sGr=>X<`AJ&0Z)`9BVrIWy8{v^o* z!Y3h=AT+Vd$bf-SxY}75Qzmst6DHjWf;LquiE9k~MUt}puTl@k4KB|G@dNCH4b~bpTnOFvj;fr!)eQc?t>}L z3Xh~+D=C@Wy1|}z*BP7C=}xFD4%A2~q$o*el>cYZP87vQMV9u;b`AreB<9Llo0iIR zqeC$z&UfFWW8(}{mw>P4=7S|9P%Tg)D_I}fkgnxm=`IPoU)mNoBmnmS`0XWd0LcF> zm(jcqw6+RV4=mV(CnyJ>#4AtM^r1ixl$4ag`%lhrNqfj3Nqni`O-0K0tbkBSF?yIu zrr|P8Oi_V^lMv_{wvzvZ>5y~&;qrgG@a8}S;M0RpJq0xSKa`{YC&l@1M96alfo|P^ zIG;F|Fo>wI4O2LY_F1&{+$9U2LGn@|`C`phT$N?nh zTx~!@WEdo^PVBVa|i6DV)etM(qyC*DLLhHobml1z$hR62_`nj*fU4;*)>`3M4mh`JMO<& z!M>10hErL%xORDlAg!?7$2s-LdW>5*vqcNKw50cjI_Q~ z+_L@OHG_X7mkVd)g8)T9y1%uBV>OE#F{11gr`O+@WnAwovSXWaykNCv6u(x!&AkD) zQytBZ0Rt4>v$b48Dy+yCL%m1Fq1D&OAt9_)56v=Q0dzXSb*`BMod3x@an=f10A*By zVhqf0C{(jZL{BkX!aPw@!D^v75`_n)q~)&!;ktBFlCeEAwrg2xVc;A7nNSzSiV(bK zLp?bC2e|v~cv9GoNLLD;cc;V#Kl~)j?)%iM&u-RtBl_1Bm|G2iEqsnAGF)eb)8}CU zxwq7*Y>o?uZ%5|niSo=h$6w^3gdCAA+^7ycyIf4D;5#v28jOWIwI8oO`(4z?fT%~Q zS1NfB(xX(H3t%=sGrBe}=Fjj+2Q-W zdnxbE4y-b6IJJCD9F*2gL8c_>WKg!vVi_}`{mVp*6_%JWvILm&=2K_+z?9l8!&tk$ z!##@1jhjwN+bKj`B1IO0^X(kk0b{6Kz-{lLitI8M>l==(I|-Uv(jwj(&4KZ$g?7Jc zcH>Cdyt-jvEL+uuHksXIPAqJFSSiPcmkE#g4(h!;%^Lx`yqBU0*hT38`*Pf}!HaCN z<(6DUXsXRq$L;9`_B1dOBpnr@^zg#r8O7v~tCGz>D%@nu_C5!}nN)8J(0gRv@#x66 zszvIRJK^RVp_bB@E>cvU#}e>EugfKmz@B7>Rbk7h-sNVs3T%d}5v7o*AAe;#yys5u zTX_S2pT;1TZvwiPwHOqs_XKUQ^p+nIY)2c2vF(oBs3MA{{M9BHwQ1=08xw~1ClR;k z&E&k;cEs!~57}L-7}kg*CRqY*+Db^7le0FfYe8hTK0m9$mTFwHBnAuGJBuz8K7RpG z`5rfpAcAE7>05io`50FzY^H8jQr8dD@TC=HFj_H5YB5!^aWPe~F&g?2i7J(GX+ZmW zMT&MdLA*wFe41Wie5!`Bb|C`RfoVa!GUQTW34DsI(wzL#{|-m}rKXi=l9yKs61SIK zc}_Z38xs>Yn#g9P|CAT2xq^l{JTZj80K|JV2UL=tw22>YzEt_}=Lrumrzs#){U6R_vs2Uxb1DqYCkNTu<%LY^^GfLzsa6jlyxY@h zDnO9{@Qg@$y}iKh*~=O>cAIPnKRn-1MBnnG=GQ=*{(#$|Y!#cB_DKa24X_Xdb4aL& zDdKU(i5SB_pEu$YrMgDo!~U28HIZG1+fMXd+)3}wSljjvRmOh_L!)Y_3bT?;_MdB!1CqDh>ERzZoGh&fR$08bMn znL)GIQzDp1r3A;{Eg|Xm_JtWEv(_Lf-_S*wDxK(tX(CG>&oE~}#>5QivwkOv%g*d+XBB{d_cs(bMinTUSqe6ZFQa&}~x5%>Mc)qCoHWmSxTX1?(VEL3rg8 zSV_nvzBaUW!Jlf?zT1#eyCYHFh*t$K8zw0R5`lgBi`T2h)%pN+eY>}O-Mv3NF82#6 z7gBMrW)JG)8QE=2on==!16{qpE; zYtz)#)fV|(n%6IhT)(8qlpDuYD=h@2%osPROi;q5l8{BMZ^^#Q20>slSYn%@N*FR# z1jm?=CnpSBoFfM;i9YIdZ5O#Z>`wI&|IMaZ3Yv~LWMM=9{qH8=>`nb)OPi`E^c zPDxOdhD#YLVQd0sE*Qniw{cf}R>^e~YkZ;Cz=53a6$KMdfsmUfZ8td{xBGiHz`Vil z$+%8QIH^TwQ|VB9kc4VnfYl1nqN>k{hkUvnmO&j35+$$t^6_HLCdB<=bW0*P=%f_- z0XO8hIM9=5uEo`3QmTuc%(sUIW*-K>1#>)tGf-Ltv4wVM*-Q!aImum`D?OE*cmaU6 z4RP%0KO6Az3ILIujw;6a7Hn!|2-zO4x$4YYWiuf`RkAlhq`qNT0!_-GVRxNKk7VUL zc6MNWQtJZA3&Vc@haO7YIUfs22*JOYWe}CB1p#_uXZ15_AAUSRW!e=Dw1DY?k>Wt< zi!{^<5k_BW0`Z+uTtP|hkEJ0s@#<1~P~afbEtSUPyEEK_Jshy4GTG<(IKS2bUh=mA z$m$@@e1prjIj#azu z>S%OSPaT9S{@!A5tCB}wO)&fU+3}&JRVjIoF^qSmK~R8ZqgYYU(}i}vm!PmyxOx2s z1}zpL2M61i0Q=8%L!K{ zxw#u~+=u34_$d4uwr!Wk+O3n!Ab~vPYF40aTooG%aAxrEbhT5T$+GjknCGZ!F*#@v zRjn{pP~rZT+E@(JzHTMTB#5^exXE0;8Kx3__$t~KR0O3%MI1)NAjfc14J{-^EJ544 z;V3bNE4#8y1IXEvP76>#EO?Y9I|T$eQoRQ-dd_CYl&3MwDQh&>;u1f{-pDVQYQ!R95yj7?7|Abnd01RIqODADb<0gM*yDEgs%#by znys|(A0?D!g`49LH+g_puYP$3+#6g*S*U|<3oyl?*JL+&X(Dr)anhDdrpKND0a;`Y z>VDS}?$k#(b9*thqbB=D@87(6>6R=^ zFtaOX;hi107yWWLL`cgpTI{yiCmIr4hQ?Zuo+PE!t20E1XEp zc{dxRj5WGgZW+bY`AUD5en-zylM>lMo@F*V7Y$y3!yD2Oy>!^YFRL7rTs%qD-enx*op^8!+sdXK3jQH*vsdNy~q_;A?r!YW~ z+My(lhn%0gC*D4pJ(A|?Oj3TYpMo8dJEkh?rmSI7MUsH z_Z~9jxO@EwxlzuiZ7*)ZVDEnP$Vt5-uYv$$sQ;_!HEoA1hO!DK-DnlIH{@{jMx3+; zVP*gt~edyIQ@_hOy&i>o*mQ*10y8BRy$v|^Zdqt9kK7thYwOCn)E!=wH(loc) z3RZRAJmai#BmWDKE5rGr&6rKiBBK(*XrP843;B&Q-hVV8q6!}>h7Igj?l059L*J0G z=3+S|S(TE{wz4v85A@K24oy$-v`P>gR_wSvg`M63C6S=hu1~y|Qi7}Qwbt6%w4S{H zOGg5?i>XBd2P%ehdn{@=QUC0pQ5r6~Hpg_$q8CmcD3U>QorTLPR!haHiHXC_o~S#q zUG;#;pfa%n(!cftk1r5xZC0LU^UmFgO=|uND)XBF;E#X`ILfi0l+H5HmNeiT#@ZlrZ##WTzD&V{wog zXI^ODFnM$DA#z*}T&%1ksuu`XbL-98Gp>5m(c}ZVJ@WR^e>WIsM(bxx-F;5Z$bu^xCwW;8MO5lwl4;E9pbSDHVC)Hhy&Lw zqcEB@E9s)tPeC!EjSK$ybpw;G2CgM=vE>+~XMZ?f2zk5#;Dn`Eu{%pG1I_iyz5&Zu zs=$Hm0GKX}bjZ$7TX4p0x?gcIb?TgL@JP`2*?_n>_W&tTnQ2ah>@6Q<2ij~$?7dO@ z5ext9(@?slK6cShZS-Ou7qBLfm&OFvsHB04!lFD460XDIdQ4zPU{nZ+t zX3swlW`RwON{t98R$)QUw`+gPPo@6i0?J0ulx)=M-0f?8Ne&rx6jaw-z9~8AG+g5479g znyV#InWRwRz?BwF9JGTT7dO_sJ4#ICkEC0Qgs4Rv_#K0^VA&<>yJvse{ft@*q1_%q z@fHmKdb|U0_kg({0fx%CXJ4}USU2ty-X7U?$xcCOXJ>uCS$hDe%Ytp~p@iD~N7u1x z+~>M9Wn{Bj8HdEdNpj-wAaiJxojF>`%AO@>^MGvyQ&$fZGk?&sMWxt;k-mhylaW19 z5L#)87c+8%DuW1rk1sQQ0Mm^b_fmIX8}?8%t2q19-Qx*d7A9 z{tJ2RTo5O2!=D-80Ok`A3%8&_@c%<>xd%ZPML9}Z zYMSa+3Yv#!iFDN&)wc!;gfs!7N7fe<1Ol-c0N2-t^qZ28xTpT(1z#_7vw!@5c^Q`A zWLeq%<7D_XXD&oEdqB$51%T%RVs2&duhF(^!+elAVq7Az764xtq~(&&4U3P0b>8tY=ioK{XyN>aj<`y`Tp*~CgnKt2n?W@0;X^P_Fsh> z1N#wuVEig5a`G}D43g7R)HDhbGZHjP^OR!M*7t`vIH4aBG6E3tg7oYGhUoq4#mIHa zc~EO-JT@>f>-7$I4-i0T863YS_FruISKY=5iyh&o`V&?1p`ZnP6R^xKsRbDuE(?;kT_Q}1`}!myG*DtrK0l5-|DT>yopFM?zdGyR<;799Z2On>e$8SKtRTzLqj&VaNY8KUw{ z4XcVpB6tadraqPej&h!|7&OZMdR6`Y$!Q;!e!gw z7it-L+lgffWC2PengTMvhxMz7vKNUzy!whs#u?P`36B*jJPI|q)bAWC7tv@G@|7|- zph?}{+ocmkC&&@-qT1h*2z^WyKn3NK_^DFfniiFG-*O~*0%9;^W}$d28cVRfC<;pQ zmiD8A-vRJgY2v6bw2Z$gd;N6!a#ejOz=1P*xcfT9g$6WfqvPTd&j7}<#+%ilH_%O511D$ym_ z7JHd?*H=`B*jDJZwyGPuprd4i)lB*;en+;V` zypn=|f;ny3>PveoA>}Ky|^utZgze^ByGJn2Gg`eTMW*bKonMt|`a3 z=s`bxhKBKnANT?qv$|P|hE{Z&n7|02!TEkJomq#seoCY@>N3X8p>(H^F(eo_eGKx6 zJ(_xQ!o*ac3Ez~$^g1wvcGHa_OacHLqp?rSe7f(62zu%SjgD!>m^*;da{m5=Zgd^W ztQ9CI@Yg}!0ukf2*6Uj@|CFiWJS9TV43wA4t(f$0DBLuv|ZymT7thojF|fS1+I}9ZYxr2LncA)B74t!27KP*aCu`%J04% z3_FOQ7e|fdoY~H978Rd`v)u=*%%-WLceYHuI(OLvlyV$N#z{Ston*_y&;I>E-6=FD z_3e$bwjMGZ7u&5L_uyFU%Z(sFE?y@b3{iX5x|*T4@~4c&&mh;bOF?8NIBZr@21@7v zaThvHZ<~gbKv0uDg2|8m4?@gL%&jnuC3)wVxC+fFxE@|F6>1Ce`oHIQ2yUg?>7a0? zBUD16tOgU0!a}-Gd@x(Y1mLD(D=Fb=GfVch`VY}@1DIFz43T^9VfR#`0FIInkGTD~ z!7z%?(VX{Fi2?iHMbf-%po9Y)D)UOG$vm`GjBP8yTfqER(0%3ZObS|4Ht<)`@s7i# zrpal}u(58lK;M|-TY)GF%!00Am97!sn>0MiW+6NzSn^Kie!68rlt)*KE1Y0SW_eJ^HKbX6m1h~d znJ+|>P?kimq&ra5`gsa#HvE*;a*F+`@5YF(Fbh2UJ<1oSdmHEv)P{i7xu5#|Y*poE zXt_S}je0^n$5J2dJISBqyJKCDJny+TxyLL|A``7}ML=vQ54mG|e*CgYzko~Cd!PNO z*ZDj|vFx86QU%b_w6)iPhCBJ29IeR54^Ebm=IHC#fY5oE2m9IEl8bZF~jiQ{fHB7Z95l1H8T&yh zyphD|Di0X-fF)c3LRSEjOz_h^K!X3s?u+(8ZF5Iph#Av(f|F|iTm_)Nd;d8QofdB+ z`h#4#jK3PqKBx9v&Wg8G| zC?sVWC{zV`g#grl9uZEQ_(;MZS$+r=pHL5w78D3ZGKkIU~tRjAR~Np!kCA?$H7s#SRH;Q2cH+@_z_QkIE&FMC-USU_JL+fs(5Z)_-SNxatWoPvsg`N}2mi z-_R6Tb^W61i0W;dhjI4%MwB=YrfeO-f8QJkjYwUGNYbiZqI&4nD!*C*pdczVfUTEZ zt?^YO>1!albwG9}FxYFrVC?^Bb0w_;TKbKx6uT#` z0bDENm%{7pyGVz|+0~T$FaUWukaZW}RR4msh0fA$fjFy1y0m9wKwE{G1t3s}^sPS9 z(f^XAK^}8CMmdxorJeSZkiPq9ZworlDIXP=rtrJtGyFw2DK+yqVVB#hH~<1LKfsFW zhW-D4ZZ|;q@cjXDXhy}}>Y=$l0Kp5=r1GkKiYA%{5*7L&Xn^P>_UcO@_kWM$yDq(1p(*cMAC4ov}hMGolk)EodxqiOh|0@j~C;(bFENU}^d-k7k0jMAb1krt$ zQxv|A$-;S;6{tWrgopsRGvO&=g!>y>TG#g-wZ=D2Ilz!coK0)DnyQO;s_;bHb?Q)j z7`;A;xRy(7j30XpbT_vz_9!5EUBRgfeONAyrX6q^@qV!kr09~#d2IL}Dhvzz|1!D3 zHJviBYO9A11}Jm>?)9gMQWuCSrZ?Og@O%ysib%XyYOkq))L^H^5wlFt z6F|*e>Y-b^5fq-J!7H^_2Z%8M%ZHR4 z;_-83`&>1}SU+c1celB2dXqj*h18x+WUugBiyDbDkH~Sm>uW8-n67k8dl|c7Y_w}^ z^ySoZN$t~0)Qosn%}z&Hrw;mX#78Wo$Mmw)7kBWzea=Urx6_U`PoNrM+d}ZVcEJzJ&nBRSDACsH<=Im6!kLu3{Oy zDcPG!C{IqKI$GMbg4(;%@S+^tBg$P6rm{X)*#-tTSRHUb@YaP`OrS^dkv*r7NOJ`8 z6PT57j?8DD6sjKzp-qHiCDU1GwS<>4&0ki!FiywwI4*jF+lG%S8{XgA#4tjyFMDlp@BUYBc6js zmWg!uM>nR6gRmvHshN3gdw5zus1yHZ-8?_fiqjmZUCpgdpWM2r5B%ZfRFVZ|RR{&- zM~F@70-XXFz-NS((mUmY1%%~=WLMI0opI({3_{k5(n{2qKQtAc%*k2c(GKc@_=^YW zLf}tP{Pg42k~+pmc{LvJ@=u8r+TX;7bG2ViZ`5{hX*wfz=`I*zHH<0ymclZ^-lRLi zLruVGCtIm$CD~6vbmBtxUR83outGRjM8PW z;z?p>{jnSPrF`xe7e3trNibAL$G`?=2P8FqPONJRaJK}{(CJTF9N}Tb9ohp6mm1do z4f7U99OkF`!(%~e!#?+v0@Mjnx@`@>X33FZ;&q45M#-1gR~2h+C)jPNh4?u5}l4S2J5^j=8+>JgcRWhsnTm$`c{NAeqtKqUl z?hgS7Vn+;EKobMpPGWq+8Gr?lK-VMp=_D)@MXKMS6T~+iWfKnh@|<`3IAhXs_e@Jvf0jj7nzak{^QG5i{8b(6BW`-I^RGtvZTP zrFDrb*UKtjowQ+?WaLN@JXAmmb=inTti){OoN*^eB~VB?C#RmDEk%bDFj`_54=qy} zjvogC4cOP}vg;1do7!!<7*8ju(@`T-YI12Q+TgaO5WY}1hEL*$D~rd6!&q;=OgHP^ zWe#;|c8tvXe-do=ZT&C(c#rN47~^ms>o^T#vs>7eM*X_>E?G8D(|TF8*n7z-U57YI z6`7zCQLu-=T~pM{ywf8+vEUpWiyuUB5dFRg z=o2xWszzre_=v)kf2~ycaWLx7s$Kq5-7f%abClV#g04=1P_9*mSZ7{Usu`$ zuXy*mvqH++Ol~_K*aIpt%*AG%*Iv>)mCB1|9u0|Q>aY!F@+rNjFRr)Yom?3ILnF*@qrlLg6OLqh$hYkcKqdTz z0LYzsnpUyA71-s_rQ@ss*mg?|-8f$z?zK61ko>=)Qb?atSd^*}7aw5gf7UXJOyV&+ zocxQHPfJvila*9rd9P^7o;y#iaDQkuI|uMJdYC_Ve7y^31?kZ57W1+n8`zf3*SNm_ zTCFoL4m3HptyRPA>mOrf+o}SKMVpGYnVs9W5aJT>L(gW}h71Gs4R-)LgE)aLM*)6! z+2&{eP@0jR4ePJ4C*OG%_F9wPI}o$ZPQ0$B!CupU?OBMv3Wr$vpVK0NG6z!|YSpaF86!3kzp zh#ycnsgaxEn)ZR;kI8WP%y?`dJ#F~Ir}c3?_F^&X*jzs&Rx4DLIjUr zO^0pB1}%3J!H=TNi)#Qzh{r^DkMBYMVuSaw@ zd0A<9Bn{F#IozyPHn zC=jQ2fd6Gf{;MiwhpmE=IzISvG|wTCwC3@)=HWi#YF$=BqKK!0$JWd!TT&{hf~7I@ z#+7?8m7d|S5Fc7D6&#%J7QinEMWaDD1Xp1luMdp`t&S1_N=<@x2i)eS>l*`{ppW+Q zmV29h%YC}#RqNODdw%^IigWif_DqQ&+@m~BtX>%&Sa@PIjB480p}r^bH+U0gi^gdH zz{6caS$Qvt6Vnn8bsRh}U5V5~L1^Fo6k*2&N0+fnR+}JV;Ko0%>bvx?qx`h`!h|f~1kKIdqZGPWs^=*`EPk`#v z(UChPmW;z4Mr(aa)s(jTZ_oHS(%-4I&Q0uAruC&7XQn1p8IxN}xDZ8KJ;Hhkl9Ldi zp+R}*Ap302ntj=h@3+;L0iUOgJqI`BL z@uT?}Z9{e}I{K_$7m>hnwoZULZ0bUyt0)RRI}~SPg|;xL#Atq6qAv}z>KM!SdYeWu zS|}1^{U@9Go9tB+I!?3aw6K};VzdYnk>1!yLC6ND>>fl6DG-`LUPX`8kt`iTZWYmX zU_~P6fL>SGZp(41`X(m?b+FtffMtCw9Zn=dMvdGjvU`dYrc6a-fcjBZ6cD%zm}do+ zgEp(4I*a=PXdM4thxb)%886}Y%V+Ddl{zJUQqX>hKa@W+$9$axp*Mb(Edx9;n(Y3` zk_fK>q}KsF8&y|A?L=v$pp@AfPxcwfL{9{W3qqL=#>M5Lat82vPOq1=QXN7$o-y|8 zuxeObA-yhg>Y9+`)bVQ(p%(*46a!h}RP|p1y88zsaY8P131cUS^v4RSHr5g(3zZpx zcxGa2F&6D%e-%I`UB2yH7msY2wVhsb83r>(hNC`J7Xhz@L@h*O0jG;W^WA!GX%) z@Hy8VsJqd_JxzgF*0%%&sCvr?{VuTU=EM=gs~hm%En(y?V;Fw3h7SHz?zjHTSMDDM zKu+58>{+o?w@oLE>!0pPaW4sr&@IASStm{$2i&+Z>8ligh#mE*qJS1hLW!J1C__FV zK~N=|R74*wG7&q4y&~d$Zh`}ooPL&6`)1)dVdtb9Wp84Jh*ki$uwk5kYTTQfJ?u+Y@z{%Di zzMCcQdfO>)q18z>AG9HN$oC?GU-VP z!pW|8Q8z!9&(6*l@)`6M$Bz5v@| zG@Rfo>q>qwrJk5XuGJOB_?>;!>g4EU+U!#Ks5qr|t#Nb2L2WZ9zk67?X--|ihEys{ zfqqdNG-nHQ$5or@;?Bn6n%bi$f-O6L9fRn$qV20G2fNGi&jghI5lLrHLVL2iD@m-_ zgNWpF&-Oyx!DHK>G<6+$Y>2jwy@FQc0|mjg8SRH%!pdP)f*7EH&k9kCpPWXR4SySoKhl(NB$ieVxdxYRCV6 zEtv8PRkw2}IYla={x@d-&}7mR^T3!O&7kEz7j4R{Qz&;SU;uPlX0U4@e|Yz7Kw5x> z-w2g-x%j$%0Vw zYW*sCpyGeSd;W{UgcPNSlK2>~A^9lDOo6@~gBC56KDFo`PpfU5X_$|QvX z75M>p-O7}z{~kEergiLe>MGi1d<^D zlr>95&S=|H(UFG;@JY&fy9ek`@1Fg+-?(c6OuT5!Np?P6AUy#Ez`6+vcLV7!^&ib~ z-a_zx$khlhByp*5YpQD~@r&qk+)9I#Y^TOl)lE6C%U>aynk8Q~EUHO!8*=K{;U4}q z2!bOB1SNf0rw=Kcx7L=BKSJ|zJXV|SpDNYco*3DhqRxv?(kqHf$WY0sQBcrQjnT`} zu4MBB6uC5Vn^n3y+DbY&n^xluc!Fwag&a+rajc3101%C^U|j&`^&|beJzN08zeylB z!0}Ni)}RgXZ@d6{MzWgNKBJ5pU|o^933+S@AABfea#bdHve|Zr0R8tjEA|OfLy0Al5EOQ!}A^wu*v)?G^(}*ClFDcX9U{yZ{|! zd<&puJ|_r88k*oyz?gFUn~h5b4`q|sEJI> zTRmMysgqEv#B>6eMDY=J)wy*8CgDmBCJM4tXt}mXQguU~?jCPH(bPlHP2OOJ(ix`t zi^}XWuni1&+CTZjGOAAbAAYXR2he6ZIx_|OTT@cM;^Ci;DUmJQ$~@zLn0RDfqctVb z=l_1Pq=QK*rk!xgMh{**1BSfdc_ezcHd*St?;g`_g9XcV=FTVPI_Kh|<0hazdx{(83F%i?)mLC_43PwE9AarL*S3`H4N7 zZ3?}?a!j?G^|k^2=gcYCZE&IZo~mVwc!}d7K~!%>`a=qEak0v?Rydz47fj(~nnwg# zGf%Mnd|r`+B!_sF?d*rGHTcZD_Z%kC-*~%A8@`1`i&0)%wk*#9P)eL4`kYy|{)D{i ze$G|7fT^YJn4idowyMF2BTsZ{QVccf)Fp8o6bvt-61R!318bs)eB-}P5EGIGfU&Oq zoof6ZE6REH>~2}1mD*U&iV5v*WhR~w;fJIGUnrbzIx}LR;dKTkd z_53@faGGM_s<$HDl-AkyQnm^=N6=q;qSrBF&ElvtyXY#O7Jx8DBBb-X#c=KQ&e8k( z-d+J#<5fi4+2q~G!qSYih;V44h8?p}yZOSS?%M%9+-y4ZMSnjs=E7>5+>+^|QX-@gE2``wTH)jPNsKUB|` zQo{QpHamwyu5dD6U!7WmtE?kyj4&jA3K-;3pAbwSQ2`-0Nn*r^{i;)z2{nolQEvJ` znP25^~4Xz4C$;gpnM`6Uf=JZ!{*VLs+ZaxS6k<2 z9PW&pFgNU9iNvpS_)MC z+EwqBwC+2=j}!AXKA3WhFS}wPt)%t)BkZC@a_v~1x79=ONNUB78R|jCWmC5ME*Vv{ zyF9vA-W=+9-Viy&`b%xt#LKlf@ASd#GY9&&Lci*TXL)mbU*eBjT`l>S-d7quAXIG! z1kTM)*v76?FGyJk$lN3^#S;{jxFU@(qbHmNDFW~GoP+GmRdv=Mk zjok(V!cW&%q*m~T3>M%a{1jEHYb}#00UAzMQ|@5M`&~CU!s1V5o78wZ zH{aY&ubI(3$0SMhq6Wb#gSDs*!u$hI!X--#-f7!S^nDW?7}2E8(c9U@u=~X$Fo?n{ z2I=g{j~uwP0kVYU_Wiac(~tzg)pyPuo(B*mG(mu8%7pJ2RMrlP$a0Q2h*i!@S1&Pb zEsD$ZgEL5o`PLGzLQW@>nmVan@g0u3LDl;honVJM)4P^!yq`^r*2Biw{xbuv?hgDQ zLrOTIQIoamIEUEOV4Xc4y%2h8IeF8;JF!~-00Yn|QRF=?nG8*T6sW38bI!@T4Du<2 zc|Dw|>M@OiSjJo5oyRz;kq0wXkH`s)xk;v+V^L$eXsbPaZ|2U9tf77y#ME5aEU9J! z7eJ&{3Ty&G{Hb4Q<)FkzNyzQ`52)F+IA~h|uzb?93_*R!nHa@jA^nYCx zwDjVpdWQCXxB{&}R2dGnjNw+MAovh0d5k9NUIkPxNJCa!E1t76a@6dni`7A#u91+M zx(+)#v8HeEZsb&#%8aTWWaN{BWBO(<)M|6m;?-?tkRjkOX;B0v^&9U37uK+Wfw1J; zRa|^tgvPH30~X-aQwf>FxH65Z^K?${ZY*bemfHT-oU~&*Q?2^maxEWx|6(Dl9M&=X z0Kb-GBX;t-XXhj-$ZawpjP8C?%A##(B@XD8E`SuEwMbHm0D;*hU1}p)#p1qamo7Hn z^0I@3gJmGRx|;po{&HXP@NKF=xtdF0;Wi!GPXPR7$XF7Yy0N7XqQ9cam_k3lIN6MQ zHuXr;^-nX8)Hv7v6Gc=&l0uj<0yPyw%dm7-80O+hELqJF1j!>-mVGV3TeaB&yE$91 zDnh<^ejh~_pNX>y1P|L~D5}HB8rT{8?DGQrD9|OhnRiQRB(ZAtzsp5}&+1WI&+59|X$lLQJ7AYyI&7 zIR`N6Yd-45Nz7!JOhg9j$RE1t&A4@iCY1LXKYl)P`es6MP-U_~2AFlfcl^b{#19Q` zpF4}BalHp|gpOmtK$8E8l>G$y2r&>x~C7mb*9k1CT^Yxhyh~UP(Uxq)WZMkAx?KskXyYXc{9`|Y25DJ76F_KyX z{Y$jTds0IT+mfk7_3|Nm;zE^D^+h3B^!>Drt!mzRJ^yOHSIPCnK=ZO?t%h;LLEDt; zw}I9p(q7kwB`O?R`sjXWK5TgCT3hH{hCAcPe%73Z__^`a1)s@?7TvVL2b!8o=w~J! zVzsIfo;&4~IRh*EHy?WJwE?w*BoVA>`0qdnt(s`SwQgp?k{PL^@UU*Rj4u1?4JYPH z<0rrWq8BKSG%}b`!sb*M_CuA(r{iKTZGL|;}JvOxqDNz85auFfYStMYM z83&W!Y|exUOIYx*2bZbhg&5DC4nqpJQ5-a(ctWBw;!&vgPJ(26jOz0hIP&8fM}Rm| z!%%%1FU5QBl3(XPdFFUnl)C%+zQ(@a;Mg=|bWM4l9^qD;9zW0iO|X32B+su+RiwOS zWymm57LIoekndjtd8+YR#Z@Uh!sNS_N->EvT}A#0*Rn~KM^nRY^AtAG3RX6!7!pJy z8aNxIRJ3JlpJu|3HXAKf#0o>Lvze)Aenr{&wm<&qYU8o{aezUqe93ab>IHalKCW!C z|8H}P-amyv8O|FmYip|P4w<_)F@!`7bQU2pKA7$JQ^3+rn2N+5DI=uv+&Rk_Aj*$% z$<`|{(|zg|cRkdxUJS`&NJnAD)^6(tK>+P8zCJ+~^Q&c8UeM@|b zm!4NB<2X}tFWx}lH9~W0L1yFl%=5{a#eL(r;FgmHPyG%mZdd0?JQ^#|is4?nnFm9S zvL!DOn-s}7ZhcT5Mqot6j|+rAF;S#AIRE_-^gfo=H<(G5SUEjEP8$>qO=3E|S{?m+ z%94@ySz(@S7EY-qM*T`!*?=I3C6Z2@ln#ht5`Pd1p70Lwiq=^4wb*!lzXMm1~t^Y}(S*L)9{p;>mbm;k{L&WT`m z0N}iTpGlsV&0rMl9bG%;K*AjA}ux z>7cRTwgIvzEnY-RuyrPHi+@M_2L2{^rOT17T&l!2OY(9uo%wT`+j%s&wWu2H(SYI= zRieCmvv)GnH!PHzmbMl}($tu&-s~L-oDT=)07ynZ6=V+k^jL!?V9N{?^Ec~`nadne zu@!g+Nft92!7F(IDQvB&3u8vBCYBtKbnf;(fcD|?P0KlcYu(m6u6s05(w~og#N$`eeBYfb>-J#ZOwe6DOOleRFx_< z4utt62)s;%aMO!e_H5gBb?bY9MEmkIEG*7Uo1nNs+R^!+N65ASKS030{G#q)N?rS^ z!v70q^>%r&j3ln(LT0?NgiI>yw%yiBNE6@nj=_||nQujuhexl=d^5Qib zG{d0%B6gVDDvf{x0!6K8AVmR#Ro~2wC2bmSWrC_^F~~n+JXF0v8XPowZi)AEk3*Nr z?`2)3aiRg54n;@9pb-S`5Vihffhbt50tSO*LPG(oW$G|GL8e{u7<&%WrB#Q^xM6csK~m}OAOss}iC$gIGH7cqDrQe(^L#nN6TvwWLpP!-vu7|( zBdn!7qktot!d7YXld~sZ2z9tfW*`+sLKVUxy?IvI#oyRtZriDk$DgA)z=ahr@q(%GW2<7tIjMzqgb{JYB_2qV?v zmdoD@p-Y>Ih>71Qn~@hH>PF}hyMP=0v^O&(+inSpLMrc&xgu-=^yAVoSYZ?k7Cj@T z%$kqE{jZDT?|w%XpNoAwk3XM$-?;YXc^@ysHtOb`;2pQIQ)#l7097ojT;a7p&)uxj z$P)^Scl#-`xYYH|qmLJFHUe?QA~L1G1Mwt^qIk*`{#7(`4)E5U%WX9{v#g0kZj!z6 z6VA;>SbXyNFgy`ks+wy=F_o?#T;VJ6mbek^EY6^WZcf7XUf zm?CeSz*e6sc_}hd(R(tOnb?X~+Il#$v1te|c}dufbS|%CC*OOYyy{F(({GRb#2M`8(D5FGhmw&XQd0GNAA2zL%f7srf*LnI2A0tz7(&XSVUc~#1oQ3j z*^;$0j+goPKrIpuA&QDXK}R*;352Rmv=%jd%J=qLXWMd2J%H`LFK@ba^4Z563Z(WG z_rNPGYG#{z?KeP?^&FpMR2Vy`lf1HoMR*S4ed7<42~q{x!*}}d5zngb%2%;Z_Fd*l zJisWJwHtrIg(*5xu3%_7&|&uj&SKkV?0|?t$Nevm!Q_*~PzdD3^VrG=48WDyaNk;v zM=e4a;D^Pf*LHD8tPz}7ug;k_fUX=|a}Th4_N4eU__Djb&E03HUE6$6I5^cGA+5vv zPYNP)$%>!UuH=sA53E++t@9Qx$6fWV!*}s>Z|%f`oy+8Gq5-)*W~-$l_EG!#>s-c)Nr=Ah4nZzb!$M z=A%pG-&1khR_UP^yVOG3%+NrFd?zk>oM-BIsBjQAkIcXw=t0-iu^vlt$A4aT=u{A4 z|0>o$TVFE(lTkrXd@V~;trJ@4(x{5&|$V=q{xQd&V{&TGSEm~uoRB=WrpG#TR@=S$i0;C2#7MHcR> z$Z4Z%nw)WKZ4$x~4=syl<4;kvBJLUva zj^vwH{A5+m%m(9T942T)t!qXzup3d9{FR)0)Syfl^%{l~5QvrX~E;}XW!FTL=Ft)aN^*FM?KWHsQ&gP`3e%wt9;w?H|b=V2Y>cqAw0+aoVjsY z$#`e|^L5A0KKkyChCZ=Q~&qi9c{qPwN6qpxkHprD7Suc57JprC1lplO4k zproOMWnf|quQDTp^m9RgC)&j8~_`erd7B6zi=#B=f7|) zv~IHQ&Ks45Q_o*n9!OHWRYVdHHJ$A*jLEnK5+%nN8}!1)uP!o%)IONZmG;^xiHA?_ zt8gRhTCL*~G{!8HrIFAwBM=s`+1;S-+ zsffpjQVKdYTEA02k~}5E^`;L)jG}r72J0Lnm5JSCQ&9(v)L-ig#j=bJ+ppz>Xh*~a z2v=}%kvO%uAR;J{VNZ=u%|}h`(m!3h4;ZgiPSx*nY6t z^9!$*j~Zcu07)y!EjvC-5@z=cE62W_@ltO059aYJyx-fN+bY{aCM#7w8$&Lqlt)(B zacot2ee$9S;(!hDWd1NjUM}@5MV+PGevQsNw}9-nJKRbrO--$)6E)x98tiC6R5hsr zj}kVLacMrAJS?0aPvjKQMqt^*qYlceF3bD&<(|1=6DSx25Jk#Ni~&qPzBpWr+`k4` zPJS%hxFRCI_sKr89;x!-q^bTOYtI^`P2he{@6jit$ed*vP-OIhm&|R44)&4+YhWlv z5xIleL4|qWDy9_Tl21agdXemKxumkq zBD2IJR&FF$H2^hfrx4kRrA1tk(@7=U0Y8$x}iFh#&5qiW=_q=`3LGczbTL2_0n31cSh1H zMZZgke+l$PUe~{8mcC5cz#0~OA!$hH@;6-n>YNUs z^P2$zWEVoE!_O*!?w`{&-k4)D2tP8eDg6R~=LRBw2oxavzvkS3&7uzfECIIIDT16I zUuR=s(xZ`~L-<>4&PfqIS>Lnr)0X8I&FwpTy(_ zz-k3C?NRx6yOg!$HW^TSZGDF`!kVL!rPc?@mQYkm>cwRQitA-ELj@fd)Qeq>xtq=J zcFj6vv`S@#I6Ufe9(5j$Il2#zy8^vX5*^VJYta$-Q}44IHNQJG+30mX16x_V7DDQncxC+#BcV$u)R=FywTe#n-+j<^i2!meI( z%ieNf`2eTRFp^-Jf#$FRZF@yRA2?g~pZJ2GUz3Fspt8C%%2tO1b~voa7!%M7zxk&RHnMIyyw zsgm9-w@0ntexyCTLqO(iza^rX_@*t+ghp8z*|u z%KWN|YzgFDtwiFGk3LSSvL%tYJ5ca-Bosm|;R5RMPoAH4x5oVy9f^phMDw4^y7gCz z6m2Tz%}P=(^>+f)nO%uFa)bWi99lNzoSor4M}%9z)*N}oclb8S%4MONfbl1$%@tsbA67O8FJH&$^c&c>#y;8L)C}VtT}Lem6KNP4sk;` zI#42fKNonu-zOk1x9&LbIL~X)kBdM!x*8Y=*EPKHRB0@!pOHn|#y`6_Hr(sqaxXc2 z=)QSpy$=6*mpXP?3@ARbzQZ}KYJ#2J(x}Ce<{hFFVkO0&?v>>Zfu!}cn=Cbz->*8@ ziScX}MfV_YxlXmSe?re5Droi+ECx%$$31SN0g#nVwW|#sTif7zk|urGB}a6ogf#7wUZbm7Or$E*s>#z~{p3cRGMku4=R&TJ6VT;C?dC6^J6eBM zgtXtDudckqpxYSOP?I@bD3H*r+hq8m+nS$l)$nh_Br_TL51UXiH6=)x zCXMTRE;r{m97?)jMM*-(Pm)qh<9qb0(rhYnOmfW=XhfSTxtF^eaJuf{c9(^)^d!il zupxmTv3SKV+$`BH3;-zx8Df>G2u2!;gu>~|H`_qJSXra6#oaF3F{(EvzXI$)0xAML zSyxvDLZ4yp%?iSHfazO~HFoyGB0D_4NNM&WEpEtep#-?)mxu|PQVfwzN3f}ZYDr7; zH9$Egmz`~9!&;JUxvFb69S9tn(g!vl-jTMNH)iX``(9gW3rbWe`C!P?T@$NQv!IYdf{*EF9n6eW#8)5iYs@)QMv zr75mYf(p|~&+z>|ap_G3!*9Jr$z`BV--~@NU2O&MpdcDii+z5x-}JHb!D#_M>^wh6 zy4{w;yVcG|(B)7iGI2H9G?<7iRtsl>XGD94^1>+`Phj5+#4Tjc zlCgWN6?1sm^!=4VUNz~82ZUDulpm5QNV^rr5TAbTcoKCybkecz?xiKNTC;`qJ#)>u z{dDdeboIKsT>6G}uNNH^#G_HV;$_@IU@?fh{bR?HwX`Wh#Maj~!~-WtQ|(%nqMymR z;@k^X976*Q;SN%;$EcOkz9PbC11owMcK&TW#spDF0Up9$e*OUAP=-o^WWU>F46nvAZfcBaSz&%je-cH}a3n2160B)YNl^wC^;9y(c$T z=g-x=lAC1(_q1&ppHM1u0`vQF!-tj$8FV8*5>&?V>`c>bS@dCTkx@?p$nb|0DmY5kGN zx3Lwo?BsW=#;kA{at}{|82^-qyDgTvgZr|~a9tIVlKEBxCTW&8M$hD6O$Z}|SW8nJ zH9;mSRS-EE|M4=1lvBY%pHfE+D;3PQCnoZ7n21b7hF7tqakE`)THlH?{~Cel0R5~c zb}G%Lx^ncu?olF@p{s;XVdD@f|4-^bXP%4yM@Z;KN70{s4? z5IeO}Phzers6Q<|XZLOhBuLo4J{neMrelxPka}XJQ*??Jxz#Q2K!2=%Ve!B1-MZU> z+_Q((uayosFn(eDhK*cCo<{9XX5gX5A0NDS^431?7@!SeG09mhxy$|{gWDe|)N=~c^1j# zeXgRns-+QV5bd~@3Jy(sZbL)nt#HVshXGIA*wYRa{dT)S>-HYe! z&9B3V@PfyRAfsG1{A_c84K36K62dcQLRkCR`YTqO@C=sFQ`g+M^zLG6tM`$VPN0N2 zY+~+@g<+oHY#YD@20G6MHhQHi(zO*rSGeuE0--oo_autzk06=E>O-p9RyBv_WXbX+ z&6ej!E|_Cf-r~Wg+yxuOD*!MK$M2WVsf%ETh~{%;D(FcbKofOU@P-ess^>=A`mv9g zcZ&>@tQ5BxbldttbnkzqJ(CS^2Cp|S+_x|Acdl=CMkGyt&2}PPT zOL=m$3+cb@f>2|Zh?2M@cAg8X2CjTSmDF^oYDTu%6_;%AN$g+X7-xG4p}+Gcg;GO! z3^BhSX6@|36K|rWr&f_V6~kLQ+=_b_vz$4@7;}~*$D@@m@omJbi8!^6)6R4ShPCz; z`N#u3S6^FwP1r{#TyJ1g=W2tl7fF!B_8T)G!1dm2IoAxb@roI2V+gc%_q!*_WQRVY zB*rUlgf&uMq~0H0m1KCEV^>$O(*FufPFS!RpuFQTt#@Kh%l}=YgNsVC+x##K z@A9G{I9)T@I@GRIU=ue*p7ICVBM#7iP}$=_)=LNNkUXK-T9|6UK@S{roOshG`XnDg z9NGZvk_Rg5bOSXF{%E21wDRw28wrZX8qeCkQ<%49X4lJg@?aW**~*&4%VrL0X2~+Ca3f6cb-@g?>{Es@OZUy#$zmD&Ar06z z*%CfHLG6lf8R!}P3xPSF?l`c2zn{1b+5DtgF3cY4wwEI#-(-_QQo$Q1v*Rg`>B6NQ zP9%xw8eWIeibioEBH7mbi8j^BWZd4+(%s^N>6twPmtSc$*~YQf7@y8LP_TC~gy)n! zqRaop(r0Z!DSkxG^J(%=ABwQc@(&)%F0V$U5?|*KOP~`N)Is`y2+-de`$o9sL8zLUR@M zJ$4uO&Rs>AJ)KdXx&1~Qb9G?9K~yS%1bRq2#P@~tKD z6V#PaGdEVp%VS3$q@hS_sMu%(4B4*Y-vVvd9wDtY?y+eyFgrb(8_`?5XS+|gR;Thx z@|w_hM|*bEo9C^V&j?P7L$)+pkJg^9jIjsTT(CCt72fAFlVrS9czap@Hp>*Dy^Vp! zgy+)$9ehSaf~E3jIUpv$aixA~WhR+?D*s^TCCV01@oAU{-Cw(&-{?l;!O9Z!V?+SN zxeycj?XD-lkC;&bCmEqG9~$v@6xipWp2zYf=s^vyv$RX031jEx9sL8n&2E}izARYsB zVv*v9O~HIK7zn>bq*JVAkEAKN0Dd$8A=3CN^v?)aV63TvRcQs z>d6MD)He=np!Qb&#sa&aN%c&_rqj5 z3BuFYqgUC4VM(k*g-Nh(kysMU2Lb{1j?1;Q?AC2Hb^$vYQNC7Sp3jk0SIc+Bo!7yzxni+|P7L^E;3k6)}MK9lXU6;Gcij4l#!OckT2mrVA$du9nkgHRc9kx$d2H%|@VT zz7m=QCYkxCwobkIEf`6U;AL#-vC7W6bnIN{!4KmW_f_m1 z*TIhkL&8iI$;@JrhlHmx150@N5D#D5BpRH1;OIyDVP<_mTqx)dJz7wTpJp1XGrBFQ z_)dph;#PfO1w)=J{8{}UIFL`?5bkP5LybR4xMKQD?U(Ko51STX$>V$2;RWRKOC+xph8O$Al4^e|mHl4T4GQ7Z8Twc2 z5`&zBV7`)pB0x7Df+ESp1bmg=DPT1xYo;D#h5r)mc`)9H&|hTJeS|Kd3dCyAqHMLZ zfpR^ezO_~oBb@Kh5p#S`G66 zW3qCLT+^sJ)1nYl;95%p2>Nj?Top}L@9a;}%28;mdm*@|dO69_CG9>3(Ijq29vt_f zoT@qMID>Ra-OJx<{hjoB>QOWsZ!cyH9|m$Kw2S2oM9eAa;H*CN8RecDw}RQ+{`}qB z!3wVh@04D;Ir3YZ$Oj{-gdI?8-dBtCMe9={MH`NibDmd^J`>gE7C;lHFb@OOqtn90 zYdNtbgIpXHMc^O#_-$B~Kj`lXH~dLrKiVjVZ3R|NZz~{PCwInGI*)ivNuY9Z&b6-=UlbY%4MJ@X+XjDH z%!wYzdvSjKYT>kav6sE&yTYPQBVsgvg5<+eep9YL=zBnjudGAN+_Nu{eTWh4^oH~L5CnicZ8DL882td$e;ux!J8xrLRd93 z+U3ch3|7D*DcnoUOjXZRDvZxnPt?p+ugI^0R%**gJEk66lCXxD&U#)y&;W>v#|8U~ z=AIoBKMgg&fDkj~AjCv0q5^1P)N5)#qCXZ}Ucz%c-WgeHad2`j;M3cq# z3e}yzA~+5KFX4|UUP~vqLzHbs?H5?qFnTghrjyswDUwT*AXFS{Z!tw&oUA68CR}AU zyn`@aR=0Zw9s9?wZ^7Di?BS0mWIZC7MmF^wUq};pw66{Og!!x9J+?8b-BLrz z|2DGN*kv&w{A_(e!CwcR4{0q(+MpsOq}iHFj6EpUST=%ot9Po+Mty+2L zBoWG1R93o%CwXVuXK|5i0}$0FUOB{Zvdz}_(D~4L+<59-`T8W$1dF!FeaDcT`?*Od z7C9>7%i4zN2w%sa4am%5OijbhadSpk&q%-&-(`4ulu4d8U1vbO7=jHRTYHsB{LT3+ zdSTAdxiMS*vObLjvOY^7SP1E-`jRv}QX2XbXqeRjVu4i5fu4*q!+4%P*gk(A9SnpW zU3JRMrNUqq$Dm@fGPPxG{%_fZ=+b?)jm;%&J!;wF&m{&8}KC|;sc^>RpM*9>w`1^18%du=%|>?ff%GMTqYW@KaJ#y#x#S2maMvH zzW%F^T{PFq-ABI?w;;>mUPxSdfcX4e0KX=7s+7yZRRQKn=+;g^(3!!FiV9;P9;e=zj z>YY{0VH+*vIS-osOiWJ9Qlj1q->@fDa>Sj6$TzM$d5BN!+=l;%*)le0)UKPzlN)|{ zvCSC_7f(tY*|5bMm9}3L7Jbg#*F6UoMY8#lua;WT*FuEYXXWAK!~BtiA4GuFD@us! zoibgu!#Q49lVoxRB4%X&aj#J~@u|6O>SgE+e{ER&9$zAX4myflcrp^OKnoqeRq=&y zv}7dJzCr!th$D{Stob)bX1uKT*rjRfU0Dba^C+N`a)+~v081vF+6HgVXo zb;Fiv5g3&p6M@espFDiNF|9Q}$qq?w-N@ixIm3#|mH8!V5*hK6quWiP8OR_OmB4$K+H@nq;QEvt0Zu$%X$01 z&%~r5<7t?G)16(&e?#RbqydvQ(~$u9hcTh|fzG@FqoIKUzlbkzl*Kgj>k2`+;uWIe_qSO0xh-d^e&D$ZUS*UEST3^Ri4 z-3Rff`X4IEMTjz~0vDaUEGEh-yr>L5y&`VN)fw*o>9vWPPGwF;b!=vwW@b)iT1t9C zBBv`w0v~__6iKb&f0lppza&>8uf8Hmit}VaeE?Bp3+JR-<~6JfS}gYNMj9`1%$R9ZhrzMX zU;_zC+$bbUi#5N)bpvW2aXH_*Cv)sD?6NO$B;7%=3fBT7&<3%`d+qKoBaB@?DZiji zwRYfL(C*nf(Nb_ggb2c~*@aUiHxLov_O~0z4ARuNh_KUUPfw9FEH{-@bvw-g8Jt-6 zk}@2oSxj5Bxdh2nq$ZKY@b(^Y&@ZM1mWGgkoq1i?r$R?lYZe-&x@bX%3g&O=r59UE44%;pm!^su2;jJ$ONs<4=Z! zG5dMEobdO^TnA2#(`=)@_ete+0|bJj^-Gko34}S4QpmGDi4Ft|8^uzf#oEH$Puc}+u>8H?7*<35(A3%&w zsZj8ezI=yVoBl=D1g?N|F3XcpqxcvVIrBDr7jdYz&s>AeEkHFd-k>Z|A}SDdJkr@gsUhe z_+I8!_(v(U68sAVTUAs-q!~ym8<7lJRiD4K+*7fahHUJ1RF(#kf}aF0REc=amVe)VQ60-eQammbz_*>-dtbz32y>Mw4mZK z1zVo;4)HKz|a2M zp$8GHY*lK{I%5UIdq@ap5i(9*3;Dib>8mATj%M*mrtf5!B1mdhP@AaM`W^L?zmDm8 znRBu&#h+2$o=`k(bs87}m{D)L5dpebc2ZJ&qEi$Na z>Kz1oB9+soyg`kx%54QPC!UH+>KEEEP;Lxv?-#8WR~9ofE7UPsjd4dvF(yN^yDjdB zuxv?Y;f_vaGu04kl3`T80aO=vPl+*xNy{)+E|?I9j-K`dUsFIa9)$!{;{Wpx59x_Y zP0hpldjS~M8|?3p4Cp}t9RPbWw%dz-=FabO18-b&03Wybw?Jj{CR8k`-=^WA;)R9|R7Gsn4 z!hND)R9DCF4(|F4?fTIXFyJtm#=8q%{!WCl#PN7E30p?wedFA5rli_}MjgvawO&3o zMPD&*hmoDs*dsWp}O9{ z+_omzZ!y>3qTaiA270}(q?Clf?%8;&z;khi^Mq{5>5Dva1fNbB%ch2u2i=`$q$dYk zWAkU__5gez*k`oo3oecYHZXx=Vpm7QW?UygsvNX=zv<~j{4VVr92DP|+6TbD#g4YS z=D!CyT`Mk=A0xExSj{_!?H+1wJJ--Z#>HY)*tx0gk9G#4SO(3MJjQV8x!g2uv)Astf4{A3 ztr(p+06z0Fi>lL2>j0b@lkNqV&)v*g?o3l3 z+>TxU{q!~QcXVLysSamy%*F$^;M+ z$!lXNtM$o-2!w#`{18NVJZt6=MbRh`TB?2wxUwS*dW+)noMy-VrUFAI;7u4w8t;7l zR7|c`YfU?F@dQWy+MJ%RLTsLSpk37g zGVo&+5CP+G#(;ovMl+VLj{{x$&azXj&sVMBVR*2w)r=-$Y3IU4O@=*HM!u5ozy`?Xy>s3KZdycM zpNpOQZ_q%wDD526<)_kvpIq1BO{iDKqWdB(kZ1^oEfZK$ zh5NsAD8d5&Uq9J^F~wu`_ogcMQbNG8>KuwqKVW~@*ho!lJt7|t&AgtgCuy8X8s3^@ z^swEE?A|ru!oGIbfBtxij$F`x`{l0d%v-V~PTl}Vpqt=z4$|)rGZ{Fd$*N77moX0g zUY(<-2K*t_t|vL|@_JZ?T_9Y{Dcq-8l0Zi3FdNgw5R~|&Go-%`a`NH{Bcp|6M#1n( zxq!IDpGQ>mFvldA2!^7g6O`NGQ2%Ze|50fTZiDkdQ*4xha_)FRn*^s~8Ur2%Ndv2X z0p}ORbCZRk-l7vg55auX}8*e7ea&G`p=bdoV(dm3D%t zC1V-(j+wtuM=m$Da8hJCn7)9PI8Z?zI;CjJwh-8eNF-8HEnHWmD8||TJRI;HQlMWF zhh92<9Onr(&fz-GVk_>{viiM9yV==Ddy(lwG^Xrmz!0`EqaGWZgT9L3K6F6seaENz zE|U3qj{e~iaefIHsQlj+t=B}mAQ)n!aZ`;Ecz#PJ{3eX}qKT^kAOK$z@QwzJ{|-XS z$PF^Ubib+zUz#Wf{rE==28RxX3f`*U%+n#B<%dXy6aBELc#mc1b35=gfQke7TdYb*fp*RbhvY6K=X0y)X;_oDP z__|Qj(TfL+AC!a906LM2CvUoZWGotra^%mF+S5ozX+V;_p?2)*W^GbvSV$e9epW1; zZe4v_PyBj#vU3ODSR~3RlTrnYYU#1F6-c^r5T-~=+qhzgjLwa}yLj-w z)2LZv+taKDyh%MP|9r-j>78g>8UQv4P`o3cK*9g0-9c6Z-ef*C;}OwRS>2euOtL3N zCuS96(~Ozk2^!u_v`!Gn0Lw*CZ&ra$|Ka~+SPjCbj+<030ARI%z}p5v{*OzFli<^c zqSyZ+P-uXx+5Yzq?nHBzkARg z+nU(6ZQHhO+qP|U;$&h?JTWGjJjr!kd*6GX=YOBiIq%MTx%#_mRdrWaS2d~&6ERN~ z^dOT$FKf)mWlXG4Mac$g-4@93NY^=ve{>3$2pR4Rm0{`hr&eH8nPFJJl6SpjN+os@ zmY5;#V6yI0?<<5gDCC+Y_gzlH z*|){@`EmOXh~XS8{|S)4%|{QPeekyyAo@^@A(8Cpv&wX}b_>*|J2FmoV1So1M8p{| z=|}X@#~Pk3%fUoL!Xn*2yhO2>9cd{D)CiI4V4)*nk`d5@CZxnKnF|eoKZF)-{)j1+ zr}#f&N*J)Yx2yv6xJ&LJY@|nsulOH+Q}p!%BQ-N^#%s|#uPmqvM8q09k%-Izqod6M zA+Oy|w=zxHYmyjyWB*J8X?;+RxWDVK6=(?9WeaNC)@NU5%+l40PL>(YRkT0JL0DjK z;rXTRT)M!Pp3DLA0Wx&X8{kmjdc6Y+c|xNf)m;Sta7tG%3x<|NWI@dAwO+;-6g*dhAY=gyqZ zZ5XQCpO=#QwET&P1cym5T$#4iHpK{dBS$zVIC*J64WN`~m4BlrUYF^3@!j5xFCbUf z>7WsLB|N(n^VxPCC1S~SqxbiqX`qgJ9IwRCJ>GI{2y3(^+_A1skn-_p?zvp0RIlo2 zDXS4K_OOq2R&mg>#4+8Fy)_A_H{4coK&RjrvE@mBTfxiUPG6$6Tb6W ziMYxSfaC$bqO%Q}U2`Ud29kWbc-+_sX1FL?eU!>9)41?xVV8Z8PZm22Wbr6`2Hhe+ zc>1-kEzQ31OcE_@ED%&WAaD*lr>zuhpT6&5098$am@Y@C<`&9imRz7FYc4G3j5OGU zG|;+EP@+#ZA;^;+a21B^R=8`o&l3;wWkj4_;mKM9xbSY4Jyj*6xMlA2`TQ^onlp+9@<aQ;BvS3|0go1FxkveAt8b1q z=8lVcF58MS=~*HfS}Gd49mn|GRSwz$E&!i)qlM2tQKZA@MrsKF+n=_PVJ4_RE@Is6{_Dwf=b%EZ~WXh1(ECVq!I^^l@IvPKXR1cj** zDD0hE^8HW z=`&~2iFXbIt!+9}zOc_q&yRQr!OG^oM;k>%mohiJWG)dM2@b!%Xa22^lgVpP?^{fV zG$|B}FzM6i6*XR8RlQ~+ZitfEDvJ%1hpppsR*$y5$E}R}G$tHtugax;BO5V%7wd)i`7n)N3kdqqnmlhV_{rYqDwNDebZZRF}IUNQ^CF8!PUevhg~gO zJX89w$853|UCZ?}%l78aZTi8WudJW$?ukXIjByv`CnfzgE zy}I;;z4GPRztr;~lM_u3Z}CI?jVL>QAU6@DArz*^LcG9 zEB^yK(;JI(3LFOXVXCWNmD~lHh#U>%uaDqHphVE{1sxmm{U(V?^QRf6V%7T@X|pCd z01}mOR&_9LS;8^=P#>Nd=TKc2^jdLzE|G{?C-)w%~ZjDLnX>KxM;# z4<})UJ=;E@c&t0roHsdRYw=QEFV(YkDaABZrD{t^mkuyx3e$ZCRMrOfnKX<&-Cm%3 z?A25884vtDHT&e=fy8yZ>T1ftbP}jS8m7Dj^TT6^lm1+U3x0Hr$hWbmy8w#d=C?nV zAYNo{@kb)@g(!AqlV+j3bW$1g+|C47MBodEKE)~i%C>0BajO7CMX;u)88fa7xq^}N z2+7CaplixAL92jmT$2_6#Y2Zsx>`qtXk0@DwwrnxSP_PiT|CZ}i8N@eZk)m|?OPs6^Ty?}e{7!e$tk z5PmEl!j1eG_FMv?u+K+tE;q(Nd3+$X6+! zf?uB09PRB*N+`_8Q;dwzEFJ!ps*nG$PXQlOyK|`E&Is&VT6|VkqA><)P@CQafr*CW zlFXtbD4+(NYUTvo|1;U}$ZM9l!2J+bvR?3K65+4G-@Epv?z$FHf~UHY7NMkTENEvA zUc2^?f zf_F==L5c)w+-97&NvCezspL}W1r)~!qzVQ8hLA<&tEZ_I_^Q=oE1PULKQIui;< zC{EBCUWG-imT+makZ%9;x6N^vDpW2t)mD#A8(egrlOFg8twuWYQEUC|`AwfqV(53h zJAQUy8Jz>y_uq2L4TxVHh%1f?G&jqY9^NF)(--ot2d(IksBC7HjT>!@}jd+azKXZ&IyjYdiX<6Aq1^Z zV}O~GLhB_5-s~uucRP!O*Zn9FJl*E4xG&|4BvM5Wj*nvI>>K(H(ab72TLv7t+|7P6>!FqM z&$~|L_TWPuIkWv%GGI*O(Pimx*B<7if}rB!tV zDqTb=$oJ%dXLs{R5)5S72t*AR%=qrC&NGJyZww`jwBhZI&(zF+r|Zn{ox1`K_-I$p z(fcgRfJQ$6K|sF0hkqw&v=^5*(RmU1jb>tk?|8#u0!~jeeq+)Au*3mWMj>+Tfd#^T ze%9>o9MC`X({A}M6%5Cg7LNEk`=SIRW2Ezi1LLhib-M)_TAQrTSP`3glKWRn19^}1 z{sZhOlK=z~e4o#}hH*Jnvk4%82h*?Hz3^^X3oCmHa|&YA5_FNVva&ScvNLqkRP&Nw zpiUhrOpi#8lS+yx$x%^^Q%F*ZPL0X!Pb^Oop!rNvj!;cYj*Cm|4wFcS3)L&*|GF6y zkV+vx_t(|-2Ng#OfPlZ#a)QOh)qIuXZ(vcSDV_lWu+Q-eUIKf3c+j&?vGxLBg#$wp zEbf1GxW78s-yhNIuF%$#bFXDordSsEg8)2m;dPq+vTXfu0rUt$SHDrQyYLZz$=r!X znb%Rz1)(h1gvbB75}41xkmVd*WBZmljob$+xd0=;JXBC?DVa6CHmzUSbgm_gp&gAS zQBoBRxFLR1o>Zv3B*x%$Ma*rkKW{dMAsPwNGLs0sO+DfFj3p^XGv=>DtfWT6B25QeXADMC8ZihKa#~(Xqb~sPSoM(k_JsRb%ESxg|D#uy2?)ajXA2mt_k@yU-69H+#Md zntT6U0ge`6@q7P^AMZy+PQHfxt0F1>_lgW}H8SR4T0mjuqjb7Jiu|64dY*R!#pgaV z4)tFZ_fMMFe`=4L2oK-d^rQ9$?*hyReuv{NkxDXtTI1I*fXiUV&S}9g)%nRI5h+mr?BX0Fu@B^o;2J~6Y#XgJs?n4R|Q(gV_`HYgbUW)l=6XX zGOM(4y(N?Ke}`g`NnF({mX0piN$J|_yVMU#4MM7IoBj+SSZ9zT ztz%e?iQIJxPX6MlsREo85^Q6MXG1|*8Vw(og5XXN#J0sqgyoc2eKHPmMu7EYx4_hG zI=lq28#>qzvFsAV#9ZnbMCCgT;UY>~KPY3z2w(EkrC5qRgRcJkugu7Ba9YS<8L#`D zOB?MH;4J zF5s@tZg8lvOCXj%evH4H#39ZSsf4={=I3G)3ByS4!us;0N%t-4SL}%6qa2OK?hvk% z_m?hqnLBlicUUxF&z2M5Ac4=MAiw1G2027p_7V!Fy6(nPF>(jeI@7uGr>1eH#;X7> zHVE1mz(H1@$T~^AKq4YZ1s|Uo6V(ypDC%Xc5ASJ(UR(yvz$UjVT;2DE%0yG7aJqxq zg&H8G4eNda%ITK1K~g8CCx}3#YmyNVVjyFpQ&A$of_{9!CnB#t^Vwzpv1NbRH<^Eo zJ$|K&1DoOE!9vwbqIB96t0|+l5f}g}9W~()$`9_7=&xkg|1(jJ{~MwymLF6P4ic+E zKBOhqdw5Bh z`-_NM2!|gT`MRJ3MpdClPBHw1+_I$Qq-6*A5Ta>tTI9Lh-jDvmdj;Bh1>ef1!O2?aSxbN1>e`NOy?@?$yN_J?>IRX6 zV1%c?jt(h+R0<)pY0!XoEP4!f5GTdyL)*xH@w{tfbY?THh-VoYF}w$Hj(@haGi*>{ zxVZGA&95MSImvQCN9p2T(N*_lQnSg;BMt%VYx6dBKy&)^*JBCbov+DX)Lpm<8`pOb5 z$GiG3)4EQbIcA>vMMfLt)#93o&~vc$e8$~qZ4-sL1Lq=SZr z)pmWF^xR=i_dv!v86JjJQRn#*9w^#wrQ^f-nH-mz_-LpTn-7<_6+=tjN-8MUi60lI6hfl^ z%bBqQ0s^pLNVGPi{M!wpEvFWXo~4!S8nf8GrqS2eCYT?_y%b{|eZaWAKU(%Vh=0sNtzuqgb~ zMwWFG|M*2|41C2IP!CWtfBx`X6Y%HPK&c?KWERTSRW<{E_)53{z}7dVog-ks&%3lI znsUtr&_BjL8%&Xz@X95>A!TjW8Vy=n@9Ob@s4vLK>}0HU0KkDC)c*g!K(w@CQZh^b z9}sAvO=qdMSX8pC7GOPigD*kRX~q6=~P2 zD?le8>G(azVIFUfVVWghlefp2sUvU)*PBsPfpxd_`v#=8Te{#7#1HJF%MUjNnG1k_ zur2e+Hq}xQ$3H31C2kyVCKV%@B^;ocKiu&4w!3ChALi_|KE`@~Fu;!>#F~GJG4Qt- zf}70#tl(uH$p*f>Epmoo&(MfhHdrVpe~Zxw3N7=9@7-YmfuuPzHgEIL^^?2|?W-2U zdil%V8}`@mENh?Xj-dq#1>6%hwo}wVSZ)Z8Q`_6M$*_P0k{v$}5LnmYs03yYFN+2X z&biy|RJ!I}>BzQhkc5U(_+O>iMy&6K_&;~YL(qtyWT{GMMFL|_Q+s;>LkCLT zMl%?+GBVWPDbi2UN!p4e|0ZrHd3=x>Sk&GIkXxo3|J2t1jUIX`it$mgVENO*5Yj)y z&J*0*j1?uIe@X1kXQ(7)L};?o@p9C&vv8otUL%n3!P$@u7n_@>qqZF?MkXRd*R>b? z`xeJYXh2o6HK)15U+VV}>%R@PQvpywK~-!%+xFvKlzAY^z7drOEvXDG0AB`#{1}}2 zqq=6AlFb7k8U2!`TUvv_(oT zd}pN6L;6uZJRS~KPETvCf$QL9>^N)DH#yq}(fi zxFqTr7X5_8RVZk@A4%)+bvD|kf6+7&Vc-kO&a8GS!P=vC`DNEv7fDV<_gsR&`XIn9cZ4PYvbUZFQ>gvA6`#V187wUybppjD#BA5fM&GK(Lj1w-@`PF zSZSkvB4ltI5`v2=UyJO#0ZRi`}z@%!qQ)j8snWG)byCGa0(n}b2P zh=Yhhd_W4CkdWzK3xZE@!eRu{*Wj#0E@{gejhb*cI6#UR%68j_vr()l>6l56&~v70 zl_(hXi>Q4>{1%+C`+gZS7AA6DD8+){N9gE#cPA2tori=IzNj@iIQct65GOzMl_)+tqh?CodwUF;*AfMkZ|0r8%=|{ybD@$d|1Wi&!g+`=ZPJ zb}Lhy@CzbFCCO3dR5C*;r#?-%R=ZT+>Z;VZwU(4Fz3k&Eh*gRPt|HZ5!MGaIeXsXc zHhOu8So_5hBJ}|{Gg^fTnCogfm;<_5Ye_9yxSihfRlZs+*xQj7cMH%Yf zU8MsrmhvuWa#&8j^y2P9jjd#OwT6B~v&G8Nu?zGF++@850pvD5zR?HJYgd$i3g~2zV$&C5U47O^FcRae{ zQmtO*4`lyz!iUGwgLt(GE{8z73{o_xoTo#&L=ZEF)eNeRYt@0)Ej2(D3_`0K{Ko9R zVWxMy9uk15h$%s4ns++k2cXMt(C0U=_dWFIF%n(lKz*naMC8Q%2`bU82+dt#r-@o7 z+g%!kPzE}vcG}qABQKFy4H*#O9;pB+?XUZdIpOFu{E;7&gkvJqM~EDm;>53J?WaC$ zB3-YJR(ChK$*gK3s^Xs;UA!7>$-|Bfol@^IxfWEkL74*6l=mtBocK_zh%M#2dzDZh zxZ-G1!pzuUU|spnZe#G_MiA1XP?kM^ebuWYD4ZL*wKn5f9zPD^ZY>ob_n>bIN>ODe%@ zss-&kJwVC0qLKf=kzJf4(+^(10~~lwZtK3mZ;mQrldMioD%SCK4OKBuSDu)U@~r1! z-4jJ9YtY9()OZ*yg{%}ef`LsLBxegs)xLSITXaA@zB?=L8*AqrjN_|x*ATm-hA1he zVLMqLk78k3Bz(n{X^|GJfYQL^QXIohAXO0|5RdoJlKCkWEOWKC`^Xa)_JY+M6MeFI2vrolMt1kRbONzI<1$mA`aA`4>g}^>a}{lU&%g@7nxveO8A`Sg7nin=h`3b zfmqWi2OV82;L#+-6h=g|UQq}o(PQomsCbG1u~l(lpPcI9=TH{I|1h<&b1jumU7d##IaL_=s?A(XsR zM+D}AP;OHv!=W#FTKhAse755G8A&jYTb8zbx6B|tLJAS85z{XsVm{y#wT#|^6fj7E z7hokTDW!_7XH&VJHnC@{tk1M0c_x z2xXsFNidF^$Q|KYUAuE?CQK*QcckKz{W|c7MoQ`nar#0XRTWJVljQBVfTl^=foqnO z$Ng)u?X~5qF|ds-<-jg{wnOMaWz7tuq!o|-za&9wkaWYKWfU|z&Y2V8o0ucYHd$9= zh*lUKKP*Anfi#Igxa4jmGvgjHdqAi(?a@^~$!hKd#S|oOL{C+c)Li zhm0kQtWlc}Mp+@fIOl8${v1Mk0B%98i%k@y=icQW+XK{dmojh+6vpM2^_%vWwBDe- z2rG%@U*Q5e<}_;~J!&Hm!0-y3=maHz&@Ibz!Z+Jiz{vZrQA^-2uSMlQTp0^{2QLW= z4FhwT@PO(71%c>@=_Dt0hTuW;>Ey9 z8j`tn_L)p;78pPim=&&1&X6s{2IY<|HIv8_G{ovibn zzw?LBIO7^^D{wUg;()zUWdZ`A1^;4X8vyrL!AE1z6~6qth=u4&^bt@1#b0G%wgSh0 zm1vn{{TO3*ZiH%NfCjkvKvEroex|DHoO#T36+mxPked3xz{nCUK3dX%-@@yoh2`r5 zs{g}X<&q=iAz`7ZXD&6mm0so)0dyo{gX{n~eK`6*Kkif`}1F~wQ?AGj2oqFsw zAr&A30D0f^@8uNof2NhFB&0us?w|kXr4#}o>j+5&2gbxZ#`Ct1ILm1q3_o+?hDou_ zK_YQ49w+~=*gH>IPNC@U@LNwFVLPKTMFAT~c7}869LV;Ar-7$%djaf^K+Z*7XQruO zQ7Jkgf$+l@Uk{Io0VKvjhIa{my5fHw4C5B<4H)wqvCm)!(YT8<>1$bl8}!S66_fSdE10SlZ@1qt(VK(@@19Y)n z>#w8pNs8};;kY| zA?WPWbzeezfi3*$#kM72wLtz{mS-f2Y!6_yIp!1LqZa7AK5 zvlWSY2OlAW@uy{Sr~{R4LiYUHKREc+i$R3o1P682hzX?T%b#;UtYgYKBw_+tR{WEa znCARQ%^)-Mb9uW2m=gcndq)FOgDh%>6$Gbfw7u$bzFh?Wt7*hzYUmW$E@xUzFf9n= zvXv3FGUJ83=*B5%5UBh9R$AF}LT0R}gtEvAA@1&X*;kN+E%u8`;Li<- z8-wIUK!Iw45tssCPcRFE-G@Np0~1`_i!+;t@dSo}l)bg6!-%C_YO zJ%UfndxRu-^#!pr(ogavE~nrDwa)$)9&F+EMT3}gF^7ivBj2lRrP7Dh1q+Dy%bwqt zqplO*Ar$In$lub=B%mUlI8u#_N2|Y6A=LV;QmK-|3aHlbEoiI(~M1ZY?R_!g3kh6rq$3@0JBk$HJj zAmj`!?apms%`1KGj$H^q!%{F&Q(T&hVlu66u;Vr6@-`&@xt5v^rLMat8+N^ zq71tLzu?=zcL;Ic8sLbncz9N&Rzm!8lIYM4z6LtE#2Dl7N=MuA4rLuF-T~N0;-4MJ z#(}@eD!lO&Ci8HkN9w*ts|A9*En@9ah}zeQ zQo}~*R%>d&7ZZVae;q_ipP%~`mEx@}&(!nQ%t-uOgk9b4@q06r1U4rpEgT)_0+v(s zJi@u^{O%@QUOw4VnK_$U+YEAEGLo?l^uC9!UsvNFD*Q<=9M}|M+si!rGs$;Kk1hpA zc*QOAoXI%#ooCD^dRedB9-0B|Zf>|(0}}3u*|@?$?>4vQM`rwhJXFJ&Qg_uPee(KT zCIe?&pDmpMEUrLkuI0OJO%$*FP9Dj)#m3Fw$<5ZY&nbGrASu?YYk8^p8@=W{W0 z@^c+n`0*_w+$N7)dJU;JSdZp=&`uFN9>Z&=w-8^d2fFm})O5BvCJA4^TJ?ydq1H;d zCk2;*QKbk&TVfEbg|l@v^>0}9`Tnozb?{MH^KZ3KjYG!FXhPc-c|+iAc+kdYE~f_v z;(eBz{5^$gOYuaZAbN+f2eNm|mHZ}KX`_t7pyjmCiu;aO#xN~}&o^rgX@)*wB09eP z1!`l=+i|__1{xZrq7a=j?|*(kcRX1-ok041`xt-vehhHwe;*phy3ZPab{{5z8pjM5 zhSC5F;p7__%ZP03lj~Q>?}HFS`D^|QBzWSVcs7C=wW6KXgd#v)eUhc!e;x>+p+UjXYv`6$ ztu$`)(bc&Vbs6k{L=!gKx|f|J(ZpndfSXQe{P-o4q=g8y6C^tN-nVuM(-Zb3HSmmP zh@MThsI^c~p!7U`x23$6dMk8vP$O#0sS2b>YudZnS}9+@I6M;cOZ>K+{pvJC>Pdr} zF6@-xC*7&u);QAdB;Vz8GCQn9X-=K=tt6js?;ih>dXq&3x;4P~h>xwt#dbwYyM6kY(TS5JGpj_L6nMtUls0?o^wTafi|rt_z_-f=B~BPB8tcoaC;+8ytEaq^LC* z5E6C7qQfmNIl@z-K?^W+S6B4X)&xP0jFYW?Xv8nZPqTcIO1LMyFJ+@}Wb@nj?yb7L zx-=)N@v_sD-wBlT=I4BvW=KbU@2*n*Oqe$WOg65A?=hJEB#RZvh_G{ML?f_b>W|L1zsar7P!cQcI)OK zddN`UoLv>H`eY0l-oBW2rRonuW)pO9JW_u=_oFEqmgal3$9cMY)^%IDjNRc&xe8Xp zs$HpV_$^Opxi53crXfRgY|x}UIuwWGE}O~jCWjyjRM@>?u`Hl1PfJy^1~15{#S_7< zn3#*+8_(jDc}6Af9_+%iYQi37d*B;gM$qe!#6vO6&v)`8T_(AKr4yJy=8s`zwlUHZ zh)B}jMETSRO@u_AR;GI3`)k4?%0GJ+WV~s>TE`)yq^bErj*X;A$!vmv2gg~YLZWOE zR~Tqo!6iEXzR5M|7`>R>?8MRD;jf)r14)(T6h>(1=)|O@7G|h_X}+Ze@RA)VYB8ya zrmRjs_3Tg1XV6Bh!uf-%sr5uubs0Xb`xKHm#rzTxAgd`O&1Dh(GXDoCxsc0)$|`k$ z+ya;D1yqpvC)2m7|H-t@e=;37jTki$^#cOvlS{UX`(_k{TLqMx1(b=~NClM7OHTjl za47mvON%Ise|I*PrU=Oh#@p{KEdCbki4h9Ojn!nedM<{{8L!#uo(+VPkYUrd>cAYR z78WRdU!+=$txmciUk`h>P)_3B!gM^6yrEVA!TH3ZYX?t-A35yJ!kj;blDmdg7Oh-Eh zO27W0(Bn40jJ^JhJ+@j?uBou0+^!sXD+lmfDnNNM$=N<^z=u1yG0Yt-s-PPw$uG&z zTgoin+g3!*ME6x);m>T%vd0$fmgY%7L3Hi}t zSJFqACQLd?FS|cEMI{g5q`@t)zM(V0Hp!baQbfZm+aPUia2rTVRnq|gxY9(ZPJsQW zKR3@f#(M@b5fyG2p^uQFedyNgc$btjpAGy1rO3+o(Ug2tO(q!w8v_vFZVfuz!vC+M z8*AenyW=BllIcL0ETBjA_-@^F(NZj3_cgaMG(JLUb1l4LI5 ziWVAnFTf08GGX1auQK0r#rMR9_L%an&4jP)%(!swn57ELVpY=T0#+#ks}i?@;4b*D zY#=P@O}@w@MMnLMJoalEJCia|z9+<6xGS%@^06u><7brsx_uk`E>U^I!Anac{1CL+ ztgNIOk)J+0Y|IoDFnU|?TJ6SrR9wZYk}4^AUaq@h24KV2T852Q z48UFigFeqs)-N2k$+j~u-*^(_IDZ@J1v2U^`E>>4r{k7oX{0{GxJ#HBBVZxkur(6- zB`Pr!bC|;sIWh7k@*~CsRK`M4T>_Q8eGIdi6YR)K*6WPdzOU91fhFP)U11Gt%HyLgx`TeQshf0z0gr5|V+ zXM^IMTp%R~lo6T|n+gbOh>bl**1yQcbk=xIEqqw(hnrjajtrR^QMP#+DB*x0fokjDWn3&o^m}1_3`qT zzedemu%k&EcT2|)**h?2N?aQ?{w$_k2AmiaTO+m`L}$A^airLwyh^?Rn(qhNKIU-s#v} zo}K>H7yBhZu!E@7ue?fcJShS_3PoZxgRG9?>BmnmM#5c<;1Ff31nQKzh(m(~=pVK< zim4H9<2yK{@cY+&&R?y1eU&sgV~jj#z{VL~SId~1~%bqk(2 zoS9#81GSuXtm$>xsZgUeJeQMEstdX%N3;#0(HvF~jL&%RCXgTyjObM_7J@1x;|;2b*P#S2n|QR9Aa3qe`sXt;SXy^XVzv0RITVfK~qGt%yGztqgN5c z;lomPc~zW~H42u;+EMitEL?W!wUa|*=qQN>S;rL8jR5u7^ga_O;UAw{GdG=|I|1^+ zZ6<5utjrk+;IM}!3M#ik7bh~mRV=0}Z{g0Y?Q;S*{flt7hLKdspLNJ|nGOPcE!a{_ zf+p~i&hyq;vG52hzPIj|aD>)b>b9NvNz-5?wf3Cs(zCBB@1#wB=Lx=bl!%gvza>i0TZnC_bwUslyU;k*eJgIN1^}Blq!OBp7 ziEaP(*TS0_=Q9vYCMMDCc3`vYV*w46mOOPwc%gktr5~a87HLPA=bw!{QVM9={t+egKGg}O+QeNVI+ch-RpXp#38=#v_AV-`Cclh;CB zg_E&H?rC4#Am4#f-fy_;;oY(nXQU=2#ibR)W+|j2YR9G-Bw}WF6uv|l9TgWq4G0r? zc}HdKzX^DIp(G{E2?YuUFn@R!%&5#Len|n`X-xvl1>q%w{q!E|dR)(7qOYeXI1H#qz{NaZob^hQH^>rs^x6X@3!io13%o zrS~XX7T!`sg;yq?V%`sxI@PQaWmtjz@UNyWemBI5t2HlIysfPm{J1=>2{Sax;V`CL zZqZtc&+Pm)p!rHRFJebgJMDP-bNQr z9(|YQZVFJ5ef;UJK_ger11tIsr$k9`fmt2YvfU0%uXoJt}G`b?oo}T-@b9-TYeWimWsA=tqvNaX1=A07gWDR?5F?NgwG*gZFv5!$;yYV+lud)saE-l%5Vh|4UF261@ciZXNmg3@&JkhvH< zRYn=HU{5YNgT{07I8ru>`dl1ovsmP>(T<|s80XJOoQ?QWA5)vP zNfpSMgha||<#13uq?Qq7w>YuVUR!(#9mPwNt7^$}9C`Q(#?|fzT3hy9p=bj&Qf6&L zQJF8&4J>NuD&gRJQxc&4^S7RB?;?Ss`GhG>k|~0ixiF1VKR$(}7rI1`E2h4!GNh=y z?0~#kNj&U;^)(Rv1CkyMj*)uML*pJ!Eu7MNV7kkyI5;fLLtpkC|H56t_S$?k+1Zdv z3>Vy5v8Up4X}P^S;e>rbO6f%Wb}CTtGPZwbV?MazwU!pX#Fe`-I|&y-pn!eM;e2_> zNLA2}F-q;TfcBXP)v`sGDTy(*%1LRqFRCIWR3~EGc1z=Ks&~D{^V_Y;!h*bF-1Jb> zsb|73hUd^@L)wLVkp7Av!O3_}fN?;ZyoSz4cq8EDAY)=L;$@;EZXvH@AmjBVl~InJ zi4HY#N(eD@+&QWytDhv?og!SA0xI#5{zNv#@F@K?*8bSYmQ+7K>-Fxbsp|;|EKCRA z^+v!15{&lnBMzBj2J@zoQbhfT>;MqNOi)$+xCO4n!6WhTLxap%9DH7K8LK;JBt*@QaIDzC!3BIE-bswEC)J{|8#J=FdA4+Q zW=BVlLuUu=Z?)dtBEG8qcBQlF|Qp^U1sdH zZMg#Bg24RSu9;)W4=lu2KB+9fbnyUnN-spaKFdO$))?6Ai?9~~dB=*%W`=fAg{k2B zl0jHkOI}q9Ik;m$gG9`?1W|N?U!*-)$p`U@wBof=@o@HRA?}Cb9wx|X%7N6;Unk1} z^Bahizndwc=JvYKrpnu@V6W7U3JIUZJRFuVMV9?Toyr<8Wv0JsZ_zXxuslkpXha|- zQ>2|Nmjq~_*d{?k3P{pDX9!80Amxx=?MHY>L2!rF%Fm!62wdi_=xkv zqZ6i#!-W%3(@97#jlty;)iJ8cY>krAsRxW0+T+AcZgfepQ*M%8o$`$E9ffUX4&0}{ zBSA4}WsP&B4`aRzW0rGpyzpHQ1xR&Ag`*FtMc(jN_=(sb8j%8}i+GG{0cLthejfmN zxMh7Cy$LZ6q+1XoVwhQs2>9G-M@tKkTK{5s0_2DJS^mARVV9N2Roq0!SlA{;$AQ29 z06Z!oN(U^L}RyDqHz3xhfncP9xrN4J4~j2dLXb*q8pyyd%6>ReV$$ek6$UE zuqYSSf#^;UKvQ)uj)48qf7J#dx`Stkhd07Ryf^In2Y+DDTYkc#ydqjmDBE_T8HH09q|n(>=S+)@ zQ#IHRMCg}y(q6Ipy&8gz>4N8^38d% zv-qsVOy;42$|V&d)q-kSBHy~~$biHsp+*Cq*zadn{4Q8u09Jo<5oPF)yt1G= z(BDJ=$>uA<4; z=MljcTRWUj1vyp@2F)tSZ2=KeUn%{`=SxADytok`8fSkixp!T%*5nW=A)u5C0JP?b?PS~_LXc(H#k!kANa9ztEpA)$EAW>`rPk#^Mio>@mvEuYgZ z#tarc5LDXCfG@j> zQT-nY<|iSUNiIUUE{4m1~NUOW&^TF}g>CUI0)1!sYgg&lbFGm*!JgBo8 zi!wtaUO3SZD@U3J2g85OWtU%0@n&A540oeSvF>)HghOPVJ#6rjTS++gX$*nP1?W z6F@z~wx`upMGq%!tw!;tLiJnQ)q`j~*1dhaO-y|LR!Pgnq`zHr0Cs1AbZA^hLOg)l zHinhrjYC>AWUN?An4;Xo%OH>`^`&5T5e$3K0?Mz+X+r+Emw%CmogJSGWlT3bNAcM& zf6W@!vv{#slFNoAcuDIa#b27Q=cJlSN7UVp$&%el=#vx?oSW}7z=L2 z4TB+h5beY?w+AVqQoN%`VK0w|BP(1y8lG%i-&Zh67}}Oq{ed{+o0>byZW3n5^b1}5 zBZYafCHB<5z}*R|hp%KxI;Tb7QJ`Dfb-;q%bdq2(P$UBg9u~MOvUgsdajC+MLy8HG ztx%o8c&<-l>{)W8H0kV%vfaJ8;==<-s2;uDBldx4rSizD-9h^r3`Z%FShYBf{jE6& znte_ih0!ycp7yn}++DKQ`8@>w5^Plr_hoIbS?jWv zwHkwv)Ihdi#r6}=H%XlC*idc%v4{KTXaEY9mcD7BFmZp@l)>$HDKfRDwu$jHS6Lfnq_1;-p2R#8c_d)(k|adc41X> z!yGzrkjV(3Rp)NG$reom1ss~i)Hp=jL@YvypL8|Kqi)C^#n#mbe$jOZ5cNo*W@!`| zE=COp%lUmN0a}o(iBQ?9hEzq$o~_FW8(E_R;9;fUHXBGn45P7lKAPhw8B)UI1NJh% z!w6M`rN~LQ;7q1~Oc zveeCU)$*8LB-ZO5u5=73=?Lka7~*>x5rruD5|JSGOrcZi?`y{@P`admh~=bf^O{@V zaf7yVCF8q%$Y}P2L|StM;C)cd>y9`BE*x>Ft`7{ftx=wby}cD7VP$+a(pr zF&_6+*(~0WE46!X*9I}Ngg%=Rqf;R?TJ_5P66N2A&u2=ELEP1gGCQPjjd5Ahd#YlIah{ znSy{%b}d7iIZhP`=`629O2NK2{$z{ynKc9tld}PM?LYd&WUdm zsY{XH&NHOuZWXU73|%{yi5!;WR~hf@J}%xwXkk}|CtARORe#7`H+8y!nc%t$KHh2ek9=~*GDu(^#U{w z{sdfqmBI|4e7&d(O%`c%HHBgylP=?#(i-ZSb1{qIjgU)IH^;Y2 z&V7aWE%80423%(*0F^1CM|I70C(f)BZU2MXN8~O_oC-*?Uwu+PjY>qpymDc<*__ z4rJ>x8gHuV_CeZRr9=7X%Q5&N7stz^_K$-Vz9qqIuSKVshrc{6>;^zqe8piY=R_ws zzLM-r)z^aEGDwlK7u>%OSU#2OKMD@A@j5nOk zcg{30H}CiIDO-*yZ{eLuqYVNpQ?!%x$q zFc_LD&tq*@74^CmN0eS3|Dj;Y=9{=@WFS5{CB8XDMm5T{rre()?|37)wlnRDN=t9E zRne3K2~grizc__U$NKBPK9A8zpH263&8D-0Usu*QkOTS;BoK*A zWWbuoyE*qVWh2ZQWR6leJD)RA$dDy9Ok_@tc-A_`zZp#i<-hDtA~Q)c`(^DR1&^mV zkdawVu+>QY?YcI;WaZa@Q}u5PCr@ zO%=p<=O3|7h;LyoPNHVFaL`e2cRto5UuNbGV`XLP2Ly^tC5VQG%j*}97#+-q;Fpo;d^?f}zb*rUY1pq)mzrRs$UUC&B1Bo-`aXE%hh3S1`#Y9 zq@>F2r&C#i)fE=$l=aq=DVTFq_j8iB?UuASyrUlS7pFft#SY|-;C8$oA@w`*AO0ZN znTaU@pU5=Ju@(PfM@i~CZo=sA^nOdA-a_QQ=ntz3mNuJaC14tUy?)=ZcqhMnh}Gj^ znEj1&J;}g?GKyJ`nhQS^6Po_(j~rbMyo|xk0S(*|zy8S|b{`rP za$}q6z5{~xen$)~x}VH_dlq|)KFJ#kIZ)Frl$Vr$jF$jDVmXMZw1;T?yZ29g;hXz^ zaBwhPT<~{C>g5Q)i`It9F_XskGXvNB(l6?yU;?upVZN3*3i6m&Dg9Ndg9T5pL)_2eqxzlh z13?f4H}ZR)TO0woB?(WgVDZ}cA%YmdwIlma z^ch30<+xsW)`%|Hxe5$Gy<^;n(+!bBsq_@j&~JeQCF(Zyc#VbqWI_4A8Ex9$Lj!Cx z<*8qR8HPG0_r-!--LireXDyNC5l9Ij&)17sHeU-`(m@$I&z8vpzy;@vqD%GiHOBbW zSWiZ*)-FRfTUDq@T;XxOz~i9;z-1AGvhLx3EeDeEU;RPt@upL6HLse)-SXU?@?yH3 z_A>A3ynQB4+3WD023lLnIRQD?X|2CcX$3Mp$sm-ixTNg*abxLbd zTkY9uVf&&YRa&epvP@>??zkn&3fp_qr2E0nWtBcH3|zsAFx@MbMZZ=Zo9 zOHWk@(^#tNj(iQ4V1=o3qPQca+RKd-lRp-J9_8Xez5MO5eaZ3Qzs@A(-Sd-+t+E5S zExQwm1j@60gk*UP$@nE6Bx^?Vq!DTmk>Tr+Eo^vGjVU4FOuN*(%BavBf&+1zXwfb( z_YUpC5r6l6nL5!RaL381k5dihV2ZUeg4==re1H}SUm63t+!qT;pR|==I3ERxiCrgJ z8>o{9EEh*AHnK)6#@uuQm2hAl6LavVrY0t%`ac^FHP-DAs}8b1oEz-=1E$D|r{(>u z-FA+kXH*ZJ-v@goG^6G4j^=ZB(>Gxy_{o05+Y$M>T$%(beBS*gZHujpf*PIaHbP7x zj>933tn*`Uik(#)3zSeLqHr;Y+yrM04h3>oW@Of_>}@2&J&_LU1)9?TG6p`sW|f}; zdME@{6HN@F{^Sc}IkXRen(xP>N!B`~P{R$+O!s4!=WM2|?kmCXoor}H=>-yVo7Pk2 z(uxWG1snMS^Bcb^#Mn-ig(Xf>Ta&R@@Y@bJJa{f__y-_z$sw89ayi_zUeaX@bS;{= z!>o#|GKtCUN`1=AZp}uinqsZfXPTV&cssg!=*IYQ{#lFftiit*uE$~OagOW_#9cx! zRHO-`#Rxq*IAW@b&=!Us$#EEy;H6f^e^YvW6WUqH z$81B)4w(O0_QWfc5Gg(%;pJo!B{#BJcz*8@oo*dbN|_~Ox|2wbNeXLqdvY>6PxZ^x z35}Kthex62NAZ-cAyBbaSx>!ARdP#xz9eRVfjvc0FnZ@mi@e7|--fY!=cEnOu^-}T zN6ZE^vqbV~G!0M}seee|`Y9_B?5OFzj*)R;*ZqqOYCIK^dc9WXpgd=@SIqa>K0p*Hs?Q0Ig|FRog*9|tYMR$t!9soXQ|_gmJ3ZCma3ms{zJ zE!>t(vTQYRbECtdBGn%lXCaF`(GtB8A~r#w-c#a~m!skogiYz7gO=6sLPAx9LlG8V zEV(Tdn`o=kiGb3K5i!ZZ4<{yW(g8Pz|(?J;*WMB_@s8f@WW18k9JZiDmRYo zj6n-V6?nh5h4Z5q4|X8mA=*t?2Gb7Gsuo4qou>FBB?VoR?FL)(ME9grwptQ(gcsHYoa%NOQAh0wo1)=P3cy`}et4t#xOeRu%S zGT4IgMCk_6jnMV0USmEPzm`UM5mREBY}cQ?HNWU$z(L|h%MR{`KdW}uN+eylx@sgQ zId>s`$EGbtBH=wbc820n=K*R*}e082ku%pgg*n1{7idi=)&h3 z2nnre?;v7fb9xZ0P+-6b^`9GqQQJAL!NN%}6W`Q`+4Zufm8nzJhuheZBO?_fC73_c zfBkceh#7@U(vC{HhnSFOEtbmqhLk6NTKtEXlocnGPd*P%CbZk5gOm$uedZ4m7D&J| z8QJ+6NEG`g3oSaXfpn=D=%xnt_7?KtBH|(@^(8Fmrk^QS_KYBHipNuhhRA-~7fWvq zku`CI|7Kn>Qbp_>*H%ab&@&)^IRJ_NOl4^Ju;esol`>wbPJ3%coLo{|jCMj!u1+PL zGg2{Byo-Li4{~I~Gpa$xxF)~onXl3RpwU-e6Er6YL5*kuU1t~fE zeB{~Nk#YsJWLz~!5K!li7_bB6C-wR5W>xnt^rI0F?%^~k7e^L=g&WM!R_(+0Cwh)? z9Jm>Wi+afHwX>@O065~lARU7^d=|B9TLm`XltQT>ewhPLSp3Kv9aEShIVukcAobC6T86lvQ^xLf=T5 zQbKwv=X~fkVP3D1;EIhjy-y{X?(ElzFWtGaW z8B2=wzTQ5;fzN?MY<1dkRdA&C2ATIpdnCXvL|; zmlhB94yZqxh-O03?&k3^93B$Nx%p^sZ%RsWZj3sHZk${~T5A3vgL;yNVJ&N8tB8w; ziA3QB#RiiUf=kkRugQ1Gu%kz4ihHaRjyY1G59UKm_)* z0|QnPMI z|4-9=nI!&egSMe_Wo0k+kMP~{Q@&B4B~sI(5-GG}R1=_f^BW@_Yg8j91%(A9Nk@sQ zxu}}Wu1vN}5Wr6mQ<6(0f2a?`QS128^?^&qZ`1!s^d-u!QziNth{L()pe z6sw#;ivFf&&Q`kp1CFj6sdV$iE4y+Fe;lR14G^4DSYmIlY}aQ>9I821nYb0y{Dcgx zL`C;zwyPr=queT*7cjt(g!=4HNPpB%wb?9fCWskl|J>D8Nz6n>vXl`S+4#4@3xZJR z=~c>UDI{gd7s6F%#mzT?NyTdg`kqbc-$fyDhEi@fv;7nE7fEs`_3lue> z!hDPrmhJ405{Y~MB_C=wN=BAqR`z!`)t`ROHasI!vtwm#&$N?Y|LXc{`58G|j?zyvAFOXYwGpw|VFyAKrcd3wju^R zssw(piyrwo<6_~lY&S?TGyVEHEtSa8Zp0>wl%)ToYGinbeJ$eK3gbUp*vJ~$iFi18 z+1ME9NP2|$sW{k%Ga?fck<~k>nVNBk!3(O}S?P{+rqyQ4Yrzyo%JYila^lqr$F z5^Cd8b!*}hG~zN+6{_NL!IQ*k#>HrW#YxeMDN#yO$dk~>lMV)*&{7Z3{T7SSP!G}l zG2EX?Jmkc^>9f;I^77UG87lHhO7eCOuC9>rkPc8!EA%X(RR+`(;?=7xQ?)ddk}_10 za#PY1D=fhoIe2*KaIG3h<;a96ggQT(mR{iZLF*3*ficp*IxD4=&lpkjTH;E){f!pS z+H`7gR2rFWYC|TMu7cZ*did(N=P;af4zUgWb6wl`!8;*RA`uA^P~DrIu$BME(EQD^ zP2P7<+J9OX%(e~)K%x5u{tUHH$SsRIW>#W|9$}=syA2UfPZfSYR}oS8&ImrBVA3Gg zgO(sWLvJI9Slboxnjj()Kc^eY9VA!q7e!ZQO?BzB&u3K0t9rE`o4OOu2fBjeKR&TH z6;R({(y|OOz-LVlLe(FpfJ&GfXiWxPq+HE+G)Jq*E=#I6he1HqcC6+;=@89qNrX|2 zfd*#s+vmw|wS55Q_7bLu>}|8Agq760)|NZY{{>o##)*-XWKbyrhVV!{ zZ*)@J0Vw{LxR~T@6+%d9$ZuIMktUS)mVy_T^>xYl^(+fnjg*PrTMV}C-EvPjw93o4 zqI}IN-)fe|T}vjMi?+u3=?KpaF1W093E;B`a*}Jl6dgt~iit@v`P?ks3{`=Mkk_WBJ*5PvzfX80loOG#kTnx0iw(P% zAMzy&QC5>v%+e7qW8xPJeUbh=RY^EEj;X~509>U9O4xq%083N#;jaEbdj|@`p9i{8 zT>wf#FsdEk{4(2*W}NZLatC259IMPL0fBe&q5VZC?fJ_|#l@l_Rb%N47>G}qTRH6%p9##_uxrcB3>O7IX*xe+8d2`@?`f8R0cN={sFRI??tMEe_+ zq4upH_#3>L?K;7h2bie;Kj4aWAD}_hkxX7XoLyU=;%?s(tx52$@0~n89dgA6 zv@gN__<;WFbV3eD4oKWO%0y+bBDS@+dQ`Vm#Wo_hef6bdb^K-B(m6cSB~Sp+zv;#! zpp_meEl8%|Ev2nj{_$NUR5WX`*z1G^bRT}w4WRxXsCj3huu@cY5UG0bL!?&x=3Xxs zwcaPR_7+C%7$iXTg9SFg*uPjv>C{9aX5vIj;8c!9S^U~0TdE=#e`${*-s$CG_*(GR zb2Q;I_RZt_LLo?8q9YJh>L6z3F-YLo|7TR#NP`AL;nNl@JJCnH2q$Y~o=jyvsaSTS zV_pJ@{C90AWe9TBa&>nIYrUR#)D7G|=^&?k)W*&hg2^S2!~ayWYim(3?r{=2l&|`Q z+nK9oQ-QP0^=Bnd{DR}T1oFfAZ?dP!trL4guVkEHs?&cWGaLU9^D%#reLO%2{{V~s zH#k>pXbg$_8~QiA!nded{v~`%wy_WJa5e06^M|999m4 z1w+aX!ziH{@v5dEuesN&*R7UVj!?DSIV)|L`!*4Uy4pTFR=_jX<|66dj}C`+vqn*D z8Hn8c_E?9|l3#1u*-Nz!Dwmh0a+`=eIHT4cr0yq@qixgXZVY%k4QopWgj<$!6a&&A zJ_3kmuYfk^kKfqi;PhHM26Y&1ue?L$-^DYuxf}AFdx%%9@f#&>#q*dlo2|8D3y3-k zJoQjUbAC9W`%7QNiWyNl@cW~#OeTIc)EO8pE8+6?&vC5&v$5ma1Iz3C3~&Q5Y`1{A zWkJhGe|W-T%46gd6m{QMX8*crQ*w4zc2-<^Mpk@Da%NVUTue$QD11Pb9^3lKPkseK7loG<$Cr1B68$(2jvlnXDyt`e@v_~&Rn?ck2AhGxLze#9t472$Ubu6C9 z9`MvN4G-A>pNIT!Bov!5zFq-;~E~t7(JfIs+;_VE+di4-^j+_c5?i=DeL>DM$4z{Mz;-WxhQ;LbDzXhUfdxh6BUT zqjv1^_5y8VH+;!yp_*_H8D7iGm)~r;*xmvkyTaEj03+bA(XIC&Zdu*x)`}ZqNPlW{ z=O>lHq>KdfE(L!j&={h~Ro8P&$_Ut_kW3nCqN?9m5Pv&heZTaXc#AvBK{p>sJHNQt zk}ub@G`9 z#D2_VJ%c=RZzci#ryycMGBIP8k)?*hA7}!AxylftqrK=90lz!($YQ!oD~v#~Jkp3{ zN~;b%C@Pkknc&>GdHBeitrgHoaRT#nfy4NB!o^+A0WqVtoIyrvHQZ3hT6y$*!u}HM z^>&`fVGa%1K@y_Os387AM?r>*oe3)n%1Mq>uK>uxBz|y4y%UsN#tFD4{d80qVs@~V zhr;kQcltqNNbp&c;SeOgL*!qmk>vTm%%sdy6e)`t%h}Q4*b6Or{q%nM+|@JP0eH9J z!0}!suaIaj^_(vFUF|&C?rLj9?YMtxdkg|N-z2@(@nGK~ug(16A2@+>eiVY0F7$$2 zEnLh&17pDS_qJa=lfx9le|w9+0;7F;v$6F$d92mq1DeB&$~)eEBKpCK)h1BRd9*mH z_Y2piOaBq8*M;^qhqnVcr0Y@C`};j^vhz+06VCIdeJxYa#`P~31UEk$j#Qty3+Gqt ztA^lpc_KHwu0Id~XEL?myuaD(SYA!-7ET6(LtC6^J#tW1dj}f@Yrhdzp2=#1LQMZ` zNBH5Poy+5v%hlA*)a5vC9Ypr)59^3@8$@b$=1ej=J9zIdhrsq%_-<@Q*iG0G^!_ot zXi;1(*e|KTvwhe;zdCj1Ts#8#{21Z5&{?851sEdugaTN-doaLz`bMr|yLRoozTJSo zeF?cH@`z=1`Sr6HVm(i`2I(en_bVg`4Cn~0SJ%U@=QulL{woAfpfA1O7+dpsrh?;l ziSD{9b9@i)J8`Sw#3n>}e_>%D@#ewyDE+Pv~%zYd7JpU#K7yUb1&OsM+od;& zhW|x_8y8Ka{EB*3o|o)TWF8|CrDKeeJ=~jpZRnXz@7Eq ziQopmCV1!m*z?DH$K-R+*trCq?U}{wgrLpra+8P~jgQ>S+Ss1Gb0$nDpBJc9RsDK)Rq`&M4Ne=l?wl1! zF41A79FDwL2#K?|f5AxN}$|o#E*~8ylt65~o^#r@DTqaeCOjfbT3?rVJ$uSjI`_5=$CNK22Xq)zf9# z#q^k+zkpK)Z)Zc>Vi!QoFrfsjIHVt*%Rdh^+xUijT?RhO2Cm>Y$Jp)WzX!&pxc0{l zjZ1OMSHTPzaA@TrjI8dmStU<)j}TJ^L%T0_WYmmctZGKdlI;7FHyxTHrO{_11`r_} zfPf8sJL;*lsv&;$*|(PF%}QM5MYaQCDg{MQB5^=^$nf+HI3cIjsG)w+M%v87$9c!g zdV=qQFby^nDb$)fy}B-R5c;9#w^Dm(@Y^#6$jk9mvItY>i1_t|3P(fs@!h8?z&ZtF z@_t20yhU6Yk|9BTfZV=t{Z@&;!mr{< z1hc?7aRSPF`o;xAs4}MbuzeY1h(Z!GSR0F;h}2??M^i2_t5hnDu$VgEJwZ!l3vJhw zkz2V?NVzGQKZTOADhbW>w??@#XWAs#%%r;rg_+?2>V) zWz+h)0;eHblFK?wg4~|4K=u;FG)KK}$YfG5CD8QV^1p^Yy-T;1nO@Tz%-%AAOa`jF1V|E5`$7P- zxwVUk92B1lp<;?nI9i-lc(f69vF>3VOZW%}ve-doZ2vTi>M(j_b{;(VxjgU_x5cxR z$&}4TnQq0UXN{@BE7L4yd<<#C>LpY}!t$5rP*?Ul+d?k6jsqB8Qv9VqoImk*){4mB z*9f_Kx&$Z}+;Id{@2a=&r1O^;zrs@~4sYZiQu_cAA;AGvQ%_47^2lyx;ZqA?~h=Krxho-v?N{GE@`uv%Utj@4VHux z36iRGVo#Q&6wa|%YNI6vaLSds5^Y$8G4on?F}`SnL7$eB2QI;``!A`8`U=E#0l1rs zy^?XQB>6{Y9)&C=y65?^8;-tlu9aApoP`QV4PpraZJcDEu#8UY7 zlA$K;;ys#FHMmY$h4g*j#95^z$VD$Ds30`S1^s@JvR%J2Q2or+_|EW-@&U0ueX!n& zE-0d!wPZv{GI36cI~zExM%T)@*nqj;T%reBVzmm8HDi`mTEVcecaDsLX+HrhgTLS< z`k*|g4v)xlk9r|jr<|o{HB{gkMe?|&BREcYkW}vE8SUElZG?cOcP-WT-K$q0PSoNN z{zx*vf;oJpZ{&yunm#K<8jh0lklkmOzJ`Iglop4(TFT8l!w2$%G z=2tBL`C?2x!uL}OOf#Lf=1S~IV$?Y_S&i9BNERv7)^hjPevCdeU zSrn?`IK#p>#QHgUnd;qOrK*PonPtVpDz*LzXlo)9S!Hsk4^0sQut7G|uJ_*iiynxA zG}jJDvy)W^Hy%p%n<-?320f7qNkotGiFdaCBAsX5ByL&W3EP%|d@!TiSG5rL#i;qd zezDeTP=++a+|l+pSQq}$7w#zoKi_+VDyLwf$r#4jau0k!SxaFYS9@x=c$PDpeb$IO zy$c>Y1q*bQ`#2=olU4ku^An96s}~&C7H?=!wzxP0)-1kkQ}Rt%)x79w$Y1m)fLAox z3p)zjT)$ThN*aDOnPpyD+lY{QmShTx83`ubS(IB_kwXg?KGv9wgtolOXfnO|@yl#6 zek_arC=EZRWSOSLS#V5p;hP|yG?`JJA#R*V*JZ-G3z$}L7p#Bf;N zWJJVq8t*<_UJmcNHUuz=^x_4d77uEd`1ZJEH@xebx>^XbEyzIe3s7yxH19{WbLsT2 z2&ypbu*CLegrq%!RN}Oh_#Th^YsNbfBp@OcYT+Z+x%&D)(cbzXS7%dFOqQ3K1!Ak- zF3wx51B}gQ9NE_iWA%v@{~zq4s5aag8wX=6u@BttAMe9!bi{s|PwaFI?D;3w`M+b% z<-Fsb==a^rHB?JNuaZ+#Xe*`ekC^l974GyBs3->QA9N{jDRA6(6saPts>sGSbE#p1 z)e4$N$@uCF+b2hOyOic(GLHO zt{rY)6P}9wIU_kpRz@`sl@_Cn`hmVygqPa~D~iScKq~^O{zf-2_k)2^!r^sBx8p&e zgb4Ol4T$>aG1GrM`1a1m4(@!lebH%u+0RuXsCg7xG7Obqhm6cW-)lX`0AFXomng=aJH zop->dulr`?o!o}pL!fcMA+2oB#tn}?-J}nf((QI*<6Byr;*fx$K~{r(5I^&OrXc>Q z72P84L;02CcrEh1-O3OY7%O=5`%gLC1=mgC62z4X2r5ax3@r>sCd}^H)?+m8gZNYZ zHwA_a^tH=9l3Zn~@L)*n7dGN-+TH(+g1|Al?>W%t^4MP$5lCM+76KbdhhvuUy`Fim zgTMJVRZl7!V=JKP0G8nc$n+mTL&V>!%u9n(XfWO1Wt6i6;8Q%Y0RVplNRbbq)_(vi zW{4{PFfhM5r)k(XXt5rCGknPB0n}l@LY#pHfPFA8326G8`B)T+d}R7qu2yq7tVu@3 zrqFURe$CkULOK*GY_|s~L0>Pz%;0rx?f7KD{)yk8LVf%4+Yh41lEWP;&I%^_4=_IH zQ+6mip7%MB#(!||TGX~`Co+x~)!L$MwYBiTmwmM(07xZ)zPtn~3E=t%DbO1hQmWGV z^MFpZ{fagV6A7!wMpZxWZfKYW(6a%{z7J9oVD{g2J%w!1dk?Wk5Qc)ZENyy)x88>| z`N@{EK@Ab+4}r?Tv%ZW!GF;1B+_bM&$e5m&K!X1dfA-OJ3uOQ4Fo{5kKyhj)TI=?y z^y|GASgz}{H_;0RU4!~B@m6G8E(oAqAF3?*Ihz+oH%1{nI~6%QHA%fIA%Z3j0+kPEksd@#m|Ld3aBB&A|5&4jZ|Ncew>Wx|Fplq-XO*+G$p~t8z*R|4pUccMP`cAHHI#qv> zL!gn#S|<{fkFJ%eK8D^OE&31v8W< zQGPOowNY+66#K&BtjCQ#MK+%GYY!k&4$SsUzT=OgTHxgH>>)ru^`h=sgbgp`#j2wn zp@F}C5BA{qb1A`QM5JNo-gfrzJEwlS*H7!8l`yucla2zKJ_%GN7 z2iRU7()^)gi}+#HyYQ;7@iK87KOVwzHSUaKH*>V_1Nt=hRm3rE80hI)nVIqJ9L!zx zos4PC0L2Z!v-4sy%&sObKQqY(OBRq(G!oH)WO}2>+uD>r#@j^M*g|}akt;8#goioY z^|k37k6%0F8w{08Wt$iJ$O5REj8M^YR>vE3U#F&?LK83`dXEqJanq*tzDEQ|KrW?= ztJP-=_)29Hv{TNUfw<<5#{Y)iWgic8OYN`Ws6(PLCWC8_ zt1#*U^hMXD67veW{w6qUs?@9QeHI9ZPO+A6aB)`+<-uVCpF!W+tpoK_o)ew@P2*QG znxn2+dyLKJK2B-K)#A<8GnZgD4Au4`xS`V2LFQad(^K=*gL%Qxejn=G2)-O7X|mZj zF)E$~27bOvy;X|q&|}NW+hfiA6#ZQaubD~LsqkVk^Zl& z4s*W-0?g@cNOVy`ie-Z3m4rR?gO~MZ835-&dE^`ZWavBid%$nLtAldHLuFm`?_Lfd zks0H+7}#pMu@4fkvq@SZz#ypmw$|K~e}Y;~guaOtXVA0AsaF4tW=_qRpd$p)1*@$} zE^g~SIc}tF3d=5m)Avp^eg}nx0fE2Z0^LQCaz>aBbDs0GchzL>a{UU^U=_=lr-@E^ z&fQb0V}Uk}&lOpbTA;lEzfgdE^uo6+xmt1-Y>g-#YJ>Pl2lNDA!ROnw0~Da`metws z9AF88y>G-L5;$!WB|r_JDFc=HD0BZTYfiQdMA$!IiK@sf#CT@_0Wdv+t^EYzaLfAE zzckjY&#-U=BBc?Pn5i~I%2as3|M;~_KC{gMt3V^=`8hQ$h_IZ2Y))WJQ z^w#{^==Rz?+1C8Z^yoad8qgOjR3~m!2Wi%l+IBhe`DMlydj1-6Z$O@1mqIgL%*Gi?D>R!-PE1F+Lf+dyK{>!UIKip{ zp!#2vz3V4cv>xs`L_?Xr-?*Y+$rhsS(w+t$ps-GC?A#G}I{cB1CB~ zp$tf3@fv2VE1pw zva#aYHo8BgH+rbsx9nLZp`Hh@StZQ6$=lfI=Wo+QGUV3n{<=GVo1bjljoe=-+>JZ! z;eL4_@pOFJTiX4tNST3NxaKgm)>u{JzH}~~t9f;5l9k$DsqS;xTY0lL;LT=HgNCE4 zU%Q=~h5LqZ<)VHtM~u2ihc}gS9IIRie-0l>**k?LV~b~dRddYmcS>q`gV;%Zdo8k{ z1#7tlQ)$JLm1@{SVWPKMcVUvTqKVCGP45QiJ1ob|>QeU`XJc(Wf;G^OHa`^h7G&L8WKL|EdFjZA%Z(fh z2x%;(Q3R+sBh%`VM_>2rScm4F0!&%4u%%tYS1-`6KlgLDzkc-{5RhGm%KqB@?e(Aqbm(`5(R3115vWS- zjR~`GKsbICE5tWX_m{o<4fs-9uEl!Xw$81#9^LgCx6LF}^d@e~$PRsbDADhouxmC> z1~$n4YZCd?{Jl}t*i5mlY%_UuU*1L5tVTwySPsE@4^Sspsp;5#cK5sd>D>Dp_9Chq zD!Zc#LzbR}W*MmHUR*;iNL-L{aCNKFLinInY3t6~lq zlI2HWZGn6|${-Ucy+S0ps(hxXx>F5^v4B~*Rdas<*pRv3|scmbVZ|{ z9lu|09UIK>7CjCfI$9gQx4g01@q3?19vp&wg=jlY;PRye|9)&C33|EyR1o<9KDH`!iy%I~2V1iw-t`YD{w`UlBZ0kr9F9LKhx*-Sac!Q)yy^x3L6|dL?h?4J-7eSg3hi;#VLcMv5niho+Ver?T z_kw_EvdU^tK~yh43Mw*&nG8NvBx8ED)kU+a0F;{sy-1|V31zWd5)*F(R1< zK#F!df3=a!a_Q{2eEOcuoNO3eWu=udD#i*X{Q*k##<#lLZla@g8L( zOp->iYj_Hc0va8hmmFXIut$UJbBpo2Yi?-CIs(c_g`^djTO%g<>^{{ZDF0!VJvZSm z5#1_rHo@Dig1uDt_Nw2og2`J}U{G_BZ6YkO84-F;Su1%v+Tt?No70n$V5OtfFa<4& zQ=60pp}VIZ414&JAdr~AQ>8XbdcPl&xm7uwAQz~obvZJzQY-gz*y3_Hdz+l{`1uj* zehAM@mQWnCh6~sipx}4Im?Tx(ouvaeH#*KhC%mLUyU;>NG3L{-s-qDVP*oPYv>#rKwpKxEwz>y<+hk0L}rAid_c#}}+ zOv4UG&!%w%=z&?mNqxzfB`d`-hZ@o>PLpGu2-~JIsdbP}ePcO;=ru8y3Cn;OB?Jr2zUN5sGq#Mw$9ou1*&{EVFg&!xz(eD zB4#>H6+N%N{@fkB{Th7K{l@nqLSQV~H{bRLEdaYIcviO4)7|+db^p>QNW`f%XA8H7 z=j>7(!rk@k+Yw71b^%K+2FP7D9~k`D6m~tlwPdkBFf- z7Y;q(A?Z0}ZqS&4NUWqRPQ5CJ@*xldh;dWVQD5(Om#3S9%|~1KSvXzT?QV9@=c6+- zf~y5t>>kGOT`*OFT+lC0H`&)owG$SsTN@j@DTH0cL_s%nQ&33wP2-<6oo}bgb%_F4}?J(PrpOW zzFmu2tBF|df3FBaL5w6aaZEsW=gb;($Rv*xoIYD`h;efPA~9bVnM%Sg$v75fm1HJY zi&)4aX)b%1>keYYaT1BHjj)0%L_YGhu8jItn1ujCH!_&!_nW;z3Zy2rq7s$)0ggyd z?aG!UIT+9TpU>>hXf*VBvL-wUPG+iT&K@qMr(bvkFU z&t$SF2=z=ktc2T)%G38|rz1VzUeA6VdPczA{Sc5<9NzBfk-r{n#N+aFwi9WXsT^$8 z`C2_icIM@I8n~o={Of?4k90=6W8g%xHUNPt5mhJj|3}w9Mv1aC(E?!Gwr$(CZQC|a z+qP}nw%w;~+vc46y*FHIepbY;tjLN;L}ga)@kW+1la@pD-S=;c6e7*@r=uA4iHK_n z_=`8c?^zie;l`D`xvvC5U@7;9S^8MLeUp23!Ak-KNijRj(4@E-0MU2P7g36IW<4GM z>HV}__opf-HOJwGG%KBC^aZzuhfhSg-7ZJ&^AltCAy)ZnYYmICDZ8vn|`9Tt`^u#pA zh)2DJ$%g|eGq57N*e9cp+_oHmC%!fI+RrZ(yQ6)q0f- z3Nh}L4Edv`tQPQUC#62d(%;Lcx{PL1K8nosi3!yhCe9kdDE;`c$ZF>T#~l!@Gh^yB z_EvmZ`3!g;vLT6tTCJOk4JIgMbEgvg0Aiez3CqPsk$?{jzM70qMEWfxJ*f(op6%!E zzIZ&Su5UxH;;{;nO^a)T5D7x9yC@|9x!bY{L5VIQfB`^$uvxWbYnS7$>1tb zq@`+s7ddH4lt}g<$A}a`r(eujg3Pf5FZQ$R0jD|w6i4`OUNO?~W-<}7sMUZt&RZaY zxLDX&rMu~3^t=bbiSXir#h0Q9A-d(qcbF2c{b8VLb{pikWE>AkN0r%>QN0U`6#|C* z#NNFi+us^Pg)gTObN+OhB@meJ$GuaV*Wh4*WR(z)GBr-MXDehZLgA*QMr;U-de4?; z4sMGKh?LKUMcVYX5csu_MRI+zq!uCL%iUJwU5zLShi9T-?wac~Z!=yD_LY~@)Sd0{ ztu_Us%8WeK9D3SzIne>DTn^0hdr66^?{UdmrXwiGJxLO)s}ykCZTZ_Wd?k7HV+;AY z5rR_J{I-+adb~Vn8Q6H_0je=jc+F1dGdLn6TPjW<-f$2{cYkzDYM_B64J!?NEm&2J zMZ8tr5|jRmWxa_F54ajQb9sa=`U1ocxV||jd*9?u4g&bw&ilvY_&Gm(5Kf)FtP?^E z>5HEWg{kowR}kkzyK%s7G)+~^tm?UrOPEd_2%bKZu6AW)`RBNMIt9)Kd&$lq!Gf@= zxqBWS#>Z<4@g?Y-(m)o{GGMP&ZMn})(AB2p#o0L5S$JBc{k|_8b8NTp5hSLZLY5F& z%HMq`WQY1_-6GI!x{*b!=#{+``(R0$znSJQUZs|Zpmxz+i4*&YT$IRm_jDO3rscL1 z05#V<2qT4n+mcZnxAcSuAi!UgVt)sy-9CzA$Xm#>De5%|MXN%3CS4%RLFfLO6o3M zEZp45QO(I(YX2rIs~(z^q+6d}bQMpj5aLOi5aA%q=yhJ#xhK?T?`tkgaq`lL)Jw#wrj$ z>KEJCfK46sD*h3XAB8O=1U#$)Mogs zhoPfn?I}jY$YNO-Xq{F+@{UmIh>m`Qb<8wx>i*X%25A#NgU=y=UY+fC9n-qnry}rZ z_QBy>2cc5YduXZUh=vK=a%mA690=HtS115s1Bp{8(|BYHwhMhgk&DnohL;F-+tGs+Tct6{ZzFAMyrlqQ*@m$> za5PM!EN&(#9u}-6K!m+!Y5ndR6D-xHY;hDR&@+b_B!UC1;GEq(9EbLa_!M;tiV%VZq7yzP?b6D_R*MSW_{^DZm@F$}opM%3TBnDYlv@x;k-!P41{Bvf4=rRb9oxmNt z+EgLYn$}QA<0gp@xG_b~>1Z;)EkKho^xy(RG&t5Bv$*gh5ZQ(QyE*X;+BH$1u#d0g z0>#w5?jV3Ky+@`VjnPWzjmQ(SV}OvJZkDGP?x~NtnHeG>($I!))9G-SDJ~2|7h+(= zj);zIFxEoD=Rghbgo>Q9p;e55YD3FGgE*y2pNe|k68EPXk8!U#?hg&#`%^o@=BtGk zr9i!l1*zic6}qks--^LLyT>)_T(iQ~`p-+?JLcse8X|liDVBi~7M(_xlv6+bL!kgi zK)Am^qD2EMMN(6ZvYS8IIKcRp(VtD%Tic4(IO?&n<3rf2+Y`BUqk)MluuHX2C@WuF z_78@NJg?x;ES_ehO{j(DLLdPWdW9ZI=HC70yY&jULjQX+P27m#T z?ag=3E*b`(0t=5FmsQQ;sz{3;OrtP>`Ye*Nr=H|{83t)!%^bgO7(j~co zY+9S^X!*M)PiH|_vm>b36X&-=maZxy{dK7*JtRY#xhBO#kHJlp7Q*RJWBAp+(Wu+H z*G}VH`Qr?X2Sgbx7VOR-;X>H*P^hCPQzD8)jK(0%MCDBuXy^YIoz#Nhw7D#Pla|=e zOYW5u#Rud=Qcd?d0BTfLN{F$0Lu04DV9O|Y+%=WBnn&~CkEr0XF(01BBA}~6VGK&> z0og3VNC>%dz$wu}{ zqKNrrf#1M;U<%J@zLv=fhC=N5izI34JE{45Hjw0O-Bsm7v{D4R3ypQN)|?^Qd4K;F zBiErLQIkkXCV688--H!ILp!_hjdnL*7Q3P zzCAp*cla=H$N`+{=HV#ggF9g-8^~XyvT%ho@f2(cEGrrMatx#-osRARAv7kXf(o=1v2 zC=9n4pMz-LvxByLWG~R~LxSEE-Bz#73yh14QHRE$`6A&4QhY7Wcb+Dd$^7az=hN=z zqPUCkSJ)I3$5^2p2e?60UMU4{|u_pc63 z7x~cI$51Nl;3#L(fp`tzYjLKOOXyO2u=>G@>)^Qf+Bz*;&_d*{;DJb67~(MOZ9qCs z2swQY^saH~4>`b}N9DFs%=$KXt)a`0P3LlNtN*UuAv15-W znKT+ZMNX~R=$auj0`Hz;lWX3XxUc1IG0@)8PCNHnxS&s3B*$R4RaJC!rp~}BQl;gB zSwFICg;w@)%_Qp<4cU3lf#V^nskjKcLYTsUgl^)dC{zKwe`5;yl;JyC@2o6g0tob_ z(-f8@hLA=mZm|$9w=Fe~e<`9utNqVF4w?C^>RTx1qY*qn)Z)#hq95ApioUo&?T)Vi?6mgA-p!}LG8qC7GV-|}C=^KH~SD5M3Z6AAk1z_D(8z)P1$3u$~ z8AbVI-o^A?Cf^TX7%h;%NHmQUD$y_E4w-Oal{vHsT1Z?~iQ}i^QVhn6$e=_-rM96| z2%*^=LLqo37G7BsQ9n|C3htzWXBPNL&hoP5#0F+m=5ZDr*Hn3ci2smWMZBCbk>6nj z`ym0er_;5z*fK1Z&|&uGzJRW)#Ha#@!KGGo_(3LqoR`BtU=k z&gyKbe#-}rHG~tA5L}v*R(J+}5q4bt6?Wk;Q@q`JT_z+RlV00PYD{l4_H>E)Ipp`F zE(5G~V@e|;$LyprQcD6gG{H!>)JWc{pI&bV9JS89D@`sM$|V5Wy_UGg>KsW4)Y6RV zN4OijWlH6`pQP)M&r4|WnIxCk9S9b3D{C{2-P~coX>bjMQbFsVtY*z9>n=5;;*)!P zWH4Ilq-RWh(cJg6?tqP^IKxsmhZ8<5ml1AKq&iEDgTY2|BR}YgIzG=FZEdZ}l%Nw! z0umxinQ_fXs9FvvJaL?DCtqEoxQtWW(GVR|MgXdMLs?<2@`c|`rMP76VtjUvx@{ER z{1Ll$;HRI62m=K{I*AnkxPVvrQgg6XngrR1 z`XPnQGWP6mr_K|kh<2eycf8`R7M9SDg4C9xgaF1|futf3Rv?mdHzoQxpk2m`Wb?I` z7FehcR&W>?(q4SkE6HZkM3! zzhI%=Mc$s8 z$DJm0tT|{zF}w&^#Qq1zmX})R4HP>q0UI=N?A!Dc9~6(DalMGr>N>ep)L?E3+9&|- z-b#u&g2eJqO{Cn~eUctC1j-wyQ79qW$XLrFBU3Aoyl zJg^Xe83A391JD$Du2)R!5~G-%e60%xA|0>7-~;`S#L<3yX?6;=o~<4InMwE$C77^K z%uNS(-ky=UIK@w|Ea4qdSE>o5k%h_txl{8X3ptspYniA{`f#*v^0CJIv$!X)$1)8) z#CB6Qz2&8X#E_c@(hq$Io#q{%Qa9FR;hMChv0I@MEm|yop4OEEH)Fj=uiB9cPY`Gv zV-lum4UBpCyt#}d5i1ejO)yEOeX|E?R6esmBhAX2W1C&=8GyKfGacPWoHV!7Y9bVy%-lJ?lH4{gk%}1?y;2<2M!_n! za#m!t&aDIGdX+n>W>vuME998;I#hN0f`MkVbVx4&5!Ezs)jW)mQN%!sUMuMm*{JX( zzMZb^o^VC3&>UHkkBFF{Ve+aN{;z;z*O1y^&9iY9xS`jVY6^R;w5pjw)nO~7kfd^f z`g{!2{d@sM9DAzCWOPev63@A5m}3n`tL{j|T}Q8aX3}}ewsghQ2mQ0FitqI32^h`o z4ON_Oc~xC=&Oq1N!~*nmtZ-ZpwUw@@#Ks0f<$k?RNP{z6XLd4z3cR8-4A}Sy({MlQ ziS(o*O2{9QL#5F`@Yo(Tvm8Q}g#P$$4V~t>bi= z=m#65F~H)CbW+`Qb4AF{Wl6Tg1Yk;+`+4JItF^?FakzKqD61CfG$Egj1Rre1U!z5? zpqKc3gqV9m_VT{!$VQL|MXrIq^=Y`p3N3qlBNCX)`L$$V}BaBDTQRQ8#g)=pfEZdByFU zyNz`^cE#%$_sx!?$q^pA_3lu5r;JI!yl@0Krk@)k*QvTHDYg88${Fk?U7)(Ti!pqW zpyz0_jlV!ar&&z3F2Y%fklP}2CihW*)zUuLu(=i#ojX!!#+7g^={$Y-(25UG?~D3u zMx&!}i;NaqHj#WPPD3H>SphX+zOsg6ny#$Fl98vAV)Hc7vhOGg&5N9dYVRCn<=n`2 zL^79BhhnT>97a*ApG^CBZ}uFUnTx@D*jDq=TZg>C-@;L=Cp3&^ZEV1|14n>INBfP6x`b>S@WbHef}6sKw0}wH)M8tNd=Z3Xq^vi929Ej zGi})DuL*s-%OZGEorBuJCY4u~a%QykO+aI#f4qiupp>HH{hbn%$#=>ZkKMxq?w!bOf_Tm=x_xi4LQFTRJ|0**h>38cOPnmEa$cYuA! z*Gw`u;ZYf{(A~Y7uDiUSbq2yR%7d3g3v*&(AGJg@NMd$=86$NtQjdQEKCic0u%SA8 z0%blv%vpOOKi&UaBR{` z*8oob0^5ZyqwNXxYkFj-D9c(P3u2ToA~luPSlY+jW^XL3Sa3)R_w|JOogbH0M)Dpi18zO(c`y~m>tTXgIBYGQ*3l9NDzng7Y-y%KVw4<1 z=%CIvpLY>VCEXsYN!O}Qg;%qIVe!{cj;HRGghnfayg;Hm!(s~D!cteNs!|L3zJtj| zn!_P{4Vp?A;QPQIP!Ll$9mIkt!~=}6IJZ=1%(@IB!EVpPnkRh~x0j=67#|-OML6to?x8$Of6#d02M8sPRxMc*f7mnG>Jqzgx zDSh!{#w!MXj*5wo&<{QiBc}}yJD%WsYxm#VHetUq$(hfzaY&C~H2&W6*$bU{%LTrl zCYOS|tg?G!oc+5bJD68U=SK34OQ!6;1-E*e?Z0cz>Cs^b{;7d2f?QVf1ciY0*dHTD zy(Qo6U!`YlJ0bjHa66J&^K>xsV^RrbWh$QL34;Y`ZzkcQQOVcb8R=0eX$?d@I4=Ty zRaWRQaT&PUh<%_8`G%I;=WsVTc@mGAQBhA;ciQN=6~V;0STBL5GNt|}R=$kwCo90n zG<2+{Nw|KK8zPJS^6H>ESk!qjTYHeP)4&$QZqp4WY7}tVSX6sa6)`Do3~2iJEY_$5 z^OL)kq>_rNP$k>@q~Qy&fL53O0B{uCBm1&@n&ll~DKxx&qKYbzox0SV0}w!A8v^oZ z03uk{BRhv1+D3cTHJ*6tPcy9_iF9(gMA}Cp5oOX3S*pnx{zO7i9KX^*-k{P^(Qqcw z`B>R_;~}Hv63h3Rq;ppBjJ@N5S%0L_Od#r7eW`8$pzUh)HQ#n)C8a-s_Dw2`#x8Lc(jV_f5xX?l13Gm;371&oD}Y%xtvzb2BCba|bFhHoGK0BRbPa{%NK7RIy}#+%6F~0?*k3 zi!ggy^j5yOw%)jjE7D#Q4E*^usDJSza69_X*88DU8j*{5g1_ z;BeJmgvi;L9d3a#_KIvfB`eb-G=7E(*ZdBXTbW3$kTC^`B@OLyWX5|o-Pts%I$D$+ z)DTI=9I9-hjs!+=p9PkoQOzVRZ6oj+uzvtd(pf%JD&~_4w-MxQxC8)C4!Z=w&`Kf< zrcn_IG88D}p83=#oyh0iw7}r|G>y^x2@J2Jqr!BR%|3%1-5wAJ6pp>*7^}eL%ZLI5 zpB^v}=g>Of8U5(oOVcLvOp1qMSd}!*82Te+&%yPAy7k7*ibCijr9dctq}iYjmDXwL z-13W^3Vlkic2k#F(GROE`)5()5 zs#;N9jV0AU!PS0%2~W~2*~y4+d+CFb)y44gx#a^zMkWrwQzZ_KHm)#}=g&Yy!-Qsf z%)RDELzj=Wf3p2b>(v5_9Lsd3YjwZWG)aGJHX=}?D z*-yP)o%+&ZXe~5vwzgE6YY_gi^`ouJXD8dy*o+Kuj>alTeT0!ByNswcVrmY1hdsw<)=JW3#dKVRb?t%uQ<3_@`6x{P!&(^TnEA&=bV_segTkw^pmUXo7_XBG_8 z07e|qT+{83FCTnI)6cX&K^#+S0#7vA0|BgPrWR44z~PeM1{5+}zxm{UG0l=0RnVJ1 zL8$6NCb^ml(D!WycWk*zbFmo$%{8g2otzjmSQ;(e?8Ec;Ztm?!7Z~=@D^8Vco`S-< z34FQP+E%SSz6^&02Br90I}%Fma7B;=>dn|)SXGSf>)72E^K903@;9ssyuw|QB9{Y_ z(1>Q9s<7Er20FoIXG&8uRqFvv`L~v}5XFss$*cdIcp&pC_GRSXq0V#{0GG?rnKf$G zKNvVNcX*Q7Jt;qj0epQvCt!_I;w!=(ovd4t_(tNQh=H5lkPgr4kaN z(H7%`LPOr{T&(pJt^r`4wzj@(S2$=GDSR6ksv@L8RbAo{Y^})%B{3f!4l=K?f$-)I z{WyS$V0Fd=;>Of0TUZb*9t`|WdyF2LNiA@GG=+ZS{ILgq0DGNxE^Q#1Pr)kU(0%w= zvBv5$k6H0>KTP*iX7*j(jK;^8XI=TjF}uQ|+GEhxQzAQU;Zt_b@Uy8 zpv+My%_E}uL=AE)ywo9F(q!bJbuCAL71J4ET#&4WclSr-LV)e1)zzM=$Y64YYL<+8 z2V@E;oEQ<*2({L;TUHL4GRsF=QHKd8 z-Uz6muL2!9qFCw?BWAS z$+`|Y30!P;6h04(PU1kxOO4$%ki2n1GY9K8CqdX)9oy%xr2%`x$x!%g+pS$!k0u}@ z-w{eSr!QX;@z9a*MDy6@D0*nbr3Sua;2Hej&WmdE9W<`*9^6l35&F+>4LTQywh!D< zy9`drR#~s;IPh^euY0k2t*{iCixCUS-%_4G12E7LHdS&Y04QJN?A{Ev<0KP0d~q=O z{7>pV;xk34Y0PF$0rNvS0b0eWKiy5HtJ4wRG?W6pL|$cOrsXDg6vz@9s{x@qOMiP? z7EPvl?-Lfztt@E0l@J}H+^nwFzHJ!4J=ModS z?dm@^5+;gXlrp25lQ}G_>Ug-A_?UQ=uH$unZ&6m)j?NR5Jx)xF%Diue8;X?SWpC=5 zuZ9`jJe!L)SFMWb&}PL|KBkAaa6=SvdBL@51|TUiSe1mqdzY_Ll4av$b9q_u@;F$0 zkN&uM`|Tp55R#e@7B^*s8jTz!w}cb=K6P~64l4I7ZbnCLUW(KFu6y5-jUnDn3soaW z+|PYxE?+g1?SU`%05-#r17p_7!F9rv2n5S0r|`v5d^LvM;Q`<5lo;EOU;y7m@R7Z%IKfJ;u1;r$2KC% zpH|c4qK0g-=1pWoynTm}#l^;DbJd{um6M}b2*WYb4=1WN#*ddYb}Al0j!ifOy^dFC zmh~Gc@KKPBiC4+7E#8JG&;dmM(7Cj|p}?*#X4a?qMlCzEpAOObywol%XnuUx>pc7I zyWLxw57Qgaiyf_5Cv1p~t)z#B*JP3FnADIsp@YuMyvlcx2@Z~Qu00v9X2Y<>*I1be zh>Qx*_ndEI;wC43jb2;2vgl3gEST=Rf4;q7srAoak5ups`FL1a@$h+Bd_9G;65DYl z&5aPoGg1Lp{27=8J^o{_ds|quKzlkIT^(HP{Nkwl7ZDn|z5t+7>8L+8s328a912uh z`*?IB#3vgSyLu7C_gA$s#Z!p#T!W+7wZVW^8mo};)(bWX0*4p-5zw6uRNGy$l$@Z0 zik|=sfzGU74%;0`19y9U)reYgUTa8Up-QYc2J#P*nQX43F<2VAnn-PrGXSr*Bqe@? z5hVTQPHSeCUa*0?fq{R;F>!#GfW-AwWct+|a&!rIrGorQlnE2eWZ#of150=Is)}nnlakSG?=}ij z4m~;PEiM`ImoHEeuFF@qay6&b9fa?{Z!)x*3Li6q?8gzh-N%Uq4e$-^NgM0wA zhJ^SIdM|(fAocGb%S`Ij%k(7Zn_bN`62SKv`Z6daMoCHt;*f9;JB8B$zqGSP*PQ>n^-VRjefpeG~Bp}5z94M3t@mUkqE@%pHnA<2M<`fp#=;ej^6Re zhGrRzx&Y&l1#-_fJq!O`Eqj>a1P|?m7#fIN&X*zB%er|+)b7V^>u(Qg#i_zjMm=c< zs-ow=Dz$w@Y;`2qrULUC!Jy!DBzu&maqk@lsilA+$lG^^$8sK=hlZ5E&4?jV+DMVo(d5ayh05M}gQQH?~KsKh?;jCJTlES$(jFju3C>{7X+u z+8Df)&EUyIE}fC-lzFw7U5+=pp6F2#@38zZR2=P78a>&xN+9m(Jxe`BYuA_(J@hiT zXsh0di!?V~S=kjRwvZ9OXO_;NOWRN^50j8sA|Gk0e6u!fd=@zXVobV2-zVAkNv5co zf$MA`2zRB6gIRS3&}NKNE#7|)2C{BvYUsZjOu9o%+u+ojFCmRNAR{HZKEibHlq0Aw zsR%v`d&yOdS=rB0p_fXF1U59ck}shhIr2V{kh&g_{YT#vjU&JEUoyrf_!6Z#Qn zY|{1Xp^uKuK|2#*OBf7lRM?+XB0V7X5p-z#NiFI<>r|xO3+VrCTKYK%oEvnY!RgC+ zr^sCO(>OhO-dsb0afXlm8n>B{Jh>80qr3LGi9L0V!_64{%kksrwL851SzVt9Dt7<~ zWVsI+AkHxXN=#s@z6)9u*GBtp4`J3tKDmSuvb$Ezrd*kx2gd!gaFC*%UWG`<{75i`}GMzQ8-w!qy=iAd0(gxC&@E2m7LhiF3A>mnNQV^+lG? zYp-z>-K2JJEqUKE90%bA_1Rn)?%% zSylX_tobpsEGz*4xUubUv-=SCX(P`p4PRBJOE@mY}Dimc-yOL=8)uR{SY?;h-tj|XH-Fj zgrf&CNpqNZPn#`5XX;W2yyip$S%Hai+Dy?~`RM1LyIJ6tZ^_)E%s*B{tc~Sj`xuNc z?T_O4q{PZacjR)VDX~xkz5PK;XZ~elWMZXerH=01%u#fGUEu@lC`aWz68(pD{6}@B z_NUN|mqUN6X_!&6%r~E@#nwY1F9WxO@xTDN-{6`aH-vD=3@M+`%Cs ze136fT>xn~=B5D6op+>pa1^|BM4Eau6uDwWU2{888Jr$6sbzW3w)@kKD)`m=n!8-h zjT-B{_D0;#Ihz96OvKDOH(~QG^9|0ugl_BYG_V(X%{=}|EDolH=}5^`hSyI^&d=FX zeY|a_<=t*%8lv5o{vR?SF*I8_dnt)5c8Z~xx3+J@x@qDRRIvIOqH?+&4ld-C-` zC4|NMV>ovbHLg9MMS`ZRqpxNyGgmD(J}O9J$jrTusuNBMu4YH!FsaA9j2PUz`_HIV zZD13nyWSq;?E$;|-OxXM?0DseB#YGd-x`Op?kuWy(S?0+?Du1K{O)?~X~m&QtP;VT z^g=SJL_SLA#z@Z&(Zyg$u3a=WwFfE@LuF3rAKM*pA9h5zsPzWhNgud0a7+9dL*Iq>Po$01*B^iWJCBdy?Iu>(CGsBb8HAt5;h?xJOp#; zfEr5)W8$t5Dm5Y*dR|SM*r~KYPkm4GT5jG?b5C?9&qn8RD3v2D-Zmay1&;uNNFKpB z#)6Q2pjiy&a3>F}EEk)4w^sT776wHElZL%)_!g(AWY{q53Ec3AA1gvjT!C>h0DL_N zM$JI3)*VbeE%V(|#uX-*mVdtpklIGBUH!Yk&cEq;){7%nrR2;MDhnD5KL)bi3V2dP z9H=zKebM6;NQ=}(7>EKR957H2#T z#cuY~F)n^l?(&gB3zgvvhIug$#>X%H!^}PSs)}qS2*>}`J2a7jnb1A}39;Zzt;$oOM zQGPeh?z$|uv#?C3aRw@TD|FlcTKPO&zdqcq=+p;V%06-2LGPt4^rbT-L3c{)c0dPY zY0K!isV(+*k)&*(uk>_YYbpZoQSQJY`5)`_>>Y{SVuHfbdp}5#X`>1`Hb-s;QfX=? z>tj|KDv}_P8No0i$METxY<#OU+!l}KEx`OloB78!^z^gmYat2u7CP3GfJ+0VSBo;# z7lW2A;3e6d)KZUO$9f=|rn|g|5U8AqDA7fY$03@cr%|&FPb5A{mQpvAU_UX=y%^i+ zDl%;a8&d5umb>UgxL&KeLV*2wfuMwR2Rj=F3?0?H*b9J;Zc+#f(9{=g8ZsJ?19m*~ zU+l3Eo**oaKnyb_yhlua#R0kn+-`S>D9&_=2IFpiz%K1QS`low3C#Pri(B$*c%#`);k44>3a` z%3>_cCmZ&VSJ&6(Rf|n**Rxu;Ddb)sAG)sXPu}8>$CRGo!N>rHrh!^utBzA+C@7^8 z1^@HgnOzJyw#8rLYP&j3m3{Q)1B5-(rgxKmrahHUkO=3lAsKDrL|m8d#71{KB94H^=zDGD7+)5bq<|G1^$fP$Cjlg}@dD@ME+mL@e zpAP06)E8FSa~jhP1GeN2j zLD9&Xou649a_9iB`&^N9mC?I>*!auP$_*yERpRsQB`;waq*wAST6E3+kq}01ch%3I z*W18d&AF?5wFG+IFPusDvAFa-81((Plz{i@G6Iqa$J6wiTprkjpNQFUWF&a;`hHgZ zEKQ;IVDQ=0um6Oz=D!&0-1J622cr4-ok|ZPggS|QcK$uYgwoFuA)crqxplx*BDOoz zs$hS+QX{e*lhKJg=arxwVcv7qt~R7$GaooJU0Gwq@7XF%GPs&|4NE0}Q=p7cDnAnq zfs9-zsN3Rm>OM=w?{I-GO2^1qE|!1+jhp~z{KhYnylQTFRqsYr?e~qoDemb&8{K(~ z0e^QD6!tewbVRmhdhKDP)RMTC!&x1C- z3&{2eP?Umb3A~f!n^K;9JL?k&jXsKAjOe%gp9q{44fq}!dTuPIO8%K-a1UesTJTk; zld12@`@Z|*SlHHO5Yjy^!=t=!pCV|lqQb9Kc@5!@^BMFm)p`8Bvyf%i@E;3Z+VAa4 z?DO2TFFtQA1@kJ3;jvf7HT&-7m_N5AH!oE6(A|>LK&L-WC#HR!ujG0+4KF7EeV!fi zpca0lCV&D8Z~*dsNUDH8CnZ?@sz->OObzX+KV1{yK>9)E@S#INYgJ^gh3T zq!; zKBE`4-cGE;aBxFhZdMo#p899#QWl!nvl!Vb4!P&~`_2&xvFqCAcb8f6(IaO|npx6xF)WO9&O-@DaT zYAZo%DoTX1 za}%4Yn5@W&*L?I=2>Q96+W7}#aY>~n!@~-oeIHs#i{2h!&`eZpri+9p*C(9ipf!8} zQ0Q_``VMN4@m~MdJ=v$RqO~PqZ5p}Sp&fFK??ClDc}YhFJEQpfFH^vdZKza1>qPdf zA6MNuFw%3epO>)HI$w^B1I%xvFgr#(c3RjEY+JWudd*tIbGz=?Z3o8kmo%c=9RgcH zC$aSZ!bfG4m|O$4S$Sl4xujNnvMhyGg=VeC@IaCCA2w%gwWY@>8a_^vX37AJQ^8R0 zqc@8GLpH{r|0{-U-hK08lc zr!YP{L8CZ7B{eNQt8zkhW<)btOGzskdw8U&q)x`0DQN?wyuDi!Tx8yO{cvw2Vep6kkEK8V4CIs zPeFr1|Njb#F)?v{goJ%b|H`x_SJ(+puzv7jJD>2vK|;8n*}>_v4M}`_jFd)6WJZcY zX@-h?aE6v58v~iLlXGD<&GxC#O(!RA(hvtED(LV`^oHI1X9pG;8@V|8uEFa}6L5Pv z*(&3s%!NT#H^+E7tkqyjzMLYR9B8#!mk_FLEp;^uf>J|W8rUc6Y;D3kQ zeD)=upZ@b5HM!huI!V3fuL!spfW9Ln(mp)?KW#_y`J7ZKY{zs`5R?e}D#IL0PItM! zNmC;!`_d77giSA$UP%Wi6zMyZWrpYoDU_vXMFkXRhGzv-ge7T(DAYuWsAz>JDO5)Z zCuxSk{d9NWA`&PlD6Mbpf9?xOobH}1%=V}coZth6N@}Y4OTIgQlEt&MVc?WXJ9p%~ zqEtQcUgAlb^lkf>ysiz^?BF2#YfQ-Mfma(+JU-!`v%-^0Cp)_n3X7pOuog%osx(&U z|B&*?897S&c$!H`hL*CTlP}L66=pY2z=_r-0b{(A(^H^qT-o7?fMqFm#Yg>Qbw+(7w@dSrXohn{b1mBOw|R(@zf*=2ZA zLj8B%_{2MBNrxv?gn*smAI}CMJxe84GF)Dm*ixD~XN?Og2VB zzcL}CJU=f17DctT5g1Leq5^<*k))whsGy@%9G?Ns1Y-e#etN`>X2moj^)HwV;et5`>e?Nb1}krww_3e7#J0UHU^;BWtb$W_rQ$baRY&hYJiFcg}J$cBi~$YLSb!Y zIWeug?NV-ia<-67O5Veim`)*qzqk=Cx;ka%V>t1C55Wr01;fT>jfWyQ0=&Xt;WSoI z*J!rs-GT+oih@doi5+rv(RwS6X>8b5j0ns%;8J4HdWFfqmu-rl<0GcUY&H_#vkOv)XMA;A~TP{Sgp+lwq zW!ro{;h?N8P0Q3~dF}GGkcIULwj=H&a|{?^`!6>8{Qpm93uq%3OV>MalSK-& zh6|t+4_0*v6bbkL22`zSZ2JfW@v_yKCz%H`(Kl^+*K=}qzJYbwr$QLG0|1D;z!u#C zMR<5*1JVP`|Hc;p#byK5GvhTW5u5-e-4S3W<-$UOIoMm;xlkq*h@m9GBhxl56Nf`L zMbm>A*32MEonc3^{d-`2yyb{aDJ*JtQXe&hZSEMis)2L-Aam&iJ_-r>+~Kha_4wR0 z^+I;{ysQaRU;WJq^(5|AmiJSQhz>N04QixxWFm7UOQO`$qEeI#%Cd3f^8bq#4f;RY zpa!bRAZn^~nxhAw2Yd9MiLV`{=$0g0onI`V8f6K(NlD-fmS(m2RV9ZRX_-mMkZ?fO z|HF$zVS+~e7V_~%VR3HX>K3(!K>I(!s;P--=@_ za_M(`mA@+GU|g_Q0M(uS4@rksDjpoxs7lU}%7QCaGQGET%o)@Ie;TENhmY8IB6P$2O? z2NMBo|CZ+fjb#GWOVc%((XFBb8aEY+MF}MhgkvNHMMN~!N4^0=Jj1Uag9NI0WNR~~ zov*T#!XmemtwKZF#-8%!H*?C)DJMrHIX{A(nvgN7`>}(HYKL4cOUZ^<(a90~d;JnS z-Q%)(mQ6WjwL>Scy8P*Ygav4LXT5+yq#oHNYSRA^Vy4m>r(0S;zzN!3I8Y(nb4VUa zsA_Tkc@m7YNKm3`6yT}0p3CtV=b4`7AhaTC3J(kprs$MDD+~uk!j>k!rx&17@&mvI znJTQ+aJ*|NZgp^phv+*_!%un9L_QeUEdVo%7oC z{;h(hO{Fq0ce+IR`(y2A`t{A;o8)snXg8Thr#si}VQYK6J^JasqFx{s=j-IiFRI6d zLHs<$%)9*{FcKQ3W>R6@@evxL%HRUc4r4PD6rfXw_-nhaJ5@wpgnIG!8Rw&Duf^59 zU~~nwHLqI?UUbu@WBo77l|at!)rk5bFX*H~p_z$f%YH45WT#s&Xo$TekH<+Mks{RK z>7ckdq#z?S;vZ6?;6G?l`CWT0jLn^~LFa;INIKhB7~K9e{dwN$ zJ599ptbb|`_h`3oI{%Gta3i92p`LV%FO(Klrfx(WCWSmbbg&O4!Q<`DU6-z%c_l)@}%Js$E%i3p_~yd{SNH) zA(>!m!uefY@oUC>BfJrm+qRdPSD8hKmE;ZdNiG3IRy z=`UzCI}EgRDdNa2Y;6feqXqF}Q|9)f=mCF(&@j^Ldqehvfdcoa$H3zX_l&jTgz6oP zAXJWpAxah6y_5(X!Dzid+f5*Kj^^6rlltsqpHB{ADd2_o{}TEvEN(eQkEXV%P_fnr z>14ymCRB4DTN^sF{d;;BT@mtaaw0o8r?0GM}7QBXH{ zxNlrUHt^g7g7_4#S+b{S{E-PG4u#!36cZ4Jvt>7Ew3~IWuk<$DWOP+!WysPFC+_UG zrGe`c@*r>(Wk4aBg);+Lv|u9;RC?n;z!~v3p9p%OKFT{DR0<}A$z_ilAQ$z~-MWG8 za~5kOC_s4sd3(&SJ#_)YrBk*(MtUKdA8vik&{#8<#(8k|FN>Ra=ix2t{WuVk+kSI{&g6V zjUmO8cmLkt-bI1y>GS)(+9!EG&KJtXp^4W#uH5}~B07HU`(XUWr(V~8JphbA{Wrs9 zjX57wDTQU2999)*U7R1O#XhP0=1<8)kEVX@etA{&0!)m zN#XK~xmdYl58NoHhhg|>z+adQKfr)rzZ}O#_Uz?P| z#-JsgYOpkrou-|n$gtU@WZIZdaCeL>N>gzXHR2OY48LL+%XA6OmF_ zW^Mpu7sM5|fJ=@U>ly4OCS4v(e? z0kiPeC$S&6-akKw!$3kh|IJ;gY|N(f2q6LFad-nyfc^jT7#qOEZ$S)DQVdYN0SCA* zfvJtNDO4g0Nm3(+W)df-U6MRLcoIE6SdtwFW)d_fT~isSDsvO0Z8|2n9g@KXV6@i1 zq?IM?d)nrV?kJ~+8L+ApCh7(#2JrvDrv9I>>?H$7M;OPg zuZgf2%)yWAIYVyFyfD{?U!mLyZf|oSfX+&!hSMs*7*3CDTQzGNWmAmV^UkSru&&0> z6Loj%RX6rgj8t8WP5+u!8=JWyg~C`t8qx1t%Lne}l z?q3KiVGn=5msyWGg2ovRG`2(fLgyg`{H) z+fL1*iUQ@Cf$A>hSU(WmdDz5$WDVXXiXj?MzpdHcfkShxs{@s&4aFsd__ry0wJi{n zT8}IkBF2~3F1{eINr^>38q8P06*sXmEv6tCc5FUd+ZBdG5BS>^GNBv&1c=qI$?Czb zG`FH)f5{{w)Ubzf%Q5ZC6(J0-a(1e5ng~OP*4Ddv)JnBx&^mzI|BPQdN0hTsfRzRz z38E$pZu6Gy_w?+ZC>K&1UFGm;xXybtqR3q_t6_HHz-=DQ?>WE&N>oX8nGDm2gYnL; zLg-&#hE?~PYMgIEt$qZ)M=IXZZ2}sVte_6e^>)*k%1v8DX0a>HzQU;VEBF~2YLrnV zb|V`J)%WEI-g)}Dm(gv=;AFyw1k$maOPsMpUb3J%{DE)GAB9AMoo>aVUWh;*X#il& zJlrjm5~JpY6Ygoj&})Gm;BQry3G%sG$0K7!LhNmrW8}aTmsJbTC##84!Ty3H*J&u} zkBhxxX`}FP%)vhTj1?-a>qYC(4fGdw96x>V29Xol@h|WG?9faEt3au&A@AiN94@f% zMVf+Em+jEfz6A-a0S?<=?5~Vf2x7w@7Nqv!C=ZLW!Q8@{rc;lsCLp9`DStxln2#pF zEcg}>Y#gM~z_$tP8`Oq^?7CAwD#l#EUmzw)uEVQmu1Khyf)BG}o*8DX+1kgfOG73X z{sIbfBjRyN9zj8#wM(Qj;CJ}#C`3U+2j;)wZHG;TQ!}k6vBW(FuC75T-Y--fbm4j= z^d;d2y1xv1R^U^rAq6O~E{581QtOXM$d+w@BqI5kIS-6UkiE;#$Dqny2Pj&fKV}Ko ztF|{YHc*JJ@rVW`+>?_S#W5w|$Oaw9Dyqh!IElQQSV7^U08O)H(D)YFM5- z+n@EQ1rvX_?`8-o#$Oo_a}2S`S(AvRnN(|wGmQ7y8DbE*2TBunn# z<;f=KkWeq;I6ShYAn6d@(Lms*{Q<{!qtcgC~28^?4r6?2N5FQJUC z+h~?{`fNwIwy(n<(U)~v>nq6Dhe%~IeAlU`WR(UidyCVlWH+{ z9JikkvSn7H5+>(nV<}$oI7AL!jvtAWN;Cl}7*GSEr#Bh6gs#y7oppycP5y94lR6XL zI9M{!-@?O$A2Nb9TF)Q%eCOO6J~NBqQ0aB}v!H^NcdoGn0w{PPl=NfS-~o zD|4cGAD~~a?^JLAs47SF3;$PY>1hY(QRx^YiuH_Dv`Mv9h}*H`1oK`5M1{6m$mdJW z;ZR#@kAzRa9V%P1vPQ-8Go48`mr75csca1XAc)i?ZbYIv>zH(xgq_@x!+zSO$jg(C zmbWqBF9eH-w+D9kKJJ~Mhdb0Y{T4JjU{^P+(+5H}?hI`abn*?BmvYs4J{-tcDr|F- zdMdP`tEPM_eQDgd=bM6p!whvBFd=*T%UMB*lR)kt$DELKX}N>85phW6#o$sq#frR!0VC-}fmRaw*`{WW}nYMD8d!OZf&DCCS zzUphX@v&^zQD_=jEEEDmkyTD}(w$XE@O?KiGeMCI%zHpHS(jP}u ze^a9n85V53D%F7}<~{|MgS-{HSzUmt^X^gNWT0}4FCuCkUBUHX%UcK+SAJ4j$oDDj zA65xMsmigWB}k!g>&)pi=c(MHr5+X^qTZT)5ymxFahsk1CFG`IJ-L=8)OA*L*SJKe9fO z---!7-g9ulU|qsiJL&zh@d`fl_=2c&0D)Y$M0B+okLavcn{KdlK(ONf?$u#8J_RW$ zrw)cCEZp2yLB^6b^mW_Uf0^0eb1{M0HGi$=CNE$TpT}s}uNoSK)QEW66Dv;p@txkN z&B_QrvC||PBPz`l`NDHjXAIBv%%?#@etJtdhav7~-P6uO^(#D`^j*kHZN^NhBWL(CmU+*!5ZD%Bt#Xu@atyP+X;Z>ZlTS@~KtPAD8zw_LuN|L$#C?U)YB34NYD&*9dko|Uh@uS9c?FV)_OHP( zWLf^&l){>0kas~r$oEdYp-4^H{)|7>nmk@Qxus4Jv5H-VHe_Z({nbhOwqgl^j#OG= zqDHYn&HnoKJrE8Q(yd{aFPB6B0f?Q%Aw41sw(-bTRs7$tX{K!auIv#SC3Gz<)1fS~ znbB{;$fgmIWJ1>VstR89jJPugKfzZbvTD`^`Og=p1t4F5h;gVV8q1aFaW8w4163Z0 zdOQ)cWP*pL>7KW~x8A$#`WuU*nNJUxfiwN{^|j;dm7$W3k*ct1ICY$%GY(7@{iQA} zD`AL0K~rS|f>aud>H5^?P|YQf9^}U#AsI6A9Q~(2d0_7Y1+0*kUqxCGgAF2Jt;F{^ zjyUpBvk%8ywE9a0Iqi@a?RXbF_%L;YSqABT_`6~e%u7wAJQ1*)rh!e3?cf}+E5axl zV@kV$^WAOGL?lQkwM^=gjMM0`!6fyi5Inh^z3l6<7FcXKuW{03EsOyfTSKuTGx!2b zGN2O zM}MH#R=51;W@tpTisG$26?YfqWy9YN@Xf^ys#@Ucx=CofIo~c~`t9rbquL4sw%ZRh zSd*BB8txMfdm2nO8|L;EGPbD2|Tk&bCuvWvo5){cIp40>wQTX zX_Z9^nd;dYxoMe&3Ob1zDuKiDGtvwD2Rb%6H4p%IAXxM_{(wR99@(y{|2K2kuq(43 z8$H{I1={VbvF^fiGxoRciZb47W$J9G!8M+(quFdf2OD6%GUX!`KUnzgimN7nj3l`=V+_ zq!@cHM_LpCGt|z);-Nt6qoP@ZByv}DuM1(D8DwYj5%)yjmHKP>2ux)v7t~_|3$sO6 zSJz4qg)3fg-ob*+BeIjaKM`sp3Ag#Ry+=u(__!StM`?xd#|_>KJRVpSSqIGeP|iks z-Ch9+)vxC~R4HcWo?FM!F8E2g6gpbDrVzBINw|c9_#DJno1BSgU>g{fZZ;x51ZM=SqkLEUsOGB|G4@OGcr=I0%TEmOJt8 zoh?R6MQ2kJ{vs#p0ZeWfRrPgboQ7_vC=~cMsIooBpRX zWzF<7isIHrOUEBgVez4HvQGp~xN8YQcq^{8jbP3u7+K(ZC_x$LnHi!eJuC-BwT=dg zH-lX&5|zcrfn0Q3I%2+6#=1 zccg3y21b12rL8AIH%BnY@f?W0&5#Fzt4tsD8a0&Tb`^%$_w9&ejTpk!kVP3e+7MyuESyYqox`(c z5F&=9Ji{BJURwtO?bll-UV&#w8sz$PYGOhjjyOkuYf?K-~X~55S zxqdyh0uDkkkrf1MKwSQm>>6L#dlvlwbKqJ}E(It@6SsxxU#yuxA$x89>ptS`fl1@j z=04c_?tO|;-f_Xb2!;k$N$vA!rLBA2au#Qmqwe8=ZZaADzD7v;cS|dC_WIj zyr6E0X!rcnc||mVt>GJZBv;%<1gh}ngJ4z}e*9k*8yeBvc+A%1x6K$?5oE~a;P+j4JvE=`M}nf8dqA-k|N3M8EX&vbjq{pLOpi+Bc}9!5 zUupLo=}qq_ORIDMrz~(*7m$N?9@&?CGtCDiOQGC=Ss_5?jCOjs$+L{_l25i|uptvl z3#HLeN!UT8WauK7a11#6t$DM6 zjRucT!Sr+h%m{2&hd}-q9@*NCiRZVFrLg!g9#Tw9QLfiaQOMF#ROIp~sp&K}79Aaf z^Z6J6m@{x}9qk|<+1Fay%9|2se_H>D4y^>j4EA3lBodLR7Nqv8Nie~8X;TrlIhvbH zRHec+Vg7t(OS@OOHU!A(wOV-sbkUd1J#&}IJGY~U^A?;kO&ypjS#e4l?lD086h5$2 zl__;Es#ZL7O?s?-NQo2CI>AnzN>aWsrA$Gr+#}S;MU4h2i53$mp>rmNUgX_ERv+QLtgBvM;^d#I!dQ=0u>r^FDv*g%q|tpQ8(01yT_#<1y>VBftP1b z-jX|t{1U|3Z*DT2YtV>{*9-^Y9FH|b$hKs0V6e0l6+eX9X$P(rH<55IHa4YVRsOMtp12QEGqKLSqtD* zq)mN;rTJy0RCUUdL>#l!9i*JHl0(BQIK5wOt(9=dBp@eNbAc0xS8qa?jSN=%O#t=9 zivo7UiMZ}t*+fJxI_}k>631}T5>EuLldSWR2>yx->(Je4VviNbC8RUt%l)fqR#;#N z@C@RuAvtFXUM^bBStuZ8S{!X&l3bAEAtDU2P2v4T=;6c1frWpwhXvgP8ExRCN-=MC zcpD4m(M|}Ihm%6*CW>cqtq9_hK8~a-I#@GNk{#Gu_7HHl5;OF$46n~bBHsJ#1CL|K zO~dy9{%E8*@)J!C@gVs4WD8*@zar$X6gu|Ji08?#ju1jv^`5d2GJr!54?Gl;*cDpOc6J%Zhy6qJk`VB1 zITl`QR$}a1SLrf4YQFYXNQ%KQG2a1V!mKo23nq|Gnhw+7*n$!<`tC&-07FbrNO@AA zew0!khA6%KBKL;Eq_cO?z>5lV)kx7^xn?%nI#QTE$v%Ua4HRDXcCs2ZcZ!ddRbTG{ zbz_thFDlksJoX~<0zAFag}UaA-t?iO3T3m1GcE%2l8^&1&hvdLdBVtsZk;X7OV|bZPdS+7OyDC9Akt~7_Z&Rg)sn3i7~b$$PC5#l16zZJ)0xZ^6NWGfjeu_!U8yjrz&K3duo(*Fv%A|? z)?95@GzKe7CVc5q3Rc*HUY(#2im2?!WY5FY8G`UNBg0-BNzO@bsvJ#GfQ=W*%kW&% zdX8g$WoXU2QSH6xsejg+h0}i6GHSmKcvuGcWN65 zM!2vfquoNkW*)G9a2r$I%`;x%CQKCwYL%(tba5!(hUVJdYUBz>wUo?|%LcyS`uGDk z4i>G;J|U%)dJF_%MI(jlnSd|g8X<5(LiXTrNOec2fLgK*yhseF2UjBLywApcgQ}Bj zUsB$ZE$4AHe-hKSx|()>DzCqD7}GG;Ub22aqP8#XC!gu4&9J1Oq!UxGA0yfhsgOpB zCK0B#Ak%##!%DCL;u6i_%lZ`I`0lHGR_W+ zxljxFjYIH%?8FCff6MHpl>3P~6%EAUe~g zNF=`Fn#THkT#Hy4nQ9Q$TCtUb&#`(+eI}NIPJzeb2kDi-Au6Whak=$gMsFN`@k;gS zW8wTF#E$~3xMWgQnBB9r6YI4NQtR=gnI*mH?cs4A*}^sVWo)QWp=+L*p%ye76qrv2 zQhz&9r-PmXe28(;ZBZ}SO7g5OD~!Vi(g4bcFy^vyP=n#4mT-$to7}UBe&0Z|tFG5* zWFh6N)-$$>-QVtVS#8O#KiFftm&$fzig^V~{Kl7ERL@!Zaqm5wZqTsivivvNW$5f) zW^uAUK}6%vHhOBhV7#)*3IQj4`q{dzuI>Y(_ImVo18Mm-t^HyW9#uCtB)zPpo=qeI z_(er5bLCd*Q6TOY5$%-2In$<=Q_47~0(DzUX$aV8A9&}qurfBb*U0u(|cRGq|-G99_%C)Y57|y{YVuyrAx$;42ck=Ll1%m zC~L5hg_vT5lF=p_5V!hU3r(l9dGP3<4*cyicnRiJ?%)jNuAt)(IZp=NFOyr5y8sCXx0(qCi<` zY(b2%d)oF(B|}|(Bapmjgrpd(JF}%gwB|Gf#Y<02cXBg_97t|sgyP|UqOqaB)fyK6KM>q1A3QsDXW=;JJB@>Q(D+m8)l}99AgCy7Nvk zDOrm32wTn7W`wAw_`$U8?arZwn8uLzi&<}SdIqV@WkGQ$OAI&#pZ!J*-K{Ef(72uAyY#5VGneE2dcOn z0=O{A3#uz8C5&~DkRHA?+rF$yMq^j@DaUXFu4Xh$17 zw;8QhbkU-Hr}m@2fF_{(JSS)=|1yh97yZL-Ln3Rkvffl74I@P}BPF>?As-(zJxMD? zBPU5S&C0-3K6G+(v&=v-Cpj}mF&{@UD>*qIA1^D&Myi~baYZHUL!f3+Y`6% z>c|UEnJ^xhWfIAmNf}96Ng2iFzsb_Vtc{hzn<@50E=N7G2o?7w{w zVChxBYLKec`StIO61>cHNqv3tJ`xJ$Re?1%gGcU(kxAx~B=WT>G$IN6nb`zXt?zwD zif{n&A=E!dpn(Mc@}@(c5z8Twm6=qV1)#xyc4rgh7o=n;6;#yN&Wvz+Mx^f_Q5zv8 z=|^SAq#~zf*ihCoaf<1PMmJHk6gN}I14^Wjo@fZOtk~TkryT+TJP)D&u?h70ui&kN zW<#P&GwD_%O8~+^5FeW$#Q!~S$}sIgH8OE34Mr-N-0FE?l4DeF!0rPw`x6My z|9A#34>BCAA4JtABJ5pI{}rz6g7W|Q1ZkA!W|V#z*;*^Q*$8YAa&RUo24_brS-mL> zhIjO$2#0@x8>(L(7Z+Gq6NoksAWJtp(J7;3rDZVme-hD2CgmySfbQ(+ZWUZmU|i6a z!sUa-Y@~ky>ogsg4(Q-TS!?4D^{=HISRSl9Bso3`i^-w^;A?_79s&9j{wLQQX(3Fs zbi!O3o{*aM%_7!dV*~<_HUayv`={0(X^HX`S~dYj8;ij{$^fJQ1-U%>kB;%5BJ2Mu zBCyFAsBGK}uFQb|Z2mcZbEY@dcL;rSMn;Ak6Od2=B*vcYKk1(^(|^(l8JWSP zrF3CHh8a-deTa$_n18yF<|xa+bcx*v7SU5zefwFu^!R7y7keMAyX5K!t;@u%)9$45 zmE4wYk+;>3X&^gU?_FEoP%tnvGBT)oOHxjq&8B*C`+XjOxCBRpQ+unqq5RIECqNrMY-e*O_`f7y`_dk}1MwH<8#VY=*hVk`?puXm z^}vPilqh=+&IsQN6o{r=SIVeI%PviaTgc(p+dMSxnD5DMyCZa|L@5e1?YTE;5$Ac}(vw3zn~jno{-Jx0n^i zK#N%l1$BX_AqzA1Ks1#m9iHf{k}3urv|>X_C5Cz0Ds*YciW2J50>sL%SS^%BEa`&M zgxM1;PmtyI7(=(jBNy@&w=GjeX;zm11OB!6_*nBS(Px^%#7m#tf9AdC9>(E9v%-wgWemHck3SUVe)dRC=eOcPnAh!0D|jSqWW*qHYA|)Da@OmMml+V9%mMvUH5oKhTLqkfww?xezrK#V z-;>mS$tWIl>)a-sXUJI^ssz~S&aS=>(oEN~Rv@&%1<>ig+_uAR@a}1=ZRH6Ix3+(= z>_945-uExcMr55bzC2t#d9h|j{Wy=og)`L*qq07$UhPlP)bGxUD*yp8=F^*El;CYt z(J3w4R|x*7sRO{F{OvrF2mJ#$;-nT%4owS0Y+OePVOqE5mP<&9j1oru^C%T8nk^Z%HHipKqJV84?h(dCTGEv-WfMI|PYiA#r zpr&<`_S~6x30AJ5lYq;77S{0xQ+ov|l`0TeW?eg=(^dt1ST)BS;8nXpmrELf)Ecg9 zR7%aDGMN~gB$AwiaHx`Kmr(-CNf&^y<^pPkgS9k+Xb?2;@4TU}v zR3ni84U|>DOq?ZLq*JWHMx(9!ms;#a$zM|xXCu=T2uS)m7j-EfIx9TX zU&&Hy6QemnJ3_|+8+)Yoo?inArq_9~9GsGDw$2zf0AC#wYXu+8q+EF3_C zFy%tzH$y5lIK1N*5@ECGdi*Fwbc%0& zvLhAWt0PU|mF(5Qo1kB5n{+Op&YCF7kirSZccB9tVz>XD>lF)`1<;A&M71d1671Z*+~O5k zbrKbHFIw+S83aIzg+wUmp(dH+HXF{bru5UOPR(lVB7qbkfsR58C*PjhIh*vnmOfO( zYe!lc8>SvptKn3I&RMuAq9@n2z;XE6yuw9**}y(qYg7CiCc)A$N{TBl3BkOnEr#y?2xHU0DWJg)Ev~DXiXuL z@8(rmj5y#3pE)S^NgwnLW)!!`V;Ak&QVSW02RNkCl17n0?I;};zEG9~g>MfihlqZG zMsY%=!^YC4-)$Gcg|?^HH3-o6^D@Qi8Op~g=pQ0tS{MybQxaH*v5VK3-OncOpgjV3 z!?E_hD~$}kc?ou2k#jE^j%Na6+R!Ys@Z_7KrTJ*}ml zPY&h0+9;w~ltorO260L$%e7CMURdpb|5LAL(<+mya6gitALz16~kV(7+e(KSGs z3S|AQ6KGcR+gU@kTCdPOHjD#_pidOXtzW4ObgXUIhCW{E(#kLZ?j~5ZBtQv=xP&JdO$L-RmkNuvRW3N=a38Vq<5?`}Y zgJfOdxP&rQ?9VQt7)1bm!^ULEb0i9PlsdpCMLvoPvz+1qM+Y)P87xY3AhhpG@bO)Z zn%2Q*J2k`nIRbR`uIYEv$b7y9s$I2zNEek99)>n^X^NECKDY1IF@97pLzl+(UGNTA zh(~&a5EF)yV@rHJ?9RtdB>BZ>-9)S+c*iFQl^LJCR}GkCDS2n8UxYs2RAerq=0q-; zx4}wyFmQ=pUVSUX9i2&-U7tcKnomPyiuWlfL)NRu#i_64*$)e_gya?0WFCK^vfW@T zcz9iS($b<7Pm~{)((jFm@aa1*JHrT^XxI&km|sXV{nu<3rPXl&*RF81L5_*3#(BP# zH$kY0AdOpGHRWz`-c2DKj3~4vHqI%K#HykM@;vUE`EJi_f6dqDx+i0~#Uig;A%dy; zgTmZvPs}P{amy@Vp7yG2c>~I-RX!d|u`_yT(Ov+thpwc2=J8uLiX0!lH9QjZN(rhf z*XD|^_4$cxXC~GJJHGbZU4ZSkWdD4zRgo48u>`Lcl>9k!akTRMWcAV-LZiGLiYo0+ zmSEY<#YxlUas5s86@1%~8U|hwctpexWpS7q=xP(OUB7E}R3y_N>S?%y^HzFKEzI?7 zY1j@f_WI^e_7|leH3d;m=6O6!r7fUhFr(AY&5ParX2{fE3^G}!&~yT#srZd;PJirf z6#rHrdkKp((M(}}{FZ&D;oqqUE zS~+34Xb-!;K*G_T-ee7sTFOr2gxD^A<(>dsw#4ppSe_ifHsJ)W ze$k9EyTeSlffa;@?@R7|4y#tPUCW6#TJIcjmUjr*8mowv3eDotB-VyVT}noR4_}4m zNpPWmh$Cfc#fs!aar|h9mmv3etQ14*?9o=$HR3m_P-lQq@!AFcilszQA$2-BJ5sFL zsI;ARX_Un06A=MS5Jbpiief1skd*= zt1=IprLIvkJpG|hk?cdcwwj4AfB>8D8Z`1-Bj&;V^dF zN%eqCco{Vic?3N=ONGO4^9)RH%sX9i1GHlx+7u=W(*LyGB0HSD0P`8awad;Q9H`mf zr`>_Hwr_{8j>5?q?|zQ>j)rkwtVhC!NViJIg{W46xo_6bBZr6xet!@-`X{Aw5}5hm!jrD!T#4L8B1$lSnH zzVb!q(y*WXOKvBw(aGEkyWH>gn#KVuy3SEKuGaxg+%D0EhRqQSod!B~y#b@AnhIo5 zt|#bKq=RmEviFl)c2b)(khtXAt{td^jN@2n+>|0*%zJKfixf6LbWCMp%zvD_yB2eD zl%Njo^Op=jt_0!B(kak)dFX6tnXBKXEg9_5oC5Q;bRGjUlnLc8IvXqQmMAdU1yCJI zM74gN3DCvBA&Ay1NvKEsIzCAuo~Uak!^`YjKHF8*A&HKyOS=YlgjAK1Gz$V{9-OCB zJ;+<)+uFq9w4lS(kqg>^V2Y-05mVS-h^j6Y7aMcbSK-YqoYF`EmuM^D_^%6t091%P zgXcMeSCTRxvh7?W`6?WLf*<-o_c}t}HT5ywSs+9E&Z-N3?_Ms~Kk&vA$M^W;xk*I% zSlb}9uZ-su9RWzmZ~oOU1k=nN7+c`ndR%a=3&2NLW*g^$E^YgKX>qwFPM}3Dors%B z*TJqmON$CERm%fhwM#wweI`$~vh;kbw_8WRR9FT9KX^nDwkHXxbv0x-U3Gcqh$&@m zlCaD0$gZ0_Zx$0#&lM`$cXC{KR4`meab~Z8LI=i@cM!1W3<0?{L?XCA%K2q9vnutwc(O@%olt_Et=o&&P6M; zyks!3gAbe?o$riaz-ilfO<}<~ex}V?a>g&dm*XILKhVe3;JBBJS%MzfF^W@CLjouz zE#)!gWUg%J^;cB9H2{G`2kxB({HISv^oQ&j1l<%*e|XpDYc2Hj17E3Rx7P7J)3Y$yYh z%`^yo=6GnN!{s5IdRs>2TL4$EHYFx2#-z2@SwTDW%C&^1pmwWrC8hir6`>TZN{^_T zkFk5FtJvM;aKT!C4n5Xn4(??+xu?hNL_Ho_D<}}KC^~jw2?y zdz=|Jki_W=l;0m`p8{yF9jYK1C>ej+jC@QM^rcEdKO&+&&XV=>CgLo)2DhAYbVyKf zg$z_E^Y|Zwfcwb`38retMtuJm-pG$P^OKb!xhvLjM^dyfB;bPGExq)_ZKLmy%9 z&r#1i&>mW==%sv|zgRHkmi_*HI!)6L8*wrmp0mLl8J?2T>aMW^_clXNR59gbWaOkC zU2O!iz4ikja7LN90L}gH>yuJF%TK#bg!GlE&%fhY8p zTwNmeHl~`@Jvuqs2>IDLYRMXk44ra1&i8Ied~OL{J)@f=0NaHLvWim5O=mJ6-T%_MudDDBXakTxS-D`O1xH*aFmL>S10CL>(2P3x&hc1JvmEm?gXuRfS2W9^&LUQSQ z`{}!T`}*zK@p%Y*`G?+JOjkfO8U3wy#JG^gI_j^I>T+r_sOYy|!FU0kh!Sgqk|H%q z=2alt6zaLhGqDc_)fUIs!1Yy08u49xmeJ_y9eUcYlu~h}N@9tqWJcL6rG)c62y1B< zg{W(+7qmmhlpfWT75NwT4-u2il)c3t;LX+(Cxm2pm zLaIW4Cu0dm$ss2h5uIRPVS6K%RA}(jNmWVJ!1<(3^Yc@i=sPRrzN2Lgt?lP|FNg=& zIjh9lr$`R^+>OL9%GDt@<{`>X}H>j8kXh5u=8hmz|3s z>I~j_{Ft^^U(X_QbI>HzZ86L#Le2Cmzhz_2J9j@r_x^J1VJF;}l{Py;F1AIw5d-ai zX0g~NbzWy8L>zzEP7Mh8d!=L8!M5qc(TOT(#E4r&`*QvuV|L@l4qX>C3C1M!0AC9c zO~&NM;NwOdX$&t`6wX2kh1zW@$U_FfP-B9<_?ooC-RpSccI6>)L=I#v>jaLtfW=y3 z)*y^r-Sw(yn9VwMiu}PvL&H#V%jq-)>ou^|-L`%<(7RlL5i(R-XO(Ro^1pq)dsEm` zO*O$pyrNZ>473h^K$M8f4qg87J7?QCU${i{;E!};U(aSTt}6kyJa$8 zb0k+b85_BRO#Pwyq#LaDi~a4d{R|NSp<6n?$&?7>M8w{BaGQr(LR3I_ejIMQMn|3_ zx+ClYzA<$dQLNYOh0i^Dd2tC`acb&Pn7XH3DtKPn9vt|(ZKx0W!`i*^b3Ffur#8HZ z7#CEvHllad)hfYgm=lWEE${IcYNsZ=-{;HV{45!o^%cd+&q^u^=fO?iJY6W&)zY# zo*5B=c2XK5!v2=8nEnZ`Z#jBr6DIes=TrCSH4yF|J@LiDe*>iY0;Agl3N!srzNXbq zsAv4Z2U|PAFB3w($}B1O(h{HBEwAkPh#w>S1#r*~%W()8`rjAUbWaxF!IT(!_A?nZ zMzpQ1a`S#L0P|glW}8sf|J0ns&O@RFGj+kS)Ib2#)L>%gV4<@AyN|;d7`myUEYCc= ztSHXBzAUc`4&A&ytSV04$06J}+`7AuJrf`v6F`M+Jy+Aq38#szsj6?jsAB4?T> z$($)mws+d5|K{otp2^CYQyOLWL|teM70}ukKYJhCAJ-$BJF}PCSvcw5gj$#IX1H9hGwW9b3OS(zNX5(0V{y(F-hA(^36_9vfwL_0AfH7FjMB@u~g zhI&?JPFhxRe41L30&GIQme~y)AoQC``w-ChUo}!XNS%k&4<~ZTkdnwP?qyQhGhhL9 z%ptI^K>v07n~9v<)`O_1|F2;s>tNF8J8?2_*{BDGn=aTv&~tJW8ahTbQaVy9Ng4$T zDJp788KwFEEGtAYD>*wI94;wKA4o?jN0EVJNy^MJ{~K4bL5N2$fDHb1l{u`e&OjAT+4rorK?(OH$mRfe zkRT;ife8N-GP@436-koK0uVHUQriWR{wHi;cNGp^IHDAjN|MP2WWff5IYtQN`%mM@ zX&RIYQZ#tvDb$#iCi!Kec&OqJ;7d!34La97oj5(5{ogMw(_cIxN5k1T;a5k#ja*I! zq_Gnd6(b{16Yrj+qVJsJQW(cB8Uj*e*yA07%V^~2rfA6&#i^tx$%W}0o`Km=l{0o3 zo@-a2R6P{nE$f{8^t8;lqDYm)!g|<+!}QBz;sqov6zCROl2(yG^TSB>i8H(p=D}q0 zj7pg%2QUD@bJA$m{)`^kUD=Cijf5Kx4?sgR07O!tzV@*`{{mgPxzQqsA33S-^#q|5 z+YErY6ZGZ~C=TsE6-%FkFm@8c|93=I^<~W-Im;|&;im7V0|BfDL+{wciTwwEsxT17 zUNQqeVJ`)sVg#Mv1B}!CpPbR}e{wU}r3rf4Y(OCoa6oGukL=HMKW_V=;P)fflUV># zO;D3lAjbcseWdmQWKE^4t4AV$`xBFyVPx`u5wfNWN*FYkbxfMdRy=bjE~j$<(ZOKt zZ$VA|cMHA!5G5d*96@@wqPUY&PW%;#V9Ug3NjupX^u5dueKCt?Ai~rUgdl1?Mjr^g zwWE`w*}%zqV8y|7=88@dGH5V4wKZNQkE*Z@Q&{StiK27DOs>|cCs`e{I~c(JJYMP< zpyj_QGW>IQPz=3nS}XFiiV1DEZc5Dm;t0#Jp4 zPVE75|0i~(H2$AhknMOvs&p2Bml|~M5LWF!6)V4I5D2nXoEBv;AH&ByOgPRPpuMxg+QkYo^CklnJV?d?apKRX9>`ZV@dU;>y}i%_4k1|a=s zd<(Vdkeyhs2f4bte4odu2fDgBe#k@}rYk$XnbYB>4oUhHd&hu;%cK1}*vf=#C7oGz zHWY$FYF8bErW)k}Nl+B95p^3@q5l9xp zx`Hmoteaxoad0Cc6P<&e(;q#@2q7miql7>;Nh{F^ICOHgj=#N|RBlk*ApzsJpp zk^g6nQ;G^&=@2?n2|Ds2NjWO&P#F=64BDE;y-t zRcQ*diAfn!dQu%6d`O$S1Hm<&333dSlnw&gaquV~=zt-}CF0A*&^qG-cgpYgC17=} zXsaBRYbPQUm00Mhhao~V40RnT<>eH8eG%nf$*B1%I9kdU^5ds34`4E1tw#7K7j7Eo zQVB3+Q86JcovsIVpL0vgz|wQgU|VQ)bPu62N!e3DrpFlE8}k}57##Le&Kq1&&+&Zo z9~_I88yfCde?vmNIpr*`h$k+jYe+j+qRS9uVh?HN6jfj}3}2iPcm_ z;E@bgAQQ1XGZvvq8>qnP%m9x{!vcm|zRFz%z9#|2>uhfti=f!Y%}__f47jVSQ~)0$ zl-eQiJ^#yREDryCCWA$OR}3d>%AlNqXSE9f$Yq4--bDzadCocKBpyK@BNRc4mi2~F z`};10gMgujuJ=E-8l>5o0H;jiK6uXboK`L_YMGSCSC|s#tt)FHGdM_D%+B?Eh?A!x zri=-NEYBSf+6G{t4y(1(JV;^tx0A_Dlg;@dKz}BwNG184QqUMd7XSJpUWui=iJpYv zqsoh^l`?oV#4m1on-mOGZn|qYqkUl~A5&JyyzlxB1JK4$h*|^sbAYToo}0x&=-tNl zQdD(w2If8&6A&QD15I`e=CAhhDTBlBPtB&uBCSqkvr32t6f)z|6Y{!xIDTkOMutZ^ zIc02<%#6TYeM|!+O(Xg5f`Ot!Mk+gxuTVhmrjTW4f)xw<96LI{zT>BgpPL*wH5p^( zc!o=hpXt860=&UQpxy(5B2WhY3Qpr%_O_{4c}i45%x6hi-<+-%kG4@HGC;;4ocj(K zC1r=<7;RJZ&BQWh3Ad9CE6tNU&^Uk-Wd#SfT ze?t8OJAr&?|BIY&?nQdn$Yh_2fE1C_xs;9_AlL-iU>(LE{pBx-P5%#nxj~wlnXMMD zsqk7aD^(*GxQUiRA>A;=vKAbUiAj>YBU3SpP-TB{>7epmv7eguouth0blo;sx<)1n zl9GDvr(jCJ40d)h*u-#hnp!TvxNX)265yuAYGUQj4pJNr50j(N`_WBg9WlV0ehBL| zu%ZEO_e>xWVEHK*G8eLn6Nt8yyE2_qP3A##c!a!Rup3H9IrgDe7N`t_&PJj+0fO?J zR(ErlOD8kR(-xJFh^A`a0W}OoX>*O#YWzpF>s}Q;Ea3M#gylU1s%Pl0SeL*6hc|K~ z0sVDLsNhJaEu)cNjTqKM^h&~k$P^?P1t|>o@mgkF67}5Q*VRRKxH@928uNJ{ z^UH5!)3^7NcPaB|O%H|aLawtl5MX>3f8d6eG{O-LwDWd!hx>vOI_ z6x{jz(L@ktLa|rr=|~wjZt~%YRxNAy{%sRSN__?vAVAQ;#6iN6HmEz$U$VDfqhxYS zRMfs(hqLap_fy)ymGmG0V;lR;DpYwt9i9p*Fsmk!d(AxwUxGzgyw zFnan9eg_sSgtn;lUM6-2p&-7vGKf?oX*s8^fG$og3CGsNjn)W&2Z&xmbgmvm9+%(B z|F%yh6XboAKnKLst$-ayM6dub`(7e1-FH=@eR6~|VW6jHWo9O{u`_nDHla1J0o>AE zT#@A@5Hyo7S*5?mmhT-c?D_+;ceHRda5kYe2V_6->qCxC(JHG%^8VWB9x?yfMD{9C zxO5LZKkE4%ZXAGKkgVUqt8js6EO1Nv;943by%~9ghv^$RjudNa&*GqIyHO6+{*=7t z^V}E_<@ah1PIpdC&;+_3YT}G+LHWCY3ak<50E^Bd_Tm}(q@SLwLCPaIcP^u3`%moF z$=EnpscESco7+W++xh#X+l*MciF=vIO^4HGCbP%=KbBJTQMq{`OFn<1sHLtZQ2`lZ zdgsKE_QK-!zG{V=MA$5~QCe;j6d;|S%={1-@LbQ0TxM7ZapsAKLq;(4blHCpcKI)nrz(TOjNX)kL^6Deq(1Oo;)f?Zp5zOr*<%U_|8DWoDRe&gk{ETzZJ z_IZKnegRqL_3OES_5#04+wX5-t?~N84wtZObdd7+v}?pvMMc2SL<17$ur$Ixd}$%+ zq-Y>!BgtD{6PxVNn(gbfWWBx7X7Wp7*2yY8;JUmKuuxT%s^wEL6|vDxeK7cbAS3LQ zBawbduy!{t*ABnCQbUQ`xj*f+@$jo6#Y1I=o6-VDg(N%G5buH4vz~i)d4sP1t+`v3 zHWCLA$cAKP>(8!6utn}v3#e$K=#e!7$^j=S_vgPM2sTgdY_xhL` zq3+!ZX?$t9?w&p#IVTbK`olXBw;HN`KbJEpC1qnr(Re(eG61LsJwlxGL0t*h;8?9J z+qDDa5@89^8=_tM7hDa+ef+WetRhabGM5alRYD2IcDINmV`F@XY_tNZ#wR*p+Obs9 z2el-=j4rqB6ZZ=CK8&9cJOkQGV|tIDswF69y6i6f$Hx|xYx>OD;fcjNHr$zUatKL~ zo9sT9>`{Mve6~7^=FvP1u+mZ z@Qmh3Mr4t2tN=wg6avD=9MTST%uDD=itwb7R+zT#(;Os0d|TNzK07qeeb2cf_QoTP z-<}ZtDEBA#h=2r_*U)zHOQTnA@7m5hT>AsVuZ<=5HwEG#$X1oVSlr4w_ZyfP?1zw* z%5_?@cemA_oyNvhmR?SqnUKWAfVJyq9W3ase`li#+2%K_3%oWa#mBzu@Z|YCpgk@2 z1%V7zvPpe}e?Z0ryu>s2mC~NUt#cokS1XO8ka~<=YJJkhZq_eE8AFp>{vb4s@dXc4 z!omlBf}7B+6zgBs{NBoBa`aPl`G;q$#3t|DsJC$;%nOD5nQbaysK(DNzy!$MQh9uO zNFiXYv5mypE?48fWMjVy<2M9rZ}a|+K%~S#f#l#-(XozN*ErPiX^I1<@;l6(_h;;w z%w{IS+_yzmX1JipAz*UoNdd3%AfrSJ9W=RPk38!a+3L%>2rm&(#6$r_!H?5`htvSD z`GST9Z<*(ZkddMxX78W#e)KH1Q;1w2MHU68w;TK9ezWDo_g3spxpcpaJ@7_M+@urw zYHhg9>bvGC&+wLc0m6N)H8&j54>9CT$5Lza73XTK!fvBE>yH*|RJ*icM^(r>;Y=5? z8@(isY%n@DpGt`-t>s@QA05xB5--3OG>hFq^^|7ftd8ginqj0Rj@GT|1&+llkt*#e zsFE67ao?)sHY@HLNVVqjjm@NBR8rxy@&rrg>t_^uTuF1^DXE6y8xlxr$zwbTT`!TIoh~J#q4|YAYngzeTb(f1@edU~MKnJE zp~um}Oce)2C{1NP!ueV|VY{?RU!dF?B1l|52|o(IcYkx@Rq#F}ZHN))6`jmp;8z+8?-aIRBGE?j z1i0|m&=SU7o3oRLT+ITpbIQK1F`eRY(8?HU^hw#WYgkGnJY+O7c(huoA|@P3(mq7t zCl9ZQA7GMT zAshU3n?=;3(|?SnsOwuQFM@$M5*reUx5Ow1v)1W2E~>JE=bdF<63Z!JCyuiiwePDa zR2)0iy#5tjNj;q!k6vmicu8pUa70RL=kC?zFdi+YoaRGMMws@=Cl5-h^3fI|_KP;n zmdlz4i=0g4!}Ru+?_4P@{1eHIuyYE`oxN?*9|gHD7T>g)Lc13I~5+ZOd|+siUmgqvp#9pcQhn@b45!w*3^fktFn@f zLRnthF!xgsqQqebzw*w&E#L2)N(b>=#LxZ0~D z!^&j)31z&aBg(R3M{5LC5rh%ZuG#53;muWkX&K2Z?=j`oXiSS? z!`1mY{6s+&Pdi+uCjDdu9eL?(L7gmmBDY|l>$M9NOAYFqju;nAy3nzgR;RjiH{pZp z?%xKtPQ{UsBvmm0Ffc^owg+wp>XVKpc58@Iw20@X z8Tx+^FZWHpQzvfzM3P6r!a&N4EuNg;yHD{=*wBTH>3q@J3ZT-{GGMmgi6o6(giI zLmGf=GB|q>%K0Bu*Z&g=4bJWa(jU}eSvh-HG#Wsqq}DjK8pV2fe=!RS6%~*WRj@RS zKukH`yrFhX7_*0AqLh22c*k^$lmd(`7%Cqb#xAGlh}6muBH~mHjZ9$jJl96N9mw*2 zZJk-2u3ep;0M~QHCbvF>2?fZW#jRNbKKGAW$Cup(Ac=ya8 zf7O>ydks2mMH9lkFdQlPJGRwDP4-4cYvfXarM@uJtH9^U;Kp}5t~Ii}wO%b$6LK$# z&j5g+EY#sDP~e}>I{x}h1nOW5sPp`p{j?>B_C~muF*X9*GHgoPVa_KofCc+2=Y62> ze*?&t;|-*je=bRy)`SMa0@B4{bx(l)BrmYV{{_aQYwi?rsxdl%4@(J{g@d=+g#v9O zm#xd3rBE=vnS`UPx2CU!?x3*;3XBFMVZXEzg#-<)f_#a5amdgNLH7z zd!~;fgWV)QmI^<@2hu?KV6Zsi3Sq$paX8AvoD7F0lD7`AbSO4?yT%+TbCO?b52chu zNuWe??;zpfKT;Uy?{~)V8?NhBIeyTIP<#)4&~nq}b>fqKyl~wza-+wjRXeG;eRdcc zk3Hgxz&`r<4gDvgFkLbDcCepe2Cr`uh51G3G^^S|=UEn}+>n_wnx`vp?Z*-K=3pMg z6I{SuK83IHT4%@@AJ@yk&1hj{wvS{=6x0Mbw?yd9EU>WX>xO;w6`>8<+#rC3^rfgY z9lV!OSmV23;f;VA(*%OALt{GCM4Opn=#gjc;`>oaqsgSo%ndjbJhidrBPMmEEZ_AjtZFx6T_)d zCsv@q(!+crj-ZJ?#9wg{>DCD+5Pl-+ddR|PITPAS^^2P+U~u`!&{j1<2H;aUw$5_$ z^P)!zf{5`ac#vu~uXB|)Z|ImZ%aQ|N=T!@Z@M3?TGgh(74Y5@@n6ZT`D8Co>bSF-| z4o(vKrH=)L8BhVsEjuaxvw#8&g85rcLfMmJZqFp6W#Jj#boU*T&1YB-BK5@xo#ZQs z8^5paon;5Xi8btN<$U`sZ-)FW2Q%LVN9QZoo50PYo|2mAQd_hGvv1$tZGpYV2brh! z)smx7@ad*g=OiSWKcQ*@oUnysfr;ZE^XrF21f2Q6m8}xImwraq_gjKf;pzoP$bD97 zjVV&90@-4Zu@++az+KOKGU(bj>y`3n*Edc=NpObkWa>Gu*Y_~7H^EbWSPu~mP(Yx3 zIK2{>$!YgsEuu;=4wm#Vl@Rs*9cEy~M>TUuh*@H+-sTN%!g1ecAh>S_NWXe@_R7)4 zS%6i*iHUB7QWWJgj0h=3x(L}FjJ=KT&{Ig9M1s{hjQ}Z-2Qq0N*(}@L?9(LAl2ti5 z+^cXoRa90(h!PBRM2XRGHz>{=l4+(&lKRj5Vn7mV%#Ue>^6{G5xq$it5)SAd92kMv zI6|=>lzZC%lO+E@!-PC{WAaMm*Q)@DW_PG*SytrO42o~L@AK!N*KuOYd}U4J!QyQ- zbi)S@+?!08o6!6L+hC;n^n&$Nf1LR?^K@~5a@{k-EK;3OcA12d_x7uK3^MyNxAq%w zj#0nuL6yh&Irxb(NWc1lv*z z1`u3>dOZFB3~_bOtXCPcdo6$_Th3fFBfj2|@T=RhqpE)EQ|LUnJgl%Js`>PL!lh$G zlZidVAK3G+jjs02(EY;1s>GMhOw-X1c#KNopYyoz^*-@B8ETX9)poz} zSUK6bN9oL^XTzkd_9(@~IFuz|34;KZ?H?**7(fuMyU)8Qt{o7yCNmAAO7+W%@9`!W4Y}@27e5SI`F8fjCynp9bviSfvcabIOq8La^X+Rp&vnyfz)m&8v>$wIz00EHw<~)Xe1%J(bi+T?hJ?J zE5Xx8l!lSEm;u22Ce{5N6{w2n|=*xP58 zikA4O3AnK*9#_sNj*fk9I{f1aP8VhhQ{x6^35h#;=}&4Z1zU2;5?NxZ5yww?l>54$ zO1wXl?^-T)9TiJ{b(KX+@*a;m_?&WXo!IrgNK?w$Pvk8odr(^mCGOs!XIZ1%8A?K* z_85-h_Hj0q98yu?u^hhd*EqNb$Pb3SV%E{f&u-(H+h#z!vK`cUTm~Q!gSfN~mIKun zgzfykpz32Xy79vq5b!n^(#IO>pU1U-9v4CST4Vn6_~OswGDyF_A4mRqTn*{}_v4{I zj~gHZ_P>FJfGU%KIy;dUa;BExKMufVCWtaI@{4LkDG zS8O#tR7^Flr<9WGCY#)e4_VsN^l8=U%hM`~`_vw|TaMFrYK=vkszU8s8nRP9nl2+) zn+fO)@QVQRiWK0=__{OqvI#3X|EI-jdA3kNo>PHSR>*zVw7w-)7axkLrj@|&=U{1Pu6$e2t+xEkbpFP=t!NfndJP z(J?RoE%kbC$Y)%fjY5=br#uv9UcsahA*`{%Y`sf9&g9W77^IPr9p@r@crCL&j&$=5 zs9s@INPTFIFy%_RBU277EoF?Ys7N)pq?h|CvfE=T+TrE=Bae{4jh!#{EauGL0H(V` zyqj85uJrAVH7Lmv`N^=4Nv)*cWw275bt!{sbStLG zWRl&ScCeoI+RxxH49VM2d=mH+2%d6d==@f`h<6^`GhYv4DnES5kbcW|R`5Y_DnfFgD1LjLj;;8_6t` z?BQ$pIHgPZ`f?^1W^iNtb~vu%*jF{(uJKTYB}L*eQH@{2e`d&s<-uoX zb!E^=YR(@@i(U#Fo|z(1+^xqdY`5+!$f*Lv(HbBY6JI;b=6}XvxfB*q&Sqp55wDui z4`JU_SYQ1jB&cP8UL(wpH4M$*Z2s-F&)TFbN@$j{9$jo&CM_PB6)GbN?^~3!LuCgV zLXTl9e#|Low3eUN`)STmz8O#?P+*oYkW#xwY zMJWq}CR2hKkkV-=su(|P_Jc>7X21lfILFe6;N=^Q<5==BTWl)uooWMlj91>%I)G6M z74EOcM$R-=6&h%yI3f(icAo~^i+@t_uva5{oxF|jglBJoDf1&f8)}hv85uZOR3X8~ zT^!9kzQJ`+(1FE~Q$FKc{u95zLCJ>*=8LqJ53keZFI4BZ8O_-kmeOTyXU;wxxFt}k zA;=eomxk91@*(hVbqJ7ckUp34_Iwh8OckUEd2#H2W$4qG{fH2)O zz_u+uroku9SiH2GN8A;GWSyH>42e6DH@%PKW3W+mGfDj*Ufd!S^}~cHqw67Qx25TR z?+Z$K>d<(l)2-Xq+h1nKHSb`}^0aMPhh3Wm1#}H*mvf@|1Kkx}hsSHj#iAt0F{>Hi z$Kaj13EK5INo60Q9mAPfci|HS-7_-`-Mh`fi9@S$%L5ffblc+V1tml+@l(K%r7<>R zk^9~vCfBaptA;vAMk;MMF(yztIz?GuoOf7GFg88^0+GRXKbAhu+AiJ+?jb(GG1g`g z%Ey#+m_%wtib3e~+}IR7W{yN50R&6)GBQloQc9)Bj`fT?4s}QXZvacg&K%eWqUQuH zV~yK~F6t{CA*GN{5m!nOfu~p}DVa;c6=toJY$K9OdMoxCtx>iV_AnkVLQA1#_?R&n znVC8QjDtk>pl$p6bu5+*5)hVI0C9jwz;Tz9LX(gOQ`Gh=gbN*{Cfb9?oseaJ!8m+T*9_y<#qGVaR^6+-1L3`k zRi{b7Ay(Gt$925_aB60T>3tYAOX9&b;E*R=V3Ix?rkb12A1PR07WeR#aRBC4hZ3C~ zZ`6>>s($)bJ<4d_vz9`wK(L{JDdwZ*#W1!k_3P*oobaQ*wFg=xY1gai^z9z4>A0HI zuIoK4vD0eYN#;dSGw!&mn|K&U%Cyahw|(KKO-u^4l~!!Ran%<47K~|od>?$@pj5(0 zs1#^Ssy(?t;SZ7tHAl-xKRMWxy-Cq!KQr+B=Acyx<8{?`p3Ns9U@2U3hR3P^0>r-tKfdPz`8O*Ny2jpU-L z3t=F0N(LBO;;bCaE+&MtQw5#OeP<`KF~3)lEeY2#<2;6brc#fTNalR7V0UUO_Ocz# zH0iOakyuu@d{jtg2q_aGTsxPYBWu(^C0A1E?~1ponE}j%lwu2!kTzm7#hU2*ol=&^ z|6-Cf9{85}xdm!FVH1Ni-I2ell)s+y4UuTXC%n3@b^nrW-|rlvi5ZU;;!|IPkaIr6 zATK(7EH0NU5e*Kkh^y|iXL&aWTblA}*W{~CCycUy3fA1a!;Y=#cx@U?dfQZy&m?MY zl1kC|@Xb9*!|T(BlBNdlYSZQfhw%G0mroIv&v^Fc7?pIcqZ!L%x)`hj7Wj;+uboMt zR?hf1CQuC2Z=fsY*174#e2Kp3wNxsAJ2Y)T%9Ham*I;P`pS`WF4oy=)TXW$H zSXh#6v*?;t&6ZHd?W`S;YoK4L!41q+G*QS26uq(~uNFQ=>cfJd^~mJ}dwS)1!z5uB zWirlSPbr9x7;DA}W+)oIwI|Cj?Gj&?8{-ko=jrYqb3;l4Yno^9&dI}tCSgufLk73gheRs zvGOkHMRfPYhq|s|7V(y`Z&`QmJ_;{8laKJx-PhkN(Es2$wVztEf${tNvxuA3)Ia6E z+hAU!NZ_Z#jfOhhsNg$fMi#EMB>v0Oq#&;j2COY1ds;_rqvi8%&x5LJD4kcX`6Q3; zfBY&U2WyAFVWH^be~5(FC?sqUYCFBw8NSo>7tNS8O-v8|Gh4Q+?Au+we?TMbf z^A)c91A@`bv_D)yXxZcq`8|bT3NOB~by&kU*IyL|Ah?G}nYnvYcQY}dZH*fd^LK_foFyf8}Y!e zu`3m_YrIPhvBERZlj)6Pmmr0Ybb~Jkn%&Th(Wxf|`yv@8j=}xHcc^=+x0puX zTWZil4l z4l?@f*WNZspg^D)i4*Q;$HGOE@7y=V@ z6(A?w2n^9I$qku>o3F7_m3jbIsn~-<_sJTbn=UI~QP=4{_nGeA1j0^`*ai*D|2jS~ zx@mrd1|I5{9Dsj-bDNe=G z6>FOxsqNm@dqD26H~|FCU!Uy*KZw8l_0P(12O;X6%`I)p1S@tA@}UfI8{H0%5j;SG z04(MXn2CGlfu*VT#PFA#WQERgj^!UKVoX8EE9 zkd_z<`g#1|rFmQD_PILB8AB0E3NskJt=wAQUPv@|c$Dpu54(Lqwg_JeM(F(l010GvBQfV%rRxUL4_ z2DKg_NTlV?phIc$Fq&gYjYHbEyB?TLYUb^2oAJK;a z#QS!#?C)zvQ0W}Ex%tdM5hJ|8U=&XJ-hf7O`9U~eG({yyO#zlja^mF+YXfTLYo&-(c*XLs^XIe!L5 z-G@NBNhsYTU^xP4hm2XqEW4BqvS5>*$Ib+DMf#9E12;`QtS1<EfG36sR|yMFOZcPa@k9ySiH`p*>Zx$u-@W_CW9ruIoa4lvo6igNXSe`%gjzG z?1ogjj8lQH2#6eUufc4IXRaZWp%vTtxhh|@ii{9@x-II8g8w2fK~-Jg`sUrDVTK#r zj-&J=c^(*GRG7cl%3lj)US=+xhCva-n|h3tfH$QO&nJ=&e;#+*ist<}Jv)!jx|b4# z1Q;H^s#*mGp#Fu3_F~K@e~MQC0(cLh(M})&=wCh@`oEwBcS*~0I&5@6Pd|S0Dp*OG z{hu3*R}fbaRSrP3^$iL)A{74U9=Pq`_7wJH!c;p~SsZ3N}f_843Kr z7BpG*k`TT(dY_yqe^`C}HDRc#%FB>|1ZLXOi#fXo{`rgLe-Vhv++Q77<&hlue`5$ zkgA@~0RDtU+Fb=Jj7J0o-qqdJIpluoi6#--23qi^L2C7=+{ZnQ5RJIpY5$8V?Xo;IWbAJ1JDG0uF8bONAOR2!cjl8;#*~9+8YYp(wjzw~&sBe# zgty>yXf6y{sc#)m1aYqfjC7edr(kwBek7QH$Dpb98`&TUJo%BIC2YMRpmE;&F-A)K znwIt$!e1H0Ru)kGn=K;v|DJeZzLV4^FGyZOa%thgnpQ5(e*ESCE%9zr!m3rU0ER!- z_d;9&9PQ+$gQCncqb{i_^cyC0MNeev95IMS-c>x3-YS?s{67jizg~OS(Fx$7nI7wP zn}v<2#;0g|baSM*B?r3*)O5+V#E~@81%CgFjpa zQ~wJ~g5_Xm;Ie74v0j7}<-L7qp-Y>@^kO{2i3kq=fmO8cJ}&pDFusfqhW0q0(2HEm zJUjaKvbs4|#F$lxf61WVZ#|LfdNi9O!f8Enb^R;jxXDd@>xz$+0RR@f9yOJT7jk!( zSfXTvbN$&IC!_7%n2q)AoR8m&h{}t&DytAu|B%Xkx++bZWs&HUj|Ssewz^AG8`YdJ zF$6%s_FxxtaKPVH46#@%4xuhjR5o1ZtTzok@jWeYy)5CK2=2}rnDif7_8AJoj#ope zl~?IjI=*KgH>ElHiW3_S7PoJr;-vxS<%nGWv70qP^*aq$Ab$d6$txhi;2*Gr@abh`j7PMI4aydpZn$2 zb!;!Fnh>9od7#)h$ch;0pa4~faM5dUFVeFQRU5G6>4^GDxLOwILUlcH$T`Wh(X?$c zTm<)CRZ5jE5?q_4V*vudgkid3;99or#~#O7hgcoAcdl*AqdLJY5>n{XBU7o>7ML#% z8fkwt#g~)M-8`)nJ6n!{^ePecmMbftHGR%6tsIM$_}4;mVr7vVC&z$j9_G-A&@YPrlg$m%j`rus~SiqHVN#lG57A?zpgVHs+@o%%_31b{o9G84!@ zx&HXk$g7c8RmtFJ2K$_x-L4~w@^D_oS_lXDM@6$P2_@ipdr*jzAUG(ZaSb^n8+9?8 z#z`I%;9D-mqwn}eobr0jS}6}SFIt^bf{b`Y5MconDlq>6qs)F@e=1>=izfelwtl$kS}D1)8B&jTxp%PG@w(_J4#|uCY}ZPnU93J3P$%| z=mXEK{he4!akBh+&WiajzF!o>52XrazRsn0V}k_YWFy{+4l;N5Kom2S_}W0Px~3`Vhx6KJH2&pltyKuxKROk{t_>GD zoyFwtV=J76b%!gm54WS$b2e#wk<%=Hdy{_g_@LdeY6{2!dT!jY}B6n1#+duR#@Q~Q`+3bG*W2KCQI2A>1)_(|hR=}%lA~ZR%>(|TEVYrtm$AA(N!?}3_Oe(ySkB3V zt%d%M0SrLYgmq&bi1tkF_JdKEU*X8$@NE>}trA4kI)v#zO!is@iE)<(?B;*6dDiPK z`!uL&Z?9OOf)mP9^uLoC8#bD2o!M%9zY;ppFBU%X8hGw#TWpAtp_BT61$3swHra=i z0WDAyQ1BEF6Ax2`1kU1-p&@ndr8eA?_A490A&gD-_58^1kYI1^VrF3r*sx1K?QhOk z_D!m)L39%XPF7OECJ2M4pm}0PsuxPI?vTj;svN}cKrld%YEL);&-)QYjeG-lc?VQ6i(XR`wvD8G+Ns>mu`L79dgV7QbXpcc>jkNMwy63ny9&y z9Snj{CvI(@e7xp3>7E&xPLP^{_5lB{J=hqXf2gb@CrLe{FV89|zw9#Ek4zzh;{PNc ztCXIV)@N_Jyz?_GlvU00QL=)AR^QG^h2CJ>6w{PX6cGJ{>wOFxK==>2;wPo6*FA6o zvuWyX7djYRel7dZxWBDw^Vu;N+~wNH?WwDdqB3oVa_sIqka96@FlAf~XxThCMc6y9 zFY*_eTq@tl`f2fi))fhj{PA~Ik&0@&%;J00TFab^%o?&ZwVmC{pC@lOqor@-bdVG4 zbV{+xbgFn0_UQcUqJqbD9y!`1t#}K*kq7n%&4}g7vLEip8#kB)1zn9uM!>wMtP9A) z*#F4gWn+qhZ`+~tAhiGs)4F75tx8UR`7V>Fr7U6>F;#ML=(cceg`V$6hmHt3g&RFRmyh>ZP2av8 zKIOmvm6mh|%b0v`{9!k`hTFjqQ`ktu)RLo18wq^nON^OXDB~klYKD5-s8x{z4uFn^ zacUF#`I|HUQ}&Azv%yo_1N(Jv6m4WPEl8gX51RWDR+uocQXaAs<@stI^#pq3vxiZ> zDkPK39tN6I4@uLQr5+fp;@+Gc?#uW3K{}xh&3YU$%Yp-j;27lgp#!M?awv(9ne{_= zhCL_wHEAU_S}U$k#lF#hZ7~FwMA*#1Lqo;qMDCx}x`VeB4>flQI;lf4>S*XqY{D3s zgXZNiwS4ppq&imP5@DmiOOTdqHvCLV*J2H~;2?*j z|6l&0vz%@Fsj>>*se!B7{XIU$bYm*afA|M9o5nmcU*;uM6whZUAKXvuo2gST{*i<{ zN4Fwqah%ZUyl>E^GA~GDX8r6R=7VI~`;bA{|HbGd^t&kHqFNyX-z;C5!0cn{Bi>( zK<$rO1LKOzV_{YTZ_f*37Q3+~lynJv+ATYbp2L*5H0{9fn34VB1`!T{@9llepkE_q zpL9m7hg;lq? z&jz{xB0!4RdKG(-M+gL>2`xF~9U(h@jx%qFVin*<$za(vOkf6EKx@z6YJs}s^O7+G z!{Rho0Y~XXe49WFp2~a%D%lu~tYt2VdV7;F)Wb1E)-wJsp%4$HGX?|LALq*G)h+JH z1lsKvD4%sirpgcs@=^%*Os~PSM58WFQxqwtisFDmCcku@5*6L0lFEx6G^L-LLLh+` zP7u2GA!+_>+}5kDS5>1xG;j{4!<<2X{g}(amWH;gTrbO3tJ-y78IV~6Mk(M7(gMkV zx$RiDy_SsNY1a2|p|+^SNeD1DPCscPgf!$+d}P32uCSeb2TsU(jwOu} zv+_8Hxxfji?gRxl0VGeM9Uk)Q!rv!5|@y#knGY&U8c9;13g1hVP#>C+0>u4BAeX zKjp#;qY7{|-V6;Z$n8gpf~GC@W+lSX-57qaXZXzok}n8u{9o|)RgOL4&?~%UzHE1$ zA@kUa@R1idLOSvas8~e(%UFu!id$4`;?^2ir1qaM5Cp94 z-*oYzzHwL0uBEU!gZts_X}<3y48+H-95gt&KhHGJ0?8hW>=Wfq%>h-tQBD@?s_cA zEfT%Ttz{=>ArCdkesyP2ZixOhZK7Ptv_fO>tnqD()k`|G=V1bZY8A-;YqiS!-lE)~ zLwP+asbt1@Yj(0be*VO>`={zt;O>E2{FxTL@Sz7s8_v4WQ(xnr@_xWB>qF+_o<`A6 zdm;1xSi6JBJYeE>gXI11+>zzL$W4=Q7=lzS89LcA5{-%XIP@R#)|Lz3VacAlXsjCq zVaXHVi<)4t{~sB}2$J*eLk9eJ?lAp;i<0f*BN$4MV+_RasW4G*p85|)S)AYv0_V)^ zHdrN7OIm{#gy$a-{*R0p1IWIEvLV=iG3xM4bVi8VWOGp2I;eaM`ad#)#d;TKZSnt9Vef-ufVgu4dY+D79lxp~1VfA4tTFQ1 z_(;g`K<)fZrK7=FYRLnX7Ut0W6uB%p&g8@j_|^ybWSEffqIaNb3BhH7n1)#UYhbY& z|6kZXc(UF96}AW98LEFepdhr!vvD0F7@w58lVZB1djU-{z01=rrZH)FfBu~3&X?#= z*paq<b)p}6>~5JhbN(5jJZ zJMCx=E;QlXkt36nf%onzH+*aKk6AW9K3i2&Z@e>4s*ok>By01FMSxafU4Bou<7M2sxs53De|HMw zjS|aa*Mpmv(0uh_A{}xNv$55TyXKb1=yhIy2NUINg}e1J+kRB)&Psj%Vd=qqUV>5@ zT-4B`oaE2K(5L(VG6r z(G?rlg8+M;r%e^mI;YnW#6e*5zs4#^kZJP~-4Swn*%A5WJFCAo=84zYU&bmw#t}?G z*$n-^dVCgMbFNgzQ5?8L$^ z9f0fn-*DVDuwcSJFZKA>RK1XWhySWNXGnr=;xnA-}7rvfY@N9LMRQZVDx{@ zeyIriY=-X+l1A4voRDa&lP25rk2qfjoL`>c)mES1fAa6CUs9&U(J1Qv8qus#r`_;G zWl>X#&&ymjp$~?37u+8jBnCU6@3#k(qv2o2^#QKcHzN)|fO$_aGjYHoFjsfPf}zEr zK~7iojn$icxa#mTcH~DeZ2$Ib;R7ew#UL`W|3flVWL3@I;1Wf{kg9}#6vFT6zd2HP zCR163MQ{QX`z?6tcfxqPLe$mfaiL-Ft%>-MsnT1|W+V?b*>?s|fZA7ZYllFpKWjV< z))02Q!$@m6XW|ogth4<%F;GO(#t{Gq$SsClS_M=3>!{=N#dh>(xW^xjR_O27i66}! z7IjX3AB?O$A)K#*`Td1G?~WcCVVkn8XDhWZ?!#-g?nwD*@}juoWW=u^`=$D8Ln=My zd0ZHRq&#+;-Xb0$T=*?5&$GV}?qowy1%dybn*U@H66ia-qlSjw`M7*juCdiHB`)_e zMebsN#{gL`=w|aT%rG{ku>);1@qujaC`e^Ta z(y*8*@9u#nE0x8Mm&o{|3o#r7*87X{j@G9a)z5Qed zm$maS@cV@18zDTXRu8iI2W)tMc<}z7k+$pSp#_`jw(w;Zy7B$*9h~Y$NZE&ckMpP6 zd2v?=Ae#50uQK`;=QoqXngX+s+Ou|F~RN*mqFlKfMdMwGXI}x^ykD%qck2B zo@>#klJK*GBRbtjHN4-(tssT#xC$oom$|kwT@N>vVWXR+w4$Kd@Zhx)ug_op&h>|g zE4$zxe+Nx}G;o9)NSK{go4r%=MP_!NfKS_cx7CSX!O(=7bcRPQQ{6}M4^hyAyOh4D z&!jvnag_pB8Wel^{)c2H-H!@KqObQU(h9C6`M`C0H+15j$^4|jW8Vc2fchVj;c;wk z{zwY1s=VYuSS)9C!w$ap^h~B38hc_5OziKp1}czW4O}sDWirt(w%qlnVP7q>En1A# zGJ{P4_f3!p*1%lhDk|@@9l=QFq7z_fVC|IuM;56 zzth76r8`k4U>66O8g*okO0JO+=C5pn%vA zB7(Pi{ADpmy0-o$uLx|%2+TVcv3BSIE7ma2i?Q3q7zU{p|9?n^tB^La`cZ->-G3xz z7z0LuZ~w0LrT!Dg;scQ}`5%(mJ6=7D%^`tHhFecEJ6y!_o{x5ZCX*qBoeA0@>i;1b zIb1k1-?HjB#vb@DN%m>*qnnH`r^v?on2@`W0Z#vKYD^n4o>26dp!8cpuaLxq?sZ9C zabc`<7f${6j5p{*lEQZ|tC2YgzKahgR3j07U&b_k*A<(PZ-aIr1J(botp9hiegtFI z3OioCZ*3uf>G%rw5T)^c-)H4N=3q|Eq#L2Zk$E3T@D7I=*>0DhGrXVIk~B-MwF?=< z_di(6>tYS&jlQ~JB$?tO+kN|+$dD#zt$)_i)v7i7(q= z3MxSOr*KJLLf8wfAkNx;a5|(N9Z9()k5LI$DKGAaZf2J2b7Lz|;-9KR;8_Lp_)}>w zLoY*Dk%OZZ{AxbN&~M?pto?Z>R-lap4*8ZgfeSqE{s@r<6qd>VBAq*Q#puFBi5D|^ zpySIzvL%&f)Vlma`q&N8d>8WN0?4xoJ=2bzM?=rS;h71gs+&};d4z^aqxRM?Sg$?? zC0uMq(}1#Wor%nT*x>Lv-p9svgvP&BXJl+F`N*q5{>4Y=W2`NS%yH7y?Xyfv807gc zIp|*^i7#vwdN^%jHqkO7$r{T39DQ_3C|i9IX(`F9TbkL5z1U9HZV5;C98PE;rG zv{~Yi@WnopzT-ih1HlFV3odtDbFtPCdeie-@gaWPbU6ZGq4Eqz&OqikfPTIQ_9BX4 zka+y&(#h?pp4LTM>GW7T?b*eOoLyzK5?E^I7THJ4$e)LOXiM=6%5iRaCWh{VnnK{< zOsJ^8H~1@jNVWuwUm^mwS;HZv@5Nq>VFz~}eazuY`}QM*4{rTKulVEvl(;S}Rl=@Y-(4lWK@b)qCVpb$xE z6^!<;4JC-##4C;D7OZT<)@sD1RF`pQTJf%70mX!=EBM7jAoU+?*E`d=Q0kGCG)X^P zx)n!{Jm-rHtv49WcfcNNM5f=3b3suwdff-P?oy|v}U4`)b$3-OSpK>PZbo{Qe z@mqW@&d*0onJ{gS*#7a6M?W?e6S%tuW#{b$XF z;2bRq1gRwvOWv$OZh!mi_yt`r`G+AU1GjVh85QmT7wY%X&#N;7QfzL+`Ro1>sZ$dr zJBe$@6)$^+5fy1Zt-xE$sNQ|AJc;2e99gUSYX)P58N8hdI@2%h)?c1CO(RV@r=XMC=?HUr$C<+T968L6_?9>Naeyju>6E{G?mf zHqppsTe+B(hb>7bf*iL2(~!Ryc9FMl{RbCUXH+@U(VXK zI-FZjAMABZ{`e!u?UB>=_{;6c(bkK}gqh+6o&aV3t&O-)8z-eJWy%qc?Ii85_nY#q zy|0UtqoGaGfP3wTvL^`c|3Di(kf!k8@qKyNP7e~i%|WwqO=kJ=tT-B@(O*^KM-}Ul zp~FW!7>pMuCA1&Sp2u|qw@ppq9`E2Ct>bH(Bumqb)qHfEJQ+6zexBdtXdyoNGe>$EQj|L@`hj8qRA%+74t@?Jh!ufA+m++I^|L%CA-=0b9 zW6w!bKS~M_J0^Wzp0LJFkO6f(Ij&``$sG$_S4S(c`1x7p_%4_t&z1|B-Q=pU?@NoaS%KR??2)07!o42Ej$Jl zm1le{65a_g*v?;`;X8bY(I>#-7=`Ccrq@X}ojP&rsIKp}2g}%IEs{B%W|dDzhE&xS zepUy=0H(^}i&nvkwh;b+yS&Nb&U>&izg&5!GI^&Tj1u<{ISx;qUu=#@hXQ8R;depk zNwj}m*ab;al?|%wH*m}xt`705(K+MO@}{ox8U3CTYQZ{x!61WDeNn6PU)1+gcS4dE z(_b{UgGvlst;1g_ zv$OE3t-&^DCzJz6(R#lHypeVHao2MVEs5Z2ok8V!dzcUdCVpCkU33VP02$w?=SP<= z1G2b!sRKtuYYGFUFUN5n&Vt|WzNa~|0NVNysMjGu$quLpDF4mQ0f?3!s~AD=@uamq zOemClKCCo{&)bj?4D>_;<2EE~c-V-9kEEGN!~w9sF@xq#Km~h;rb=ip-!s38B^QSE z4RBzu(ag**oFEStS`S0yxCO2cqR#>t{7v5r49$Em{Pfr9b*e{|V;#pj4I+=Y%nC?q zX0)z-aYYV!w6|J0PIxOSrrZKo=>={0So3?}LVs%nB;qkW+SHU5`Am?Uy;pzl_9@i% z@+e5eYc%e8yHGIpw&CH82W?aJnRX1~sJds32s^$(SbgpcUo;}bk|3U+SAW~J$4AT4 zh;}^dU1PR>rxhTRaF@mnxI{#t+#rp>x_H$hfO2(`0zAn?QdSQTtN$YZWIQRv9E`yl0_ENCCU zICxHw2wR}Ide`>|3g>XO{iA)1_bIxsiWWvUQS^Kye7ijTn3@J&503#B&EfAs=xwrp z&|&we0tCJ*p%;1Z%IDVv%vTpChP><=fw$Oz9!t2nRS4}r*e+DEg!{^wTex2{5#CA1 ziiqu(7tI^A5AgqFa`(kYa;MOt?Jho8UYe%fgR{AV9K$nXm~At_<_iAy7P#~uV|avq zgsy@BN9$nkM<(7-FMI=LwGSL*AFbw-NKL>3pFqQziHF;Zi3BI$cf>^c+Q8EquM|#v71g7`| z(~Gv`eY>k6xoS1`y-(hA-GEnU5zoKFfu+lv;nLk)#K3p!u-VpgXF|3G(JYfj-Ej{O z2)4unZbFu{>4BIl14^Ghy?TU>HH!;hM>`Y4lf#t7o2DY>DAWd| zAH2oJ*@v3iIF8t(j9xg2RSr(D1^a>)PuW`G-6HEJ$d{6SjX+F1dNQt@zzM!h+C`Rg z1X0rdyg(U14T#65SFx>VkaY!YIVZBy;rH5wx?Y4Y#!tCB_fq|KyD{;&#Jvd04=E)S@DN_v&_ zD)t8&IkyAfF5nR2OY7}Z=GVf(t4Lp)>Z2zhTHs2%7yEUhp->_%l2$FoePwK0K|DAH z8l`)d>irz}!EwQ;3_o=-`lryK^aM)q0~ZAfbC6-}zxflRpXpa&fd6mt3;c*|YcT%E zAb1?W_61J*r&%?!vvoFcccwK0upJMcpbqakvo9SbV!@m#>@AwC$B`PKNxD%RKeVwn zyt%QC14Q%b3Gg@R#-)Ej(*)RW4rnlE2r5c&n8`bBurTF8B$xtY&~8vwr7K|$CH*#O zj2AdA8vF_KlxktXbbx46Rq&oaV(lWvpdv~pzs0cg#pll?c!Fp6H1Z|wL%m%8u>>Uj zR#ylbLGrI!1B_BZ3Ao9{6MeeJu{zuGfI6Zp9nyM87=GakudS^lT1eNm$+ zINDHZW+h_!=a#{(f(txq9X$%;&!o@jV`4=6uT<`t!3rIcUHr&AX6=UN0&ER&*V z0&oSd_9aX-8Wv3LYhiwr=dQPN)n>r<1f|e>Tr6j#q%e4HT;sxF5?$}Q?OY`xZ-BG! zdwNffXU!552~MFPq-x&SLv`C4XGv&8&?!LN*HH%6;?o*5AO~CcgazqG@{FYL8!wX# z?}0<0`o=5PU@OxvN2_RKj1JPZXdCGpA`708`*&`Nrah?9bR=9p zSs!b>>^9nN_%nikVyt`Cx3;UemG)(9Y0}INLDRBg3fS06nB#?Ly4bc0RZfkH_Q0hD z#M3yy#aF);*MgWd!VKDXE|bW5!nJ!h=4LoVEOm*Mv~U1KsCS`dVI)bK=GNgDMWG0t zjeg@OZ6J(MV!JR)|4V8%BN~=qgznaSK+xuG!(k_4m)145;_#Ppf+zhYz!v!P@9iuM zc?PKnb1>0y6fu*kbQFFeAth&$pzHcz75Iuzki99thR`MVTWk19BI~k8|0}@R4H|F_ zoD&q4a?^jko&>N z$I+Uva)sp4whWR}sK}idywyQFiob?zrv~0Wz4Zr@JErENQ(X*SP1mdx&eyj=;^?cA z2Q$R)VJaxaSbX|EnK!@2gGu)$$W2v|SBj!`j!wH2?Ww$^haa^+!TMmW<90FjLz_~D zG)Uqba#s3~Lf7Z4ugeX-_1@@>)lz=S9EjzSv3^k#HxK0Tbs>PrW$nt<&io7WnTWPc zMkbd$%THXwp3^o1CsXw;0jbbc2Kg>j{3uKfpW`E~zu;|b?j`1nId9WLs0U4e!cn4- zfLBg!b{5>o*5Rsyqd=5EcA4J*+9SZYE*Yt25X?RENL|Nno*vDItbKhnL%8&v1mE?z z3V$DkR-AvXV55pkur$4la^EOk5xvU8NeiL`oR*qCl2-(2Eb85&)3M9zy~V+C>P`D0 zWjt{O(w0#~AQ?9YVz*0DCKB%g^yX(%6`Uj0C*wH|9$q^(Ako{3*LnxL-(7g{yW3EQ zggva^PO~^cOdj9Jww&Bj=R;7tW4$}K$ACuK-E-cTzIoH#|wAl?T6c-Q(Go!XFqNg_=%`A{&BTz`azH| zSCc9D2YV&V&nU4k`REwgU!czGr|*-Am?P_baI4-`OUA_;pbQ1nY)H8c@}v* zy_P52x6X9sygGIWF{>P`J7F_@{Luj@?qOPb$Yeek| zE05Fr(e}eUcAbOq+KhLWk`rIN$-z6L>?o2eVNm)Jd?);7Cb3xpdwI)pK~cL4Z#z}p zI)nh~wD`-1ln)R^1z1FQv~)DT2t)-GW6?+;CH~{T0Zx)#m5Pce4-J#BZG7`prq2bo zl*lnUz%K=hUuwlBFMSJ)e0V3I9uEm`%n%}yBL%r~=q28pMQuzjz0Ud`^OKmxXkycz z5}m-#rcz=+eod&f_jAGLbiqv4_x`=_+IPs;L+;lC93~yXVd@}~A#a!Nn#Zhm;y>)< zYi&-y89g4jo|i~%_96Ty_K%3#;I}0GE=6_#ZSbFzC&_22mj&=ArN-$;wl|e8K~ibiw&NW7Yq`>TQ0+ z>L7E#Osc=DlybDAOFt)U(_asC1T-BYARPn$g$xYqAEewULSKe*@L zyBv;l0_?~_*w}@n{4;b(0ZRdkjY8`Z`T1mRqf#%zlMJ#$j|7dxJ1+q5tIuU3s*pvn+kr$;c3KT4TL1xp~xg z%AN%GC=`kcH^HQLv<(E~s99!tn=E?PZM)|?<^3xP{D~3{CPxmUuTnadtH&$Ws%B+i zs==guQ*J}lkS~DJac#4dYcnv5+Ov69G14X(6l{#t$U*7 zS9@Q0Y!vEY<;srxF*sgD*PFI2&X6Tvol}&m90@A#Yi!Oq_$7tTJ2ZsJPj9|M3ujss zZhn`^>rFrwf}kmlc?}OU24&-jF&1)QdRMcILFN2)VMrcrLx{UU0=~*aFN3oySIl z1@s|G9p_5AeM0m8!Tiau)^+X3VV`HD4OmC5z<4)MXf1+!$SVT8ZKm2sP||zm+u-Kj zs|Sk@&`+40@3%QE?agR?b*)$NbBCcob(tB}D!06I{$Mo8Z{py)_ zj7r))lN^}Ap9~3Th`(h`xRn@SK(*+UHixE7JaobsHFy86_Sz2{agb4uU{1bnxbZy> zT}jIHjH57lZbZlrFM-ih*iyKk4I)z6Sy97&?;X2KAy#;cp`=Ib7RmRka;9tsPid7F z5)C1kQjH9&-#ub|D>6i@#DkHAV-RFtTvWg0i^?P+ACPd2|Ihzq#J`s=F5_I(j3SS4 z%g>t0ODri9Vu0db9w`0=TX?q5RPz#8!1=i*-qzxX42k5V$zzdqGWDMA*@n|?eG!{P zAn*|M+Qz5JthTOUi;F;Vb!9{QCVyhI(Q96m3LeaEg9MCLV#&%5W4P@?*(jWLeQge7 zjlbzeerTHz&Y?oPr%z@S+S=Ur1N_I*kEP9g%z_7g{^~W$WEFgUO`&2?C7>a(#EKrI z!8XitROMW=_@PX_9l#IH=5&l44B?*1RpJqE5`KfXXlqAo$`f*s*Rm705f(A?Fwx;tl&WP`=G*l_PVKCnoFGgmrKM=(=Eo|hrzyp! znUz8?65^9=`_m(Sh8B^+k=KuEiM^-_SPspvHjfF>afQN-akf#`urfF26l%Sy< zhh*s3-rt{JQ^<*pPfu1)S9;B-Aup_pW?UHERvTkhCDvNmF7-KvN*(~nbym*UepMQe z35uj40FS3;$XQ6TKe3V4%);5i%+}7)1Tg&sKc(9Z-$Uy!bJ&(gC*NT;Ltjni1VnRk z-b=KExw;h@5rBaY2qT8a*2zjJ2NrYKFayj85h1Qa(1Tr{2D{ZE&`+=?Cu#n^7wZII zFEqfp=|5dBWfa|OijARyQbX@ea0C-4R%V@91uIQ>{!Ox;=13PIyo9iWCCTC>Fgr=p z=Aq9F$FEnu=VTACHiZp<1Nvg%A`T$^pYOhD0rLMnznb)gk3$_f^alMW&pU*H?xjlu`dF7k&B8ja3Z#%;lF2Qlffek+hck)8~0k zW(*b08dzzR#lPet$`hZ?Q*x52S7LmBTS$Ys@k{UPQ)j6}h8DIAHt=8v5d#E|#`*^y zR-Sl#MolZ)`;L#isGYZF9eAN(mNioT{C)YULHN!!u#yA!f8hN-V~;h{7z<+`El0Td z+-i-~9e*)i{f0w`Beu0mfRdAvjvWpIviG)cPjV|31n^uk=)HL&q0XeZ|2!U}- z;jJvMp18`{N{iPv(~(etILFEH@aQo$Td#!HJA~|^Ph}b_wqgS#9M`3XNAF?KzP@VT zradSxJ#3y+JOrHb`lfT_+AQ+y^ZCEvMjJ_b}qbvV* z1w3J6r%+4cGFnd3y(|vIdGmX(T_jX*({JkD#N1n~n3UIM{SM#iHU0ZTwkSFwE545L z6mX1Dl5?E!C)kf5GBk!r7$MCk<5UcI5Czx2Kj>?JS}VAvbyr|uupvn*h-C1~lx{27 z>oS)0W{#cBIsX9Yf*2y-bH47@o9NlNOdIp{HJM0v9D>ubiQ4E!PfvNw4)uXyOW0qPD>D?v86{NC(hm8D#7LaX=W%*Gb|Bwl2A*i7hhRK zPtP=fq@*Mm|3q9YczlTN`TbJLw#aLfOPaiZ_s^O@1ckzj!R7modjL z$qLfz0*peBS6A8MGCAxmA>zAXdU7dL(B0;oIMiMA$`=;^dWpOvr3=s)4F zulpYG(sf#Cdo1k|BWS)i`Y7$>={D{Z3dX`k`V}K$O$<)-s+bk$$b6wVa071t^C#B$t%DbAlU=)d~Ns=7_}+|RpbZvS|~ zhl(!%_48KePb4OgKiFj-9BW0nW^o261Eo4~7gBA>!?TPZ-h=x2K2Sez%;k}lW$$UX z(Qv~*EPWXKMR)kbZhC3`%(PAUV(UHtGXqm#K|5ib9lm~l(KSf7I66842Gq|JJ0O7i z`Tl?R^8;Bc(Hi@;a+V&*;rMxuS~Sq?Q!^Z%Gn41D9OdSpX-hAhj|{5$ds=M|<*mVp z2bEnG+Cs+lnsm#R=UDjG!Q-Rng{?V)QA3nQu{EVVeDofj*MF{pl`PZz8Nf6{HbYkF zf}uUtAeD6GhGy9$_0nf0OlH3-mO*=tkT<4?344(Af6i`R&{+}1X-ws0~BL`Mh;OMH(p5N#fPG$|Zf;;n${O9%%3KwJ25^K%QPMp$AL zNMYmj<0APx1NJkUkr|4jJ#e!>bMO~7pva103&xVo786A4(>Itd8e9wK6Egsctkr0+ z@FLTiC@6dCZTsz6^GNWrRHKB?WHK2r)xLs+{TM$ayFrf@GJB?!2~!f5S7*ROpCsQT zg33aSj!~Aon%Y}pC05P!2I^{wgFI1c=tJ4z318z=x5Y3al!C>Be7H*Sk>lG~P498f3{O8!-(+U&Dv zYY9d`f~MI-<`O;SIr0AU)VTsSOyr%2u6D|go~?U~PIQsr(DmtC>Y>^NuTN6C!=o3d zy%X;DOEHUM=hhBN%V<4zW$tefHj?U?=E=;)sNF?6ap<0ICxlwLI_bjN%)MhW+f0yr zC2pb}Q@>31O$vOY-)YfxH>cWRW$C`mqqp`=*-_3b<}@zUlzMMqr`l^P?LMd;+Z&6$ zrBX2cG)QIDuk;C@=vR(|6W(`zeJzXcGM65G16AF8KSUhA=zMq+B>St4$v$xB$SMPG zCB}|~dRouIKcc-c!ga&43LY}P+=7gR8zUe0XY*7WUlkH$QQ|&> z%~kTKefj_*2JCb)|2!BiDcNhj-o+YBSJk7CnztbDkLi$oPmdgO;u8TyH)wDN$buga z4$~LpcDJlj=B#!VFEZ&`fa|rMv;KDAy>kB)C5|n3D+Yo4?X06~4$6oALZ03gT=vJD zMHU5|akst^(y@L#m7u6r3rsf$n}Kvbx7dAd0TERsS&D}a-%u#Emv#EW3XO%SK!c=3 zZp&SL()6^FgSHmz68U9{s)il~24)+Y+7Y`$dYjr-<<>&=XXA^<^Tu52c-|cygU;RQ zc5Tjl|E`9Ryldj!$p!;`+0)5}Rc6SgfiIKm*Rt#`b0_yX-0%k5d{0I-eszVQHf2do z!)`$o*%!mFM_mL>@%waWTX#}q_XrVxeNexE0wF*kLCOKeGG$Ij665vL&FEn~r}+>o zSQAYNxg+}yTTzG(QuC+TNO|F*E5hE!oEub32VFAw`QY`T{wjf)Wuon^D|y_Wo_ksz z#S2n}#!Wrq@-)VvL+j8&na(ZVVl=#B8CJ6bqV$Uc9~>n~=Bd4U{B)O&OPv~4g~>Ph zh1_Ncl-ZFKD@6s>^vRnDEe`}wD1%+J+6?upU_ht@hA^puRQgX$$vdCYX0&0~xwB%iZtOKwozYZ>^m z3~SpjK>D4pHeYGX3WdB42UZ`x7Rjz?(%$vz*S?KA@7GKj+GW%P!$M^+(W2!e1^$cG z8hx<0pWX|Qyk6Z+q5O_$4<6Sm$En)-O>ND-{9Eih-`Cb#L@L!3*x$0Tg`iBDD6tK< zbB#ZfiPZmWQ~wl)ubl$*o*7*aiThhgf}~LA_iW)H=b2;$UB()dBpi+Ritm%rC%Ds* zxT69IHyAh&(Fbdk8Q^S4)ScWCRC%uHwG_?KhTcLhDSy&aRP?>3{*g;~6tTxx#JKz9 zJ&!DMDO~rdy8x`+pfri0I6O+kH3TVd)&yp(WgSV?y>HarC#pRRD~ zIL3!h7g0TWIPtZBO(@9kAe0PC6{88tsf_mHPx1zN%AHz@rjftUh>Sq`(em#AjxQ5-Wq zU{tnvji?p#t^l=s{hsQC%4&#W71S@fU9^Odg;9yWfb453AxY69)-oI1!;}x;ci3IF zHm{qDpx?Mg^vB>^%ku}!_!{UJ+BM2(Sll5Df$Ki7X*s`5KBuA$2zh0ITmGiaLD{ll zp-a@WfnYybx~a3d5#S!$SA5VxJUj`j{lssj_OTV4#EzD(Xl=S^%r0p4Dbe3EmX}p* z3GEGcdaAtm;9h%Twp(RUZ629<@<3A1u&q~SvE=~DO&9$X^;pB%iN>jR8Tu$@Yp3*n zi_3{Qk9qrdJ>izw*!^sqMefIQJ^*~PNa-3uS3yWYja23|F{9c_CkGQt7ruRmj>m^2 z%rzzPk%1{w1-7|UX6N2RaL1%TT4ik%4n6w_`>DAz_bB4&X$F&^WU_J2H>Y~O*k9i# zRGXAs>y`IbqC@YZlfyX9OD;rP-DbY}2wh+ws65Pq7?$S%SGq+ZFdOMuwYF|Y&z6|D6v|}%lRj;U$$i=A@TsAO2-)asj=m3C^wea{<=Ay% zHYJ!=UR^|!&Zn_sRK}d5dw6&?a=PW0C)wI!F^$JY)30DYE7(QszQ6Q)(nUBtTmI(i zBES%g&OH5ku9D!yw|6A9Xv5xZih!%Y4_uw9L8tBz=$`pi&BktB6!|gAuP5YlaSnu| zo)GH0HNw#DIA;HfBub55-7ZSg*(DtU0hLEDGuPQ(M+6=IU%;o1w{7`BgvV(G#* zssRxsL(W`*D-<}J+!NCFxsW+y%!4eXL<&;rh1~+cnX^`<-aO`*cg1G$J_sx}bO-1L z>0?}yQoWch=j0s;qug@x&FD`h&cni99$%>>e|W1UJ3+1cWL_yI1xqRv-`HDsbUDj4 zD7^VP@Y$0_H`IFNn?u#a8a{jY7uL~M*^7Izr>gH?$L-JGxnqqShivGd_nGlYrfD`e zu(Y;+O-C0FwE9&BE|Y#7r;YNIR8dX5hfyRGq)?e6-62rK*Uk$29;Sl1diA^XtK1_c zbUV@o@FDs2Pc(bnn{a>+W_c*)Oc-6auiE%sAAuxMR&R^vxzehHA-J^_Vv$1fcr6B_ zOzK3^t?otZIz$ZXVLe)1=rO@A3}6+(_l_POD6kfz$Q~+ora5I887BGLLKF>>tms8N z@?qe^hhVb6;(CGI(>_8EYNH?aIdt+OXwZ7*^Im1q1GutzFoWf~U~}Zwj7d#MQAG9KghJJOx9$y^ z6MLaVYLOPP2rF$#bIA2fCyj_42Ra9M*}2RA7AXtrK*^7)0X1-k`>s35GZt-8T}6)ybF2r6ew17Ixh+XfWwt zagb{71|Awgqyt<47J=wmon<6@D$4lT;nq{oaN(b6yl&s%w20fxg~vn__`v2kUEjC!s_a zWE&~n^=7F&Prw(FUvIWvYZoX7;@?AdwNy`P9begS(>QK__(FaIYuO5B)D1oUQ`8b| z;CczY;?o(+q!ib5&f6UA%~C^o%Ly4L(?X90Esd4)xQ_ep^UW1ZLXlC?zsyKh{ zZtIYsEu?2fe?NrMYD1N0XBC`+fQlEz?p%rIi3R(Kgb;0Qp(5?e48MKiPf}QQ?(4N2 zfeIa#^e=koTmqS90)y-HIoOEhpKRu-uY>0pDF@xU*n#ZTWQ~8o!e72(rm$; zc1qi&AAv0SWX7KLx{zaZ7iN)R-Oaep$(G)e*(H(yxu^3gWNC`apNkCr(EZS{tY|aU zkFJ7*k#33ncQgs`hV&Y$(zS7tmS_Zc#~w``inIG+aUXQQ1Nm0n#(3lU8_}vzBKW)K zAmLz)<5+Mj5%$%`G#6_VfGl9`%f!pO&?O7cuY+(0gg&K$dac-Aw3Z0YYjIEKiaI5R zkBD0zKCI`V-^IcZa3jhW34tF!gF3x&ynl_jN;Kb|Nly$% z@0&#P4>0Hk=hamxCdh+{L;ACpZ$XwUs(|EB0hIio2o5QcO+N-P-O+eEvE7Y|*6HKJ^pcRntbsj${pjCgG`p09$erLv z;YOXE#{ya|pIO^C3unIvU3dCOV85@R|7#f7zq7MM^%Xq1$R~k!`JuA^Y}PxEjV2*7 zl^XyyfONA5RT}hsgTexk{I7j_(!)G$RfaLb)YvDY0hHHg^X4rIN%BA-C#)l&(CF}t*}u_SVF?F$2((WRKs2Suo=>$`VmL&fjdYF) zF-uVrQnnNF!AVl3n2e8sCCLiUV%9}k1b%%b=6PBzB$mZjp_N^GtQ9)$7Mac)7v3=j zT*^TbvMfpVd4@6vTXfzG)I`+)Fu}n;Z-bSjp#GuIX&TqNQzp5LFTyH`BO`KGz<0E- zXXS0X?f{2{*=cE|3|;nv~T zUyY@2qwenye|B$fPOTeeP7K_7SfuT-7dV|)52CAW_wJZtkZ;6O$B=sE7)&>M}!ywi{x@S5?zk+d$ayx@ZRQS!G z`sLLbR5N4mWTwVO~;}7@!NIqm`5$pq`lOtH1(;+2gtH zK$o08Pp{noVNYM5&jFcmEo?2GukoxNI4t!+^KL1=ZC>Hv?*v~5^zg?y^P)Yjd9OMM zE#|SDDj6A|-_cZ0k%-6j@^V;CKJdsGg`DMP&`*koa)Qfo6|wy<$AmG;y4X4)YnQhy zG`H6Q%j9)<6}AyOEcGBU&hY=g5`*E1Zc=yO6;VI3BKSV%L>=4}CjS2?F{J#N&yFDi z5dXYB^yN^L6OEiHX|DO(8d1M1i;#YzYS5mh(62bz{|)<3yl7+6-n+B2GI_>FjsbH) z+1X&zIQMbqq#5UA701s%clmNO+sPAmr4tinTQRr7+M#t2R)MQzZr; z_4-VFtWNwDWyI!$WUP=}=@i!M>6*A&TJbQy%8&2C_Y2}l7r3(0mK@qA1e-p-C*Nx8 zW%(gVAi9-U{fMyp#^y>X7B7jXciX$(qX!9;39J^q+j<05T*Ae+5R*i=V5uQgM9B|3 zb1_gw6Sz@d=P#jT5j_Tx+N-5kQGB-P=Moy^DF{ALqzrbCeQ&EKkK%R`Ithgh7&A+y zGhNVNG@veF4oIpmG7GY|r~HCMfNPC(CPZWHk`K}Qt_&f`*OL&O3w$qCBra*QEQDRk z7Gi_qjDO#au5Oeg8{)Xr9o6QQY_D(EvbrA!WOOomBhSxpc1oqg`Aj2T|4}}PZ_pU; zE)A>%Ey}BbqKjNK$k5;6T6LM;+mST~D%ZdFa^Q{-EdDk$e?_3BdqFA*d7LKgybcDC8x2$j(DIN+qdL|8@{-o#oh(zt z6>0=cf+HxAJPwJ6V;m;49+WtkHB>(2LEtao}Qz6!Vqo zQ*rA~WIrbEU2eW5LjsJ#BJh8u{(WWbWy0NN`1#Y12CAc`{hlBUNtCGs$uNugH`31& zZsmJ7v-o;-Zg-djwv(?OY0o3>#u|GJ!%$x*O}$qRm*9x=hb;gW>D0hkOo)??1Gvb3MC*Bu$!zpAoD-j&`ej-*_0 zEn6*v(>TcpZqQGaxU?X67O=8X+V;aIT8CT3MkVpjzfDD4z)~(Xk~zP(SuEhz3#UP% z9ye09Eiyq0o#zy5=cM*qnhg21Ta#W`9ohi~dEsewr*DK6TU3&k|P}d4hZ6yB^Wv1oCzj8@ow*%%R|7^Hzs694q(j^E5k`@)vP7FGy`Uzzqr5%X7 zZMF%U|072krmxQ!!jr*OSY@m6145qmHy?GFc3%Vs`tUpr+4YdN+NpEkFH-N;ijwb| zqMjQPcG|FGA8r`(Bpyi%*{L4U8Pg=N5jitQj2v+a#6?&k- zh*@dj3LdM-zn7kXoR)l80$PUBL#}>A(+nNHxO{A%{|Ua;HP2updANW6OXn>&&e+V` z8t}ADvVgLThS~Zw4|8ELO1*D|H}*kGYZ3j6;_j-;@qA z))VvxufVyp>USR`{gPt9ow%9hU!~Q7FV+eT9pVpJgDS{0k!4uxlq%Qm;#xXMTpRpM zA)8!QA@F9Vhnu%MiD_Bvrdi4p&lLknl9<4O|KcOMT}k8>bepe}$Jwpr2w!CdFWQ!Y zK$O#tYdC|;waULzCWXkB4rj}Fz2F-xh6V9WAPXLTm`#F*E60*5W;jz{;4(_o{HtN zYX0Z$7oo8`P4|vm1K{*kgkHOjPWdhan25zy#kl3{&*hxxaUgZpEu)D1$B(vbZk=1PBWEFPzQxq-G=-@66H3F-ClwbPD}$scy&x?OrvMup7b_i`tcWaK6N@Ab zhqNe-Op{E*c9^&SZJ;6CRQ|wx899PDi_N*&j4dhJBs{8QAt3 zBKOR4`QO)sPkeh`(@DIGFC@dUgdDd7uSe5F;z7t5Db$c=BWghrzIStLp~Se_&NN*f zZoP3Q7p!TfV?Udh^RLkibWNCWQT#~jPu&7wWkLLA($@_!6xN})}aj)JnPw`y&K$k|$ zvY0czY8&Z@VUritn&5f*j{kZrmVcUAZm@PoN$rV5ED}sp>XFo~u3@4ehn4nlJm)5a z47ho&V@IH0t244XDr`MhsU63?W#Nt=yus9)z!;v#h!dJ;+|3?M*U9}s9ea{l&d(uF z_u9`ZM>V3!xP(`~E(`PNLiM+ z^zVzvIN~7=_R3Ov#yZVhu)PkEO8j$7Xzq0qzgjQ*e?veZJh9i6x-B52z-H@Y&OGr@ zV~ESBI13)_F5mchC7vWr|B9EZmj(AkAO2jSg=^t~UhP#Hi^R#wq%|~R)HQHQ*@D@& zFAY*~jSuzHC(`3Dqkd)vjJ(U)%qwYrl_+gMq|OrTEx3TUAl>ykzIO>?&5Qk)d%W}i zX8cApoRC(Qo{NTwd|LJ0-#2b}iXu9+lwG3) zR4^&D_d}ux6|rlINvXX{EHH#^ILD=KFEv(~;Mo>3+eS3sQCgr3bokgb3rkj@INi`H znA>07_XHMXugUnfCuiBpY_}7muAI8Z`s7QI^)(hARMhzs|5r_?0L#~e3tf#d_>06L zbaYZ5Iq#dq3qO7BQWVq=%qi9C#TapWP$2_TiUw2@=p!H+X8%RQvVvr_xa336tNBUX zJi(*#*s&L7MTPUve~17jYvFd-N)F4YNJ@YPXClRuV5wI@dglJ`kxF3K(UpTaaCb zqq(1lnk$sRH_9}DUL@~(pF(nnqs7Qp94j55R-6wfS4F1CDj69nI?}39gRtQ@Y{I7i zm@%W8?b6yV5HjiXp$S8#5-=|j#Pn{{3nA91y2M-a!2I}@&EFy~zYvrAjSqR<9@<7} z$JbSa#5hImIu!Rzmk&d*pms=Pc0ld@mtw_kpOkfCd8r(i@oD6F^FRg~o3~*OB28S7o63F{7~gS8k^&^Am4BWO1Fe7hL+v8m1wjFhcd#CPksD8UCQ;O5UL zV6O;+XY>cGe>4j*<;r(&8XX1LpYEo9-x+70#3FtlsHkxCsq7rR>}yid zQ)lSGEnoVqYW+4OQuv4XuT>Rn#&N4$z5q6B-4yfEAo}MwZq{X3IkBLf97=Uu|~65&JgNs52o782I)pJ#P_gf3ckoeTP$u}xyx z;Vx->298BuIy^^on3VHr=+k(rAVG3(l;c~yZ{LqX2hMIoF4CQ}!mri;Ka~9iP@YS( z28#0G?iw@%cPF^JySuvucMVQ(cXxMphXBDLxVt+X$XaXva`wJ;ZWUEYeeW~fJw4sy z)2&silt6))6P`qWYx~O=$)6M(%N8r$qK6K(KQmRvu8`L1Lgwz6Bp9C5&^pU=VJ1Ip z3SB^c8XL9mtRrvs`^G52&+ClmiE*w26?L-4*z=r~$)?X52famU40D|@?bAtHMaT3k zd!^$XUKbwC>RY={U(id;#mnM36hHOS|Fia#M*VB;*+|{S|C~j9UdW^uZ4YK$L;yv8 zCrZkiuLylX0JU0?Mc9#!FRft&#F?qrkz{2u98g^}4XVt7Hwmt{rMS=SVO`JFClgVn zBn1_&po&fLa?A_v1U^k4Mo2lV24|PB0(f71@*j5oHcfZnhC1%KCs{&F3+L+jt@`Ew zjfaco?0k-5r&zGyNIvKR)c7g}%v~j_cLMgY_~iR%@u^vf+oSWb_>2hX+*J*GUwj&^ zK1Nk?N?feFn|<%>j}K%&!rLYQ#^cwX*vm}o9B<5)3Esm~9(eD%@7s#Jd;v)yVlayL~KEG~Smfs9w@u{c0b}6bx;0Neb3-LVeSd-#^NJ z*{^JnwjxIVO4T@E z$#s#JY}hCE6|ha_}HT}LzBrMQZT znKd&%IgMQcWeA05`p#XmOFdUO1=JpmpKvNJgxz3D^kA6Q8V9m(r-vn3ndtq8Unl~h zKcQw$&M@hztIg+c^WgT&%f_c~GN$5}u=0a3b2FaNH1I~!Im4@(O%r%E5-&>h%5XRA3nl-3{iJZwDQDIoJOgNlg|u8~t_ zw{L62`gVzxdQA0{I9x>9+-d5~Dl=7lBy5OENK<6e5GD9yDzyGu#zB-Fyt|uhTmIR&d`R#PEh=S7tld@P;Ef3bEz4U8&amuii|~ zOGc3fDCaP&Scc9t5Z1Zj!DE*$y)b2eO37X)7n)vms8-M%?99%Zv^>{nqL2iZn|)bM zm;Gf!N)czPH!Fw+AAZ%=XEcLb&AQE-*elAk*1DV`(dkvNalXDZIz``-rU{DW29L20 zGPMQtO(Mq4JQqH7U=|@pNVW8Cezfuk?WILk$Jn(qI*8jfN!4C30}d7BxR^=P5X`!7 zVwRRpcFEW3D~d*U=@enu*rBygTHDB$kRx-nKF{aSwTDCi>63@dnUt@4siO3K!#&~8 zpj7Z)2Zto5v{_QP;^)(Tj3l9$n{ljmw;z_d#{GWqxo~Gc)K5({;wy;w==?X0`E0nU z=3qF31bs)#%kvjzE9zH3Ei%VAwpZf~($asWGK4#@h(^OTOHMe*Y5w+Sx}+&g zNRCQ~Nht*1o!{L>BEZ`^M&1SQ$%8{1?dInM+uN}{xq!R#25`P`3NXbuFoZE~!q|(? zFkWpkUS8F1FFOX^5kHLp`_786l9JnH zBU2#-&D4RAK&I-&OWqJJ*|c8gp1jDj98=8!v!k9a_fK=p?n5=RE;q(M?n+_2?^-;y zJD)B33KquhML2;~#9@+NF9?sJu_j>I_z2jTp~rO=2McSG>;i8~vNa$c13;|`&)JuC zN89ZgQwlS#c{>-*#wLzoNaNds>d`(L;h$agk)g@Sxl!58P5avm*xO))b128V>#)1) zE7*;a-A&0qM+LNhcILxmB*j8#fr{sSAot0#MEwmnKN{m3L4n_*IJ;(AS{h=l{}<0K z0YVVX?g9(-SUtB-KSh%c2w0S7R(%FyjokF@#f-i1#ylVqO5q|WK4-jo@p3eM4U?A; z54%K#Eo(M!22wV(r>Xh~#dDG}X^z5&Ggt@~?IULvr9FpEPR5a1hbqI?cdQOlZLZ%= zre*w=M3rv1IcBZF=K*(-L%PO$E*AdV6DX7S&^b1^Sj>RDh@ca}V~C{FyEd7N7$pvG z_Dr4i0URU|3mfNz8`DG0aIcfTAYOctoUWLTq#6XpZU&7VPAL)MLBv3o_P)mb$O?9nib86a?=c9f^P`*EZ7l~p|FvpOU zVdv1Am=gc|%7@tZ<{ymd?(AD_A;j|h#`6ZZK0`df-8FwsuNfq9ekC;UyNC6h*aKVu zvkRK4Td4_nvb%Dh%?E$O{T{l*2e_sGLeh@_^3Pu|53k;3AN}R?QbM-S2VA|rRCBL{#v^WpyP0$9$qlu&*GQYCueN#5NHXhV)bUFqq zlv5KikS0OxU|b#+X95uW7s9RQ=%HxT*lzEaN`==A#{7+IKX!VC>o>2OSStWGYAD)l zi$vId%$!D5B0bZ40s_Q|4U>{y-joDIw(lsBGK+ zU8#L0L*wvzQvUYI5_q+UlZO)iGT8sKQnkpyr2y2a3h$tZ>^@Io3-!{xbL7#M=bW$) zk#bylSr0)%<;0QUWeKQZze@7c>E935a(%TU9ub{h9qH??o3l(Z8nPZ>GRFBydeKm~z+ zT}Pz(0CQ)qj{fZG8tW7M%*vC`M5;tfpV)2b*)p?RY8iW@pJP17p1zxTc^?X_D90yf ztfntkq75#vx8))II;LG)uqu(+&U5{2aWkJkh0YWq$N^(V}=?S`-g6ZR_%on{gwLx-)tO@du;20sa!(*jXBU2K_ zkQlS$5v*Jtp3}K~o{JnZ&1ahDw>yRgyEI7tYz(wQ#L(z(2%I!0w2r&k^U#BJ!x+g* zKq7}$`)7bZr!;>8&-`UwIvXh@B~sL}T-gI=S4%K85(pw))#<7rCwuT-|Ax+l$b|S& zhYJ2FG$S}9t?9C{G_0E-wTw!e)Nw7E>iUF~R? z;A9G$KD(;>#Gz;@Ss^f?WTOz`VmB;U^T;t9MVWfz&RZR98i#AG{s!&r7wmRPEFo3q znMtko$0wb(d;f}D%cvN0V0&>E8Dm(JxcAurmDn!{;|08n(RSvyOt#!=`HgrE*G3*k z{8g?8nwif)v*=ue8^AtTf9v$)a>a*E%MJ!~ayKt9mb>9VmlqGdE16s3z3X%nKnjC| zy7}js!bhl|KX7jVYNt+k*XHJUR=%B0ZkNXbumGhs<}{3IV;H*DArXf-|A?7N&L094Le^LzY) zgz{hspgJ%&j6ri>y7e}r(omOfJW^DmXg?(F_yo)8__B%rq|eD7y_yF{M|qiEBCTM z$CPU7hoE>bBu(qUzR)gd9Nk`ip1q*PNGGj>za7u?%%=2p(#nwRySchX81yfZjnRNM zMqvAn03{8`?-n-pHQA28J$SC)0YytnyN}e1ot4}3L zB`n4*($H^mVyV6WJ_AX9reG~CDHk3nZWKCo1GqGW_Z{2K?*HfUS_dPnl}Mps1}fF# zWac-cx0)3n>DKY`@Sbp>D?fOsEzFWS`oFWa@K=c*d(C681P!-6af7}zr|VubW~X`o z?z=uAe3rJDF?r%n)M4wSXOgcGvf>s)&@GD8trmI9$MX#l+iOPrLD zq=68>*VaN~dg^P-l(JHI>KHp1wQs(^o8RUNXC~Y%>?G}!-L|eV@~pZ1+S?CZ&MIITYpijIYZn83K#*DDm<6sy)S^v>?D?~5 z+Z$(Q*`?op7EVVw?QL-~(AEAMKf-)cPA8yr> z&sy9@cVH4$6e*vL@_&KSPV`~eDhkI8H&I+sz^;sF6+smB;0G+$kQ@E8zja!HMTsn4Qnp)(qjS2cdqe2geYm` z`M2y!qp@)|7nPpqaUkC1Np`Nmg0?~o+33#XeT*8Yo! zSOj`naG($+*86qPk|yDQrB@1B-%(x7y4hJ`Mb9itPae%Hklp9(|5xm!XWHNnom(X> zkq-Bi8UGMxHLy%{7pXt#l|MeJ6k;3Lm`wV<22ED7_W2fK|WG*k07aKTxD5xbR7v9 zI^ZD@ZF}(6zbz4Q{$+0??T4xTt{Zr!j)I;qHz4koAfk`0QL^o{bAP4q{3|Xa z;_wu~uEJ%`SCd!unS}Dpz&xT#sT7Z3S9+ih5S;1v34o(ZTI;CSyV8qAXKB4s)7-_7 zb<~+lzs?)Kh9}qBT?|Yh8Ut;$!#k~m`hETz3xZuctWz+m<{_>$a(A=lc!iNTCgyr# zH}J34&S1bhOr4-;E})ww$uKK%Q$|B`e!>9^6(W8uu zAIU~Xh+s~Spgv;Qj&}GM2(aV^ug;)cO^|DOw7-qawT-}G+03{#W)K@Jx2kkX(q>l_&a^LL%J1zPiT>~%@zqQEAj4IOi*X1h z@?YXE@{DVgNKL@I-qS}0u>qP>w%*Q~`yY(p zfJ2MPeZeZoqI3Hzx4fp#wa!HUFzWesi&D0p#YMx)A}Ub6fAMRrQRIVB`#f32;a|Z- z|D6$LbxF&t%%O-}2|pFb?9> zwOZ$B?PdH$5(NuzOa(u*5Aq%T@6f`3JJcpsjANNZA}~Zo;|%1otBn~hFj#d+IxuSd zg{3NCVS$r<+l63y>9K}x1vA4t)7)+tEYLqmTK?(OjK+Sk+1tGqW0b$5I+aC_Y*{on zS{Rr>G6Jox!9$z^$|?lj=Rw0?W9|IvMf*jL^l!Ez@UWwv7qnDj+l5>&Qwu^~wSj&L z!`qz#N**0Q?n-`5xAQ9=x{SovIfi>PeWcb!+4ELBoOl(u>=l&Z0qRDC%{c{7{SPwu zQ{wW*t0Ts?!5N-Z%mv~~v!(V+PDq9qP>mIA*x&ar|3cn;-;#M?lV;O#N@>_>+WTZt zc|@;_!u0|)CNPAel^=s%f_ZZC~iKE7GpgGke}3c5d@KJnxzu84V)9913&i3-3Cv|uqX9f`%wr&NDN<^Emv$`2kv<4W zZD=&{PM_jv%+Vcrn$q@*+eQzPYhWOML`X3Cw^`$=_H7rX7=#m}x2Q&Km#f$n{BT`y zss>gd7T{tV9(Lm+sPzAUQKb>MoFlKwY<`m#kmI`>#i^aHS2f4WB_RQgyuv&kfRuiR z|JzxUz>>hKr~s&k$%acZGDimpspp_f>BDJ`kcFRPc>%vs)2=TWV$ynk<`Uh8>r$x2 zatdvg#4-RI-$Q;XTL&$=^L{793)J}*0jL4|aAoV`RKdNwk`CyTmtShb{@zVeNMHQV zo{pJ`k&BT5jR6pB?-_P}QnZakEe>N^XfJ^^F(kS}JFGs-dv+w1;rVzQszn6g@HyH$IlQ-;7!)f*!QnkTL zp9GF#sWL22TSvL&n(={za}m#ufJWFd zhtCzAi)tlS*Vbfy0!bCTbH~6v;BxMFs|7IteP53o!8!kDw^uy!QXKJ~%0c6M3)0_(woON}ykVwDjelK#d-mwMt9~<+*cU92w$5XK2bU{b<3QFOc#faLvGw{?YpgCf6?w$2FSfkag6JHUK zSU#zn&AN~#;1Ymkx_PuLlopI=-v=su&X%R>C5a0osgq>3shuVjF3jjPB=b0mJR@D% z%3k&+%hwQPgWnz5g7v`8EoDF*kzLc_CQ0fn7f3>8*!39fUzB=g!>%^2a=`xqwV}U{ zqKP!ZEv`;HDL2Dp8vK>`o1g0x#!hmTyO12}UZsV(+-pAnb71(6OlQyOxBCv!Uj26e zmW53Bs4z|-^7PclnwgK6(5go^%Pfd*mM>@+2vWqoPBjQm(_>gm6$l{O^1sM~0AQd( zIaE0eT%6km&+sP1XnpYZ{o;+r0`!xp97a*SbeDu#JT)ftU~`X9ihQo~2BlU*)fAL1$jm6WX zXWj$;0$ZT_V@{l2Pg9yy%9q6}@W zPB*m9G)?J244YsvdId^Ap-K0=KPa`&XegAZ4+D6}P*+c5kFyW9D3kVq;stb6PyZ~0 zz^)7N0t0V}z8Fiu8cY!Eh`sB_b76;Mw2y)_)Rg>hUup8C# z_P$e}b4sd>g9JuK@BASdm%62|Yjh7t6BV?o_RjdxW*~Qh@aVpMN@GO)i2Js%%y*9PHTjyrZ0(RVM-G`l5HO;Gq6z zo(&Cy)Pgd2vTCZnx9Xtfc#pQi%Yvft`+cC&LgL9<5yT>FcK4E z?+;(TtH@n@i}TKi;veQ#gu&xWN>UN+TBym8|6jx47HYVt3>F8?G;3ttr#9ft^{;<{Gi| zTgcceO$Pl8oh2Ae3;86HE0kBiVwz;VzuR{>6@j~?7v2i>pP`{&a<(0$@iI=wTvi66 z4{aqEv$DnNwhSOMy*NFgMZSz~@9E@{SfYxUqLD%|EQv3Ne7uG(hp4yp1KlNo#}wHD zS0>dI%@E?~SceJP`&yNHIJ zPjjy{y1#DGtU7_aAWhW_!?{UAoSo=H8EUYos-nAfW_8dSC$qkb+Vz?_-ji%BPOnV< z1}tkeWJ-dj!e3xBO%DAxp9i`!`lYLQaz=+LbXbJzq?Tu0(qNWBG+RS%9z3&}{T~tlAH8;{P_eLQaMUq;sSm|IUr~dWk(Sy;$-PjQHX6 z$q^>!%kzDP}YEU<|eS3 zc;`WzxZBZ_NMxB+4Hb^s7LC33o#oRdb5ruCqlI&R5C0R;3FRN~jS|0+c{>Z7S)*1( zd@k00MOJ{U147@YXUlo@au)s|Tig0HgX2=+*Z}|*Sg@=2q4$*O-$v@-D~?rcnTI?3 zrF8C$t1*K$>d3;+f6bfDY~Y37;rmYizzK4LBfMWC6gc5ZjM^K7CsMpw?yZN>meWQ| z-v{;yOIWBsBlVw6-aqpuI{+&Cll+uMwpW0apiW);^-$u_P+e_pAOHmbNJ3b9r@rm- zZ$o?3x_!`jUZCZgSH-2%!nd_&)i;cSzlQeXad?b%;F8Y&5r!%j^62{(t+YiZEstaG z%lDg4?T)zW(bBOn$-e*>2Jo62z(sNBA9o|&0v!GEa)aNdXAxSC3RV_=K3~5{DA)~i zb4bsQONUE^1A)xL%bz0B{<&uvsxQL!(zi2V8lbQpj95@ah?YfM-rdjsuzt5d*){Z#6OqBFkE3;f7O!C zJWqH+J`2CAbQ-<{7h#z^Ogru~B|~m|E^G!rlPe?-_ZT~~*8Xkc6;$hC&ygD_+Px8_ z4?${`PN+#|*8!z*{y>#(@J6CzOvQp`$`J7jgU4IDyob)Yy+p9F*y2SiSco{;HC~7f zw!(tA)d0cP{FkzsQ>?`)S9zjTBA-8Y`*Jhh-X0Q^g zBr>nRvTtPAZ7mMhNR9$#o8i(9!F}IXJnsFEp^m)@15LXfG98rE3(8dN-;O;~eidsS zMt&#xJ1+>)-d?^@K_YtoAu$OfCN6FAN!7_TzQ#BPVGhimv=+V*>(sl#c;A<+46&Hd zD&soaWh-V1(wC3D2o52XFzvrVvKA;pzUW?f+smdKZt@VWX4SAXb&= znG)njCBt6Z^;S7cgwe08CUZI!q2V=cZ3@d8>7D8&ri&dR&XR<9f}v80-WRty;~h#! zmGP?eH*;>He{yf>n+bW?*~=O8iP872oN9r^)Sw|$s9A;TT%7G*c0DC3^C}V>?b273 z8Ku;=5P3952QQD1k7K|)udQuzviVof4P463JqIATCexBwEw$MOjXj(e){A6GOHWKn zj7ri{i_c0(8V@BKPb!nw=9WZckNH2jn1yyAj%E&rN|FM)Z1sx|Kz%cfZ6C^qWc{1FCRwod3_>u(djYT2p`@ zfUOGe=ljZB=--vD2tXBtwM?>D-0)hC+uD&dm{ecS{T%ZL4}Fa=v+i+QZe!#b{X?2_Kf7*yR1qu0Iozg$>fKHj%o-~JS$l-hqIType352|ZKXCYa zgvseK!M{wyI^h@arY zl6qyZfDZm_)O^I*`a{MQz|_f$uXQY_>IVU3CpyPPwKGu%((~`HukD5F!0j0L^2mEI zb5iIwRyL2>NB^)1&N~s@z5Zp^;<OX!6rPE*dhu;lpv)&)b_nwN zBkiX^FC?K6w5*uHGVOgR{_E>s_d|e|WHq7_nacOU_>Q0S z=8r5l86qJ*?B^BL!1@I2BMU4*3n=IRzuG25Z{huate9;qIPi9s6UpW}Z~)ccXAyte zEd_w`znJ`=X4?gVH#i3PLAj*04%tT=`BTRRLk{+}qGcvlK6@T}I^4$eKA$+gB?DRq z;o;wb4F3W`zA-$xHbSR=@*2uh&Qv(0(Yn2~q5~>Mg#%g#mj4^qiy@5Efv>Jsu!e3L zDAIV-da+X6rg?w)Y6wpv19Zd-udohG^*2@kDmS=8?mldeYl=E_ASzIL(u2Z@%lY+r z7&n|0un_`Z`!DPVU7fRAMpElioXD?t)8%#@)2_FlQu|}sk~jgc>G0qG4QnJEP2feI zXx2hH!(fib!Q}EC&+A^!ad~?$Tn%VN4c_)YWEk=qc&?{NSDsvOQoQltq&TTJ-}-(2 zM~3ZW_^x;58vSkL0<^KB**fFjJAotZjg8zh&$YaHtg1_6d$t25Gl0(F;KlyrxBVZ7 zm`$A|(`cCUG_v9v^r%-T@~2%?Hu}pUo+~n-|Px z(ftX9{$yNzyis#NzsG4!#dYy%bvNbh>pcDb&s5K%38;Fucqq2=2{d`2!eou3Z&RJ^ zEgd(G>>2ju@>1b>u~C!-43bnq08H)lboeJUA3-6#9!j9dhwDpyTURfz<)?+tgSAKg z>@;XLxr`)}!aU3~zYS(Jb1N>+uvL$N*t|%Byj`q=MCpj>`z&Qrl;xzGAVqZ>!P7!6sNG_+{S^nZ6{f4J!{qQ!QI@HYP46 zo{(&M$(v{73RVbE6K;ilS(-Nus*5%bi+?aAJywbBUfY@9sPcbBrfkk#Y#*sXgBdLO zDJhzbmBz;apUbvM*a?8k4c>bgLgJw16AE*QTPHc(xFka<_Ts`>5U})R$gTnyiH0nt z4H7T7g@ns=v$+iLH|uZl6RC@`kQ?T8pBgR><`&eR%7-NRTFn4W_-zNtfJ9+q>IQpI@Q&8u{Mv z>(kaH9NYY(`aHQYZx`LqpP_2_UIS$&<(tuABJHZPIUl=I>KYS#Y|Ae7VZVKGKmB(6 zgF+;UVoJ-0ixmBch>ek)+;|HuROvoHlnol{EBBEGYuwo)!&tZkpB6dcIWRpOdEGfB z8u|A+zhytU2|GPjxG#eCX5-F7$s<)`S-JJbqtA337rh%V*aS&2gCP=^M!J1M5RZ!(s6-EPE1g+5TIj1|Ty{N1>?hfUwmS$WG4yHBnYI^kkdu#= z6c<}iRT-uMgED+zhH<8{YdGXzP}w#R0d+pfX;q%{B8vwvER{X=3=O7a+AvLGFHEK| z)Kqgg-bal^o0bvj`B5edEyCvW{tx^dcnWZLE}2M(F=vWOz;2`=S4Ry%YXl3S0`ZGP zUUuWsZ-ZI@)LK2#{;+?sB9;lOf7nsC%f!N-!zw^GOwHet} ztc~_g5kVC;!_C1>6OQd+zIe%6UXJP7Kn=!0ON4`CBq~Ee*LKk?>z#4Z*J@BH$fVLk zYm3&%MH?-&r6i15rdlvU2btt5FsZ;O#M_kFAZ9NJ1k)kCL5+_2ErOzIlEQl7e?^l$ z{xl8B1igHS`3DS+sQPp zk+JOolCAAx1^m;b$M2MzgN?6ziEawhgfq>5DdJgs-*f<&=*OuXqz2({DPv1R^U!Ka1{p!GPtoG8zrl4dwL3L!47ljZydHiJ zl%#1D(Ao_I%{caREeA^zL8fFt$x|6F)Yz1PxY7}5yH~voox)XG!8crmFyq&QFSG5@ ze(ip1YK&QBneMZG>?^deIKoYZ6K%eChtyP zQGd%5cBxdnGVHXd68vcNXjw?Gz>8!;-->|T%_**98_B5TaX%8fXt0;)Vk6^33z$Ig zDIXMKpbPdV2j%UbTV`NTHUqVIE6ieCG90CoSVfRaNfv=VP84xSv^QBOz0Z4}7DB|| z-LREj=X8WnEUVdU6{Vpy>HZF_4B;$Iqh-nRRmLa%&=FYAc9xZ>-Du4uJ1(?B^0vRg z$)>438@d}*x4_#AucsY_e+-pgrW;gs9hzec2Jffj_hwC>q>7*(IW&2}0>mB)NcQgp zVVOYsR`|(;>p<->>v{=%ojwJvb&aV)u{^#)gx0-)W#~P`7eO6>=a!tgFIP+NtL?dK_;-o18y~_7-q3p?S)`{bf-3M=H}^=n=xTqOKG|73R88*} zBfnB>I78c^`-r9mVIKi&?;-Q`>B7LEc&6`1kcrWu8}c%v>Wy=1b)q0pUM6cTz?7@t zgCy}9R);JZO2v|y+U_702K-eIP^a-uTU8Y&&$`fCB(&40pYW{1UqSx4%GZv`!@ zMl4^ay_gTOoPjqZFy2CoCNj{WL$Ia0E^!rbE*g%E8hg}p-F(%Sg!Zzp0PhTs7n5YeDW#^NK-*RRyu9zP zR=VmsZQ3wDoAcI{3p^Sap`kg-t!7j8w9_U=Y4xSWM<~AI*b5NmhfJ}ZZ9 zPFq>(P1UXt%z8-12Ao-n+)F?4Z0<68_}tUvjR@8#9O5p zCj3pxB`lTTk?j$qeuH2j9Z&gh*=re2b2s8Kg#0YkzR6#CHvh#hRFo|J`9yay zYZqR?KR@}AHSUrDf^Cd4cWPtzIsKG|qinhUE`-CXts6eG3+M@Uaq0_BWd>jRKnVM3 z8mFixQ{GsP6DMIS3!F=#c3~*LR+ejN?>rrq zbp}2-%7O#PZ~LwEIg8YHorGwIw;Y@iQxX^;uuhN3DDy;{mOo^+m)a> zGx0pv3NH?%n6yJ28Z0v=$OUT1k_F9VTW$=tsq5fcI9dI?2*2t$>_`Yf=0`gw-B(vP z8A7(zKEtt^_-$^7dil0QchDog*OZhs;zApD3`cK2{ZTq|gXc$w{Nn{OHrJThgZSZj zcN5)p9D~~IhN+V!hayAn3pY9G*>#tVZ}!L@4zjnVMRzdn@+xA|$M1TR6&$&S1X+WP zbp$qd;RfD8@}$#-FPn(`*3wEDFjWZ}H%R6i-T)C{dddwz{QC@l`QUoZ4g_JwSfT)N zV!XC#FANxn#~obGG6C}AW8Hw60PWqb+RBv>fcOU(w{-&kpPy&UdYP<+{l{mTF+zZW zXn?^2*TE9l{tl1V%%9F(H3D9H4W0uEpsP)U83&2oLkNX5axwcxMomv%>x!rYfk;b1 zAf;z!O<-wbV@p6m3mrRy`K9&&69%*v8kZCRAgE=<3kC-Dg!Y6^^uQY1&tTW6 zqOXwV6oO!Dd?1WohV-F=YtOlK%sLd7^kbb` z6TTM=iGcvM7j+EbHd-V^^=k{}1*3yy7W+u|nL*;ig339DjkFA!?l5RFqta(dzX7P4 zIZM((gI?ZSMD5ZB3B4VAfWR{E!6>=~c<#-RB#-v$WJmoiO?uKSL_y%GDqB5Rdsd<< zIRBopkj7C(ZRWnpmC{daa#%vZHA29)Hs)QfYKw=pui2A}Q7v))u5K3Jex;Sf1Ed~> zZFw@D=9%?eJ5t)7Q9DMoUYT*^pisU`GXvp{j(<(I;P!Y(5B!KLYM-VZsOM+TvF4bY zq^sblb@F_dinPU)f+o?vIE8O!>$zBr4olY$+IuYgSE9l`$vV$*mS~AiM>bc=F`ms+ z9W}%0gF=K9;)tr^J-b4nLL>UVI>#j;|keP7zlt%S^=+{#CAPPQs6WJPvSMRrB` zJuA(%VP6I6aOc9A`EV?VInZXoYtK$v6Iq)_TSLNt4o6!`-%v2jz;U*4^I8%$MWt;V zmm-L;zj-xIzns>)10?lTXihb3T~y&@!los;rwR-8e^GRW^~lO8L*=`#rbf-t>5bZQ zlz}Ae#wUBIeiz8#(Bp;b&0$aI6AkCla21)}h6sRmNlUe8TypCb8yLUC;-Rl5|C7Di zvSaiz$gYOKeQTHem{T(K&K{i3+G!)fV24Vanw)w>;U{xi8nG={_wq4`ON66+ZWAm< z3^baZg_pD^HP~L-ufDcvU@&UWieb3Txm0Z8-6{Z3KrBi74zRsTnugWOZ+!vgp7Ri>zu#Wm97&}O zC1tQjMcpaHAl}`zZuo(!w>>5IbGCeFe2Q9>YB(v4B!3cs{E-|cvrS1{18QJcGK3sT znp%!*SX7COMvRJroLbf=Smu?0oIy?I5f|vo@t2olfXRDhEWGBv^~yAicP>=WS$hr3 zP1Za>*}&0SP^(a5U;y>2!bBYc`yjkKJO$9~TRH0vV^u#`?HU*sp!N~G1yFkc83PiV z58GS24d(z>n~dTE0rug^&`CCkH|v1+j>6sCW6q`5e0LaXj4CyXaWn(~#7zrMxDKN9 z=iBH%-(sT}@r|TLCMQGIRt5=&28)_pI}pF16#BLM`TE8CRc!2n5muA|l_bLdJ_h-C zzQGC9`?kdRME`>e)WOWkwwnJF0Lj|G($Ua}fYZ{(K+n>M#*{lY3xHAE0qBQ_jfY~W zoq%$Lh}A-Jsue^|fT&qQhuen`cS(D)x)*a6AllkB9yl6Hl~5zbWWB4V)?GR7?(S)7 z&QM4*yW%_592kFcJ)^(a-7Uy7%M<+C)_XKT1zCNzts$9g|xW`@{tsW z6=>)!oa&go>H#zs4J!WfLenfCj@ zE-Q|6Gtdk<>gEaXyOuOcYk2K?wb0Q!W$`nI@zsdB!pASmLa1W*?4^^+dT;cu=ug|r z{&qh58w7(r5Ffzbnkgq*z^h6Hjr|Np9xDsBT^kHO1BhLOER0QuYJ)L0vovxb`}0IE z)&{z~b^xXw>@W2?9-tZS0t>$rApu%^TfpnU`QaZuv>2NQpsc+Ei~+~?fezLdfkgsp z-65j?ZW3c*gp*xhxBn@Vf&K4gMnB5ry_Zq{C?ocF8Fgg@s%^-Rb6(O_66TGb0n(AN z)OxiJh70t>Jj2}sGN9t;>6r1k<29`KnaeO#CI&Q1v`ZLqhAa6pwD#lkiBZBK_@I&94_ILI^qxnTW`cVsk&(SW(!m%^OXX75*q zWnX?@pIR$h(r79c5Fb4m$2PDJj7yqD>|xx3ZJ_I=iE;g~Je5`IU9~Brb%O5lc#~SZ z0UpfXUBo34jK>D@$BQcJNqPwodQ=G89^a%f8m9|8_2b3T{Mv=#?v2A;BKrU)W(0e) z=Dc=3gfyJAP^=foNWW4q9G;-z*%RW2H}CECYp=!Ihi%M=pGVCBil%kuZ6$WS>6|L$ z26J}bfs?!mMFKoKPzaW18n@SfWZTKwG5LQzf8^UHNEl$}kurXDKO4NelGKao z{*uc?f<&Wdj|3mVPYpp&_vs|#;2!p{9#CkQRT7%o493Kr`(n|$89|P5Q$vAKZ4&>B zJ&M@PK?BwGxqBD>d+!s~CUq{gsFe`}MB@>}V&`;SV=u4{3(jgM*wlqiooJTPYGl9* z08vC$a|7JR`@J{ocFeHwCk!){HOt@^6E5Mm_p-Lu*A}nlSC{iTHAF#I@6}#z{DObj8F$s*2q{}%v|o{(e&bWAeFc#+rtBxESj^LN0NCnNs){`vfef@P`v+V zsog*E9o@TUCz`ushp8DW1+&TOo0tj(yOsIof2M>n{)v9X&BjwnRG&lCA;>2I7-`rA z7UxgmttT5Hnbe)u`(Evyv_ryUBA@h}!X|)cENRE5@2c(bE}ylBy0LT#xTF7%jf zQ3_E8rclZQK%)}yu4fP#ran7vgA}b1zmsPI8ht0f1Xe{1h?NCo#bN<_{W&3Vv9hEw zu(bu6rEXx>1#S^rtX41_Lh;C*x2img4Fz^a5kT8Ig8UPnC=BS^|41l?%tbxpdy|-{ zVBF38_4Vt|EN;F(654`sx+s1Pt4&yoE&}T54bdvZVvB_ZZbmiUQ>+5_kY77_I`&36 zWxvOSMq`d$1m^fkl5nS8!B_$2g)YW@Aceg5%-+fI_YV2HaC)|8G^RjPd?}q^s^cx^ zz-l(x0?QGY@QX0y$n4$gz#s9{{v4|Ok*psW6^#AyC3)i02z3Zf%gMOru&Ny*@jD-f zdvf@vJy2h`cen^p)7ui*64*a!tgUPe9p48yJu4ua?>k!_=ntkjuIhuQW~m*~SWdIm z#IC^qyYw}{WE3p;NCzOwf1jCt5Um;qpyCXKZt=Ou5ERniM_BvQ;V7Q5T*hty_)y(7 z_vqOgM^4e|UqHaaK)+IG9l6D_0O#$EViD|v_~8D1>H34t4;EA=U@I?CNqSnPUN)Tv zB8a-wQIXPWaen~nO5dwbo)41GQLrRv-zpV#GSTO?clr+z^O!4V03Z0j-;(|zQ-|t5 z3QimfKGtMiy;x(auAk$Vwvt&r06jp$zl02YvV*|>u0YPe75GPZLSR(Hu>#xgwHLbg z&-ChOCPg&-M9D|YjAZ}IB;v1;Kch;#g ze2mt%XB|S10S!rR!b>}~Jb+ZdYY4XG`kz7I-+4lAeKN7TImW9-V~gO``GWsnPs9H)Y1WzrWj$-dKZt29f&^`;8fX{~gZyFWRCHo8d4k zkDR4g+~baW(VK{D#^w*Me`t44z$Bdk{5<{!_n=3su*h6zRGrP}#Mv7rD3FA_`ESIqc+LXK4S( zF!E^toiDzWZIkkjkyW~r+u}?wzhc-}QUYi)4o-C)SoOcE*YbUE-#MlLII0D-#uzV} zKE)Wg_@jCUlW>La)dT-8coRGrdCT1N)J~#=W;k8@C)f31{SWw#1-$b+ocX`tX8c?G zC63)QaO@1lMb#c+PyuD#AMoQmc-QrhTMK{5%@Z5E#DXxdUGRMu1J224Y|9XSul1~) zl`Xj#2WYqmW_2A{?rqrK6&r=WbZ=}eb<3${zZ9c7k5R422}-*<`-uj*=5Xb ztpc(%RcvhX2;jyR-tzxV8Fk;fe@&Zs=h1AqYF%>aaT=m-;)61L6cWbz$Eo6fpp!?z zKl@a^u5IQ%a0x&ZZ~O-TLh^xrEP`)81o46V`!($!I3)nJ7Ymf~@X{dhS52zOkKKqb zU$TZt-u;UefO;2$i^*-E&*(0W@}$mSDXdnq+4wZ z{YHd31flsa33X7($H!KaqJpDn;`$T}cW37cBHkrL1fUjZjD0elwJX@iL8iN&2+;r5 zQg`~{k;u*1KI_1u|B`SBMdkagf(}0psZ{OhYk|Y@_jQ)h>tQWP0MMNt{N~xm+m3(l z=oBVMq7|i3>H+0BerxeHCGZK#;~yQ}CN8}6IxzKr*Tae;v zBie`koz}vW{F_a^_Y0fez57=L zptjp+%%v`Y59%W%gUQUixgj;662zJU_E6jQsCW}_?l3XM-JS44j)UpG+$w(5e4+tU z>i|ULzeW+P4NpJZU+$<80&w&VY!DH`j5>6GMiB&aCV`uI8J-&L6>pJo|1QLq``!=9 zk|E55R|8&u&PdBVM-#bZzpd<30{X>hgO@iM6I zyH{YlD1efp&sYC%wyt!Q^z)9N*Bh)DTev8%-oS`%vp(3mBvbqUiFWvp!iLOF4!=Q& z4SEs380n;@3hnkSNf~5V4%C4H4dB6?{Fke|*VG9i9O{6Xc4N5A&w>*v<8yjQb>hc( zwkr+4^?j&4x&DskeNWuMu+NEoG?<4_INb^ky^u_88X{Ey2DK;}Y*Efcm{OsOae za{5Q?#+gvbHCNM^IDi`GL|Ot;vjZJq#ig4 za1Jiqk{iYH0JiuRZNT$@=)riqNP&pGTMv~4H;!yqw|~zQ2#3>stCl#a`33Egw#sSYu>3V9GhfHo)CPHE zYoS?21x?C+uR0!Up1ol-fwZ=su{1|)NI#H}naGGV{>Ho03jnH9V`yUEm|8+a*owVs z%JeBh*#GG%_2uB~tkk1o%SByqcuywGCB=+q1tvivV0~?vb7Yn(v_2GlRF(Fd{B}u_ zMg31N;7<8K)Df9qm1i<>(tb?8KBL@=6(typu&mAsJ0_de6k@LiS zsn2d$Q9U{7<=bzMBKRJ}yojQCGUjz7uiIpIY!TONr`ypv@1Zb6y4zhF z+{g%J2sB{ysn7S_lMd-<_Z3loL2d=sGh~XtANm(J?l0{hPrntl0X0n)GQ^mR2#IOm zi)A@KwToRJ5#n790R*oqwXBUy4ouFOaBl1@Bd@8%byrNk)-Wm0+kNs-tYuPgz?77o zfV<)N^>u_IJy}l#O!XoQqclsF3OPm5mTSB;s=sJ0@+N-`%aY85q_L-g`MsPzW-{&oBrD4dK=Ol=A&+(F{6<_s}AS5AyR!sc!9yL^XOYq zC2c$vL79@tCgZH<1~L-Ot>RdD{@s-2?dj|g&irK*h-7zXa^}uNM1^##yTW{C{Dp>4 zTN<8*L}d>?k}R~l6DNx2E8Q^;2>j&lPM)t^_RGdE^!Lx}o9pc$L`n?%>$dhDPKRBp z<@~G<%gvN@W=VV|o#C|Ro0y)AJyS0BwjP^4YIm@lTrNBvoIGE@VK)lswS0R#y)P7x zvQ-sCg21T2dk)v}{+fjI>hWz?e!~>${Q7X)P-Ua@PJad4-R^cq|71JXAuXL@!aN}# zCI$1WmfoqEclT?u(9h=3(1`TPYD)Xh%FOG?pS*&-PAD$<3ilbEP&a4WWbk3>I>SPB zD>y+rJve;nuY&|GA*!U~;M%-Azd5toYrH#!_7#U=NLTbydD zX-WWVu(yPhlarUkk7rtTs9daU--{v47+*{!vd;B>nz=@H63OH2ugWsQb2Ow*pZNqC zY1)5#X1+N^pt6JE6|);Myw;!GOx>S@a)Pl3un?YueK%1lhtp1fy}3RHk@t;!QPONe z2feboI+!zl?dA*>kmVahU9iLjAMF~JLGh!iWW0VGCOSl_K7JZQ%-_*jX@VOy|fMJrn&4h33TBKPPuUg)|9qQ7wGy3 z1QRLtfNUnQ(m-zEC)|)L7iM~57QcY|x1vwp8}@sjX7~U|hc_iZe*^LTGQq&#R;LPs zhX!XcQ6Z18f~oQ2UW+n1F^li6oM(rG*1rNL5DKUQT4`JrK09*03N#} z_uT<*>RjF=jBJv=pwBiFHgwokIX;h(XM%Y`QZPCiA|B-IfK!TR_g&c4ZwXm&>~TlY z5lT=hmrZX{ekJn>2kl8MOrfgDG|FoH>5JbXH+ConRq?-T0n8P7E9tH8%dSZmM!V8T ze+tL)WwXihf(V4SLg`NkJUusG8pdU|%h7td-{^~;>0UACkIyrW^zM^TfLf59n#FHV z!LfhFl>5;`I~}Y+WV5$$$~4~}M}QYNE!y=vxF0cWU0IBLD1}vHeZn@qYe(~^E=|~C zwDFM#sKi&hpC0rbX=z&Fg(6#5!;?hmL42~QRXxUd-B7veqox|0Gqp3-Q4} z;>BdcQ5;-++Q7{1$G33an?6W_oAW84Da7H->jK}A3+QDX8+QvDsq)##zbL=ONp>}2 z;xspm3=XOzVUGTC`bnkl)(FG+R`@G0X8MnnR(+b*NV%r=UT{3Cy_d(^OS5ViqhECP z$@%;3{iXy976fKe5niKm>8r(wZ9U>9FsZf(`DpzC^-zNB_VqP@w_?FQ}tm z_Zg`R@ujqibU9&QYM@rHS)CiH8f|zJW;s1 z1I7bAFDodOS#;F}(dmz%)$S~pVrS@7JC{n>mTnrsLe<76hPB{C2+Dk}H;9n>qGW<< zy+N&aQ^uH=aWQgkg9h5`Q9}tm{z+T5k833*>2|QTHuj*^KUN|%+15nt69EF*5QU^; zMq3fs&oS(#h1FZCTVmf1^#Qqcg%bD-6fj?!mcc~||3TP>Z32k^-6aZ^e({2XLT%3sA^@IMoMS{azpj5b+CFe? zvbCcA(_=opl&7DTWlq=lSJLEcwHMd=r+`tp?lZfGHe)(UPbCP}v0?`#RFP6FKx#zT z-1&jC2w%RAbKX~%2A@>8(a6I^KyeFLicMmTN3LbcycW<5oDE=X&GZI&#ZSpr?gi70 z)(I=aR)ywUs`PWs_mR8??;m!JOkk}`Z%{{!p$!hMwJiHW8}=FslOq;pg;sqc{Q)94%$TppZ9 ztgXBym%1~HN)sfQ&k`dB>&ME8Dyoss5#*p^~ zZpnQ;${xewj;LS%plnW<)yXakNiS_6sRgM@pEmRU;(C3vP(m6*!hlygiijU8EY^@t z)(F8ley6n*Rw--~F$_&OqRKI=5oJ89^NT=Rsz`U+AuC_waKylsqB1R5_^~`iw`33B zDM<(s;pmXLaw?k`d6nZ zW51f^p&~+q$WX572K(NZ>Om+78YRruOQj9=qQ-`mRu8EKVJqp4-lZdJpdw<=pFrd_ z>{I)FllU!c#4d^3^sC9zzmaMS^Qeu|y}%@6&rQj;DQ&=wq>zs|nF_O4Z!eBd5q(H+ zS8_ULYKa6#qFnCRs#E;9a0veGkjx6g=eED_N5`$A&C>u8sV>@gw3_^`4pPk-apl5km})$mtn z_^_yXcN`oV$lsy)Q(>=rNsP4n89Zu})~k^O;YYuN#Fa5g1)hzN==Na<&__p=U`V9c%Xnn46~x_QwOiD7RmSAmaTw8xFf~% z!>Cp}V&f-`zVWpvd*$bPA;V$W?0g57k-X35ifvrvE*$0%nwLp*Y&xr0b^j0V5`4I%r&qOZ)I@n_rUpAx_xZT|`~rGY31f zQ3ZnE6!FY7KmZ};rGQUf2L!wP<{&g|Cp*Isyu~R8yG=g`Uiv|M%3&yhI;5P1l?teKl?L#zc`S0U z(X`jssI~RUvo!?J^8TN*!ot5D25YT%IK7lOD%C)R81|#MmSv4Xvp=(w%ue}WSrtaB zbI!-2{A$zXVoBlsAt7BvOkC07NnU#`z&%%AU_^r)mr;gSB?M(Y4$6aBp{Be;mg@M% z$9SxO~&;T!}|!#lTf1tx}TOa3Wx}`>Ee% z5w^k3iM>oU`Q|)*K%b6<0pp0jfiX$BCS};xV}Y8)k2MyFz7eg8Pa!t4N2<1Bz8K21 z2y3PZiA5x|rrYRiY3+UZcW{@8MLUKF(pL70cG*CDW7l3p#a&@s*=xzOlF^(JB-W zB~nbW2+}!;a+%sT#uj}|e684VdileN5NdTyRL)8gftbSt28@HzFv-T7v*fdF*W5PJ5wo4MhN8=>|rfYosf_9 zHVMy^a}!Dk_vUkO165iFayNC7ODyH0+1+xXU{1U09*W!S8B$QB>z6FeLVk1Xl)k9FMGeEcH`vXU&?ps_ghh32l<8z&+U%v-K0+%cB_R80vPld%>U4}L>}gP%}a)r6GB4-#b@OAj%bxC1X3@oCuoiq*=x8@GAz z_1L~XFj!e-l~n6UY=l~pdEzXgvhRRf{F^JgyT9_p>a>&Gk|Ju@u}c#(f1)Zj`8@H0 z{P1d?k`eY=%kFV3B8x&TflcX_GQ+{<3@!Tl>YEK_2Q!8C4<5Onw5{zwB8qO@VXYA! zrAW~?Y-g&f+)#rWBUFou4c!(edFM7qHxOV1O+SDgm&og7k>e$C2v=8KEQ`; zKR>u*&XmrKUi6I#+(1@{rR-ZJr^E&gUc#z`?KE&kRs7D>$k1sZM1#{aW$fmRp!fd4 zDW+#^&J)Jt;CMwfovk5!%wn@o6|0i@YH@oQ-}<^#a6nk$$>40q#vY=OH1DDM8Y-># zP$7vdF4Wl`o;s;lE@DS6*N3Xuj;A5qddP;7A|odY#nR4~X#JC{#22D>8Xkw`5uKgE zpN9sy-BkA#NK##$LdR8U@jEZml4Rm}PL60ZU{QLkE2g21My<5(paAQ6i>E`9{=S8F zkFq7#DH5_eFTmKetnpCO0&bw?vM46DyJ2MxU5ramCB&p}*%5l=e7w(a#VXJ;wwX^!0F}=Xvdv))T4TbH+AsK8`uwAQl)m*5U#)&A6Jzb>1frB=jZoc3@$H z5zjIseeA)WJ)j#BseOM@E9j9;vHW#qzP?Q5nHQIGk3O=^%$aC??=u zL#5ozOPz05agrOx@uv}wmZ%ePMPBjd#~huIyFd30MyoHp^dz#$>75N<8DXR@9HLHL zl4*6F9vUC<{30ol})HxE(nv=7bi{w;R+{frK{O25kAHs(5y1O){kuyE;;;TmG~ zs}oL$?&=|a4uKmf$bsuT<1W5OFcd_S$1(nXzIt~FG2JIq{@QN3+KkV6 zj70MY8e0Gcm$awO7`q#W0l4KjR?4DnMyuE2i2@iP^&yC>eSqAb&liXC|Nfa##sK} z=Eg&f7d2Dy*;Y`JRGxROTdV z24e&B^bGu!Lm2qX85k3;7`QnWrx^Im6u8|t9W(aaHhj@$eh5AL5h$P6@t~MkS7?|m zx!9H0xC2;L3H(QLa++!k`$J?zHLxhLiN3wPxm|UEUpv2;oLPxqJiofWv|S0aY=u)z zL;3SAK60TdNoTBaW}AcxuLe0|B~d*YEj{UP`XMe=F$hDy7y~&sGn$|4`oy?k`TI>t zNvc*^W82Ox`r(?fJN3jYJPFi>tAE$h{KtYZ!m{M=_o_D3o)2sT>hp|t^LB}M3#2=a zZ6JUm$>jqNL47{LJTawS98tZymbU!6=>1q1e*zj_m?gWCUl@f5ebPNOM5%JRfIKawJ{{lUvkf4&UQcCjpt@zD8AO)(lfS(y-Z(9q#BsQPA z4wH?PF*!x1fv$diYfMt%Cz)6|nJ?J_X&&W3ab@Mlwa>T`*_h~(A4!@q$(aywOGN~` z(8d--djL6BSVESe1-A;eUG6kfwJml6DvB$yC!;qN3DZ#+T z=k>LHD^f=y!^lA&N!Fx1ZfG8OhKC^A7vfDp^_?b&!pKjEL*G$zkdj7~U-nqbPL5_| zqvql!uFoPeu+R0m-)1lD8n)SPZsyH-03#3}<*^s%$AEU07Q|pbDf6Z2+uZ~~-Xtd* z8KWJcDh7qJo^YZ!?n6v(TU7!hB9s52Dj%Z`dh<1ov3W`hlV~`Ch)r!(3XW(XIw3h0 z8eP;L1`Jz6^G7U{JUDvWI!P4y&;}m3lbM;ev7Q-44ZC6X?CA)>=iAL+{Gwz{5We?^ zki_iJ(yy=F7oYjEE4rFCfCu3S>F|fbB)VM@cWi0ssJ*vs7d(C&V8H<4yWv-?WBR}M zt*NYG7i;gfrbQAHGEAKO;Cev}t&W)BSMH}%6cxohzs;aLxG4ynAJa6;m``8MTsx$I8NNtXh+C(%~?^ z=Qol)@=z;j)-@VvAb@ZP$0i^UBr&+zt#z=|Kf9((Z& z`%f9H)&HYRMLs7G%RHQ3jk-%(z2a!(G97H&5hbL~G~VWF-5sze?h|jV=~S-e485Kj zED^i#Ye$@=32Upnqys&_JY(y0f5DZZBR

Lr2t&zN4w9v^`~DfpX6eFzbayIUV#?buH&7-YQOIbB}7w8WeS$rnNN(27NpBH~4p zh%88iQQ5*je46A}$NMnSvD}rLl|78trn8A`kSD)LnY;i}k-1qMV5m6;Q64}9p&sdt zHz+Hb@GhVYjH40b(-w~Sum$U7h;S|I=8-}@zfbtyz=iWi2GF5nyY%WE$SRa&>MA3e zZ;a&@4BheO=(=fxsgU`7{*v!;=IU2m8}r8etjuAi;7diXppiLHpg(xtcNXsRTiHCQ z%wN>1GsytT8;!lYZW}xHvbm5Yq!YE!cy?uTkKviCB|o-aT8k|Ubs3>D1u&{yE?+)T zJr6~&rDe@)bK=r4$f*v>)L8!>uOmGp1@CP?-J=d!sZwL zZ8x3Ep}JDzi%s(*2Q#*7HE`Jgt%nZ9isd!0dpp6mz4=~mHx<>XLR)_oqiENgf-zJH zVXY@)_pu-;Wel<`DTC69b4ScF{Hbn?Z)FyI&9|M2nFE)Jo z_D=e4C0G26BdD%9K&wN-oifNK8lz3J*;_ zCRUbnx=e=PK--hBH0{VPX_t!!BEEX%Cw}& zb_wNA%U2t$G~>C*?bl_>tTpZHyx*z@a5~3zy@AjO&3-opzK?dE>Q)XYgVQfKUj3Sd z6fDgRRj{D8^36urTS=Jb{^Jr9@j1e+U(7aVBTpwP!Y_}`*j8(4fuB79YD?({2Z=L< zt$T*nqsd_diN-r6`vPVIxi3@q=f5*tH+WiC4E3sQjjYT$!gifbYnz)L;~BGy6Qxc@ zldGpJ-!3!T+pWrwEleCx3U)K-Z&o%=O6=7lAYKC@gjH`ms;O{P`j$L4>z_2SHFkGv z>?vz)Z#cK3DbEKj-t6RXW*v7(r6OjbvA~!|Jv?Oy4ElN zaPr<6l}+X}gmW~pcxCBt&Wdc+b`PG9Ea0@pvVXSJV@}=s#Sw5Yx0GKnUtsU35P#2o z5DX5hA27W-0xfW*&IpxFr!a(?O66dlpipngluVsXK!#?cC?%}1_UINluiRj|Vr@@^ z-wbfFf6U2N64^y9RCQjXPEk#5)@r`B@|Vh<(a=F%5d0Q;=GkGPd%o@XgGEBUn_Lr$ zkMa9jTS+!-JyQATvawnh(y2U=qL@(0=I&{$RA!rfeGBoOn!XrPR|Ag-J(p88NlSjI zCAE5SIjxpZd^>b0Dx|9^N&gb+E4U6S-gn_(x%q|D1>yZ2<}~sbJ$~{YmDA3M%CvnX zq=0d!(=9_I5_tZ}FkIFZ9YQ9DM0THu z_=Uj!EB?dJR>>}&c=B_rX4ZkXow90KDi4n=vD%wYPA%HBtI8O8=P;HOzKdW4W!;$D zOR~6B&9Ww&$khW_R`F4gUuDB5smfX`&d&zaQ6O;q(O(M~0~tKImJmf?pH{k4;s;br z=0mmLT;+I^S1X;tfBW8#YBcUsan!5fmfQ?!-gzf!VE4mSvk)Z+Tyje2bT`^z?ti6m zf&E19ma|)t))``^=JrtWJXU}1v4N41O(Hj)c@kKu?+Gk9s^Brg(YH#;L!Py9eM3`k zSltE$?1>)jx1S*aPw*SIeYbqMwVa^-Bk`%f%^hH1Gk?{MG^|KjF=A34mn-pygUY)-?Zz6!oq9VoZ#B@l`>%{l*Bm~ zE(+%pJ6mpfrxgLvmgyQ!rZztP!GdP?7Q4suJyPLl*Ajt$I$>F%aVoz}EJ55*@g^+( zZUvJ@_!-6z=dezsV|VjzMIqqN0VHx@pP@nm2wRMY=BD^MvTblx@Csi*rnGJgp7Dgz&aE|0&!@(hf*ruk`ZcB<4QwRP=zOAo+5RS4RxOc|6|K-p)gC zSqXTCoSAqSFJn@bi>JlvCGyqMJpvfau4l=;i>88r1bLQl2}bJSb`8B$YIFmx528B5 z9wij=%8bW5d}AlqO~uFDFx(Cb6dd9MyN)`g8ZU6I1}tKxq65ujlwxzVaG{*1_Y1 zR>U-dF6A8|e^`1HhDsXJ9$2C#8>^DdCv-umSPQyAsUb$<472@C1)30DY^TQ!@xhAl zkkBsc%=QFr1@VTEXA?C+);XYmNP8|jnq3?nh&0Vd5oB>*?&oNtMSyOY4e*AQa2KO< zX5y(M;iLt@Z*@KFx2T{Y?cemIO{g{6Ar?!_HU^0%L-NK``IiY;K!d13*I31HVh(9^ zltByMC`Q*6vleq7(t9|MS6X0qG6*y?l^)Kgb{-~kxU%MjIo_K-kTGH<@RKDc!f8vH36PfuL*Y}w!^ zW9Ex!GR%CK+D_u9w7q4RiU6y;_Rq&YC2l*l6n%7PjCyRoG@#_DPXaNr=131;k*9nv zLw4hW8^n)CMB^AhIcL0$@=sASDo)KTnR zL59?e6Q^u%1rZe^M@S!PoVga%3TING2RMqg7gAOiE2F9~gV86FQ_A_UP-FRuUAQj) z0vw2jt%FW_2Ica=nnF4lt8dZ_;|p9GP*Xu(vK|o&hc0p|^c+ej;z9an@J>n~Mm>TLr1=U6-EoE)2KLYCK)@Is^)V^XmoQ~Eb^fdq$b!l}PU|0m>E{DB!B@w_GEwk~Y5C7z%Yp4utdt*4kJ`PLc<#--buz5DHilpChr4Gg4f$l1$x@9cR(+^C;;2s> z)1g(9GF_}?xWRrWh)<40S43;j=_>zTEs4^sk~~!Bp6TkPr;`7EcK+L$AO$il_%JDp zJ1~~i5(U<)OOubPV$X`lY+^cVtT<2XOWa-)H0$YaXFvQA)&n&wY${iRX`);9`7})k zt84L}B#ed1+HJVxTG4w7H60{oX&MD##2lp4=<%D@hQGHTi|FoQs>)^c23t4f%|2f`R0DSSnDX&kd!R^OX}JoWz-BhKssg=%o_c6*|^h9YCWXerls$|bf6 zvgz|8M+SN0wKH0aVEo;Fyk?B^dD63X-u^eA9WjZ`@?MM+Fi`6mTpx4H_TDy(>TRjl zN+bHtQ=tEz-pig8xxH@_$&bi!P%lwWM2T-kRM8j|z#(6L6!sgj9M#j2r+^_7KSvVL zYUP>5Fa)Q_RnnsYwX?IDKz#QUfjgr_L&R9#Br~yCI9l60HipS6 z85vy8OproaHD**PyTOiHAJU7cwQDcE;e;e-X7%;*6|&^y^1h-tbRvRCfoh$7t+bnU zqq_zq)yI;`J%b9_e8=)ZU;hdPwO+!^MQ0!|9(P?o!5hR|=m1S3jZWGFDQk&JiTf!} z7;`TEF^hHk#fAy0g^2RIzCYGF=zLDr5}9cEazh_8NAa9%Sa<|6vG`yKNTrs%S^hK) zM^*bb*=ilhxY$QYF3Jea00r|C*$&Ec!4_a_KAo==lnV(n(8M5Ua7s0RJ{L0G3mSRn zh6XcjdyA#Z<_JkF0oWD6j=Y5Ux5C~`_#+FNtJ7`sv-Rbuyb*%$7__z?L7*{?kFg9| zoeSxNIS!jxiK5dcfeVMqn)b=vun!k?Rv7Za^DZ~CZ0YCL+;F>gPF40apb#nmcz zKm*Zw73ZB|B9jr3d79b@^r+tTMrFy5Wu+2w0&Nt>{5uFL^dY`>e9s0=kDTa9oHDTK zmr#tBMWvQ_$VCMokW?EaD;}%gQ!L@C1G=*eCbn+O`apXj3Y^)9qmGqPs!MML07xWqFF_XBC+%+TtwC#&L zwdY5BArO=gQm5cH=@c1_TeEJ+K$D<t~u68A2 zkb9jU>DX?9a5s1o?i)I^icAaR9>To&E$8PN)(cr;9m1Eqq!~v%Zf;B-Dbc1op#%%Z zn`-j6+ua-}m!k+KvFSEYq~cs7#qF?ypRbb1r67kXpQnU~=+S>vka@AdcxVR^j{!8RFG?#zHFg8&~h+`xk<aQjQ-XjNHlunb0xGWSpH2&Fu{U8}jIPVm1Mfx>#}MHP1EOr!k6eH2ZH*8M z>TE5nW%C&(vtlonxi?BkRoaa}2(=8&1)jck3U?r-m)XZ)g1w@3YYTWR+TG!$9sC zou^izP*@BDZ+bsg{otrynlsnoVy?H%Z7hYFl#%@^qr{RLslb9O^gW75$yw{*S6+0r zV`1wNbID3rRVaM^!wJr_=pjcWJR##QRsFg2#V`ojZIy&lxfo%E5NXlEBc9~6cq98% zdPM39J)H^qL+L1kNrmxn?kkX^>%o-gED<;D+?=NU>h8dE*R2UyMFpEkX&*QBmx$XG z4PKM%YrAUS0Yu|kj_!<#$TJat_IRYEvejnk)Jjb-8wV7gefCZhRc*0e7#sWjnaQMW z_Hfwm#BTE5;g45Vv-1~{#RE^LaBE*(y@*h%0T&iez92OP52_Rg>E7@e+_7GQ?!&w! zj`;>pt{NUTt&Be%S}&W~D16cvHGwPi;n(}YBX#oYsl_CR*U_P#l*2k-x^x^nzxk%4 z@QwAMq0(;Dj*?7h)LqN%MW;^byR5VGy0UwcdX_VN_H9_^S1PCyF%nyhg>ZP>1@`vu zYPgg1nZVJl!w}q77rg$FU-rb({rx+sym=Mb=EzAM#Ry$K?)-(A)YG7ic75O+^+-be z(*Vd92Xub!JTb}fy0L~c!q=IGm4NAJa~1EH%+dM+Bi@U?$MWvlqVBCzV=IBp8SQED zuUR{xh}uw(8S|lMbsfJZbKJDc;(SlC#^&5QO&|pq{5^*i>+`B>l}8c2;Z$+UbXyCMDVvt zAui6jjv+= z6wd3}(!G;q=`==vUx2Z#2+3j4^ewTUu1OzwoD3J>0p!fo}LJOU`xgj@S zkiaKK8EizdC~z5GojQ}}19Z6tD@<>HF&6JH5pB;Q=>G#67tZ;oFvhF}V9tVI(lhk- zw@O>@)wI9*q(I{r5&e*FH@I`R<{I8of+VEzx6D?{NaFNBHj1=cf>({q30P!-1<{cq zc|{#oIeE6WGcirOPos@~A(HSSZ8P5=rQ9@sIRB2D78+NZcTUF|9~r!@mAoqcoZ0fK zWADF#3pN$At#o!Mf~1!x%_yH&V`+g|8sO{j++^RW;EQd(3fuDrLK(S(xc? zTGKur4%ul0K7Q5@w;zn?pW zOBRm&m`fmJ@M_;>OJ2U>6@_tBjTX1|%4N-{D+EF#kY1mmN@Bel0UGCcJ1Q_82GNT% zCZ8-f4Oipvj6{y3H+S3rl7~y#W7f)zQBHMACn$cHsrSqOz?y^Zz7~W%H1vNZm~u>VdG=I( z=+{^23UNjby% ztmz$Us7q*PHR(zuQz4-dYg%ON$AVX5iCe&3L4;GwJd{gXyQYN$_F()=_$%6pUA)*50ogFQN@z~f zPa-4we3cMI!;`rLb08)kdI-jIPDsM1y}LB`R(EiM9U}ai;!q)A#?{8Ns}+%}{im}N zokTO`vgu~VUBip(U%w6ecjs9vPll1a7)hQ}W?AYT8#H&UO^=LH_5|Etdl3@W%BM@5 z;;qol3`ouN1}9qTCN3kG)ux(U<5{fDFAU5^jeSW~ltK^^Z-U*qIqEa-jpr834i1r= zy`0R!ccCejl2hTnNYx-gk{d3Yv6&@Sm& zwPo0tG~W>o(_6xF(fI7c1-Bg%`~888JSVy4#W2GurqZq4+#5G8^|!CUwUO4`I9%?R z+cF~fG?NHti4UK>T`ytri3)euTpqW{xNsM1{lJytw_)MUZ-q=%6nAj8cNWVzAP>1H zHGW1_j?*~alxvJyFKiTL>^{y1P?{Y6BUE~%*nGrtd1 zg4%!~NGOjj)Hxl>x6D(eh*{vD!}mg-Rt3CBZJ++hj;h!tSN?ZJW4K1S;Ehd4pt6;8 zynMF4SkYw5$S2kM1u5k<^(k9NC8OoCr69NC>7603AV<4Zrb-F(+QYjFks9F@L|8H_ z5*RMGOwQ9WF5KJ6!%7>A=LQXH%%J3Pn0lz2I&3xD1pe3ywbN;6CrFjP{P}z>UZD+Q zU1E>WNYfhikmT+s&6#`y-{Ny%b`p}t==&szRIEChX=oIUymGFf-a@k_4T|9(DehhWKn~H%c^#u zb4vKWSfW$;H`8b_`xkVP1)$b~v4HcPNcHJY~ZX2&}9smud4}TaD-3NHXU- zKMX2uc!gWltAplRc9PEeakp1U=K({yAq1 z_r^MUT&!7@1$QH_{B-4KDhY0)cVrv^VYh{0EJFuA!I*w$~B(*XWlDjw3;M>c7=v- zb*7!S)%4zhY>`N-iN>~<8mTE{eRNIPN;DtH6^ube|eFnU$6vz?txuI_FN3 z9(aj%LU@MRlE1C;_Sz+AQKEaDul)Rf03v|he{CqBn|f!gVaQ`ac(zU#Va!vIJ%?_s zBo1g4N#RuIL~_6Ne>J}QP$#0w(w0|F69S&kAMNGRpp(d?mZ8LtNZ9vnMHe(6sS^` zKtY1_l~L=1qI__IOYD1pgk27YqshY5Ju;Ba60YYP_)5X+J`j+^jCwoXsHOUMM+exf z%}>oqo}Jp0@u@8SK5Z5!N8?kw?{S|n56ZdN9iOg zYwhU}-p>f`VFiJa;=KiTzBzmQ*?NdTd`7rc%$o)D`v#Gp@_=^2?Q}6#y{`Il*GSB( zDsi60G^d&RQyr1ZD%h7A6rw;+7C)Zak2SS`F&Llz*b}pl+c9i|@K)m@{U?9KOOiDb z6Zu7=dp2?|v6*Iie9TC|c#)^Ir+hoW>r%)am8!EDwUw( zE!e+XK`fQPg|zOWu$;L*6gly3Z?s52;oGut$8@*)a!8@*pT#@V5MO6SdrySZG~s(! z++|f+kYVO7MFb$Wy19D$xp$rypD(YE-oDeo4n83h%|%MOm9GU{iTgI6;HX%d2q^_6 zIh3cVRz<1uM<|1nR*41wB};5UB6HR3$x35^$*eOu&3k+bqr6DGAncYDk}a;8z_rM< zQ7}${ygP;&ZAQOM1I)qJU0NxKNi{W7OrHlN8ckHtU|cOB*qCfseR2u2CXs-GZK@(P zfc`h&@L(mhtH=c@VuXUtl!r{*Jv{AHewk#MYC}a|z3HHw2(PI&S}$rS8dWvTVj>l( z#u*sQ$i6Dqw6~#wUiOvdF3nqErZW8E^5xmb*Ee4--=4p_xO)3bz($&jdJPB+iDimv zq7E<3rIH|iujts(OU;CI7zok>`&t>uk^wTwCd=g|@76mwT226)>tl0L!ZQyf>|E(H z(7;0}@v){uAjOmtTA3)zbE2p524<7k{U`TsW}n=T$NbOizzhZ;eIAgXSa+obir`eY zNERfPiS^3j1ci(jTl64c=E$g|#?_>AO_ft$vB1lVRFiMdmKREAGL&itDf-WB2|pZF zf)y`cER_<<){Z3MKXXt*F{$2Jm)9=Y*_`|C9=WF+;!Jwhwj&xMGrqxWH49cp01JP^ zl^K2~Ou;1VD2m`RnvuJEWWY2o>Q5=DJ>m^hcg^%~om&O)H|n$E(y=ENXlv8Ip+-Yv4l`} zFRoen!2aSFI`mdDFK6eUEz1k0 zdx&OTq)RHy;732U|Ub!7%>E)2vF#`&#!pQ7mx2YLdd>#>x}iWkO`RnwmWaZ z`u^-|R76K9GeS366xr`B8OLPw5;Dl@1qo&|L3tED#9~7qd$PJ)144&iJv_TUzq*p+ zn`y}^4yy&BUbdE^%gn#cQr$unKmvLIAdHdl_FZX}_I+#OYm%rZ2z#K-H3`?#O@Y7y zRWwcZFIplMdTQT4KsfF4;?zbTAI*Wg6d6hRW~&|*u{Mn(3&!F@@0!XAT{wSr_F>2; z-ei-itjifa#g~t7ufX}sts2M3nyUb88Cay^<2)DxtV}!+N#BqvH`C$}kNNZ`I7NtY z>dzNWKt8qlvPX}4QePb<^ebj9k*1e*!dlXyf`W)mYA~wnjL6}=_>r4eP}7ZOJcqWI zr5H(hM6J7phM~Nwik8u6L{$hQ>R7=Ck={=rJq`ilrdPC20pps6sJhA~w{WX)slCQw zFCUR;B<0cC5b^}e<5mekUnT;l0{{PJ6i6~xu(;-P8>|s()X6r^gJQ#6CeP zDPLP3+P|f%v|wr8AJg^@l5aF6e0BBm=J0P<*Bw@}=7zg?Hk0|?Lp%zF>|39`qzJE_ zY3osFbl8V>%c|H?l)qafwohs)K8852Rlt9>(RA%UCu+ZCXDReRrPO8E|C}HkR$Xoq z16kerGL0rQg1wTqnf+N>5ZEX2O$yOhMB_9odX5bV2-qq=d}!-BON*g2NTeYm(8iv_ z8XT*q`>&vDnmNasE`wRE6`L4O548C}QcOq6JewunEGHEM<|JLQAP@q6NEwC@1{)z- zD7v~FStf7-G>oq&sgIRhyB`E+C0oM#4@sAffS!(eD4y4-8fo-c%Yt-9K{W-|ux;h* z2)|stRNlft6rrv~g^*IN$(ru?Ou~`c6oG2kQ$zGzOCfK$u^|y$rW4Y4ARV+a51X4z zvnKnAz%i%vL!cvEA=&hJ2B83?ute zN-7M^6R92FHyv7$&e?4HATI&HAwNiy8_d zyvdbV^jLhWui+-&eS3fQoNXgIhgL(8A?6_6MWZ6|WW^K#szt}Io z-`0O|C{jT7ehB7S6OyF)gZTn!z6CkQlC9`mo-MOR^2u6y8R{+U%d6Ly-xH?4^G>c5 zG&nsxk6HS9kpbZN%3>|+pNEno`0k|Kz;{X({|1LPd9T1osHR0yWIH}O6vi0A^g#ig zD^DO+A&bL_YflV>5;3ReEDsRWQeB~M7$GNLx@B2yWDizX%)ka{5t%DF5_W5SK`}T{ ziFY7W(wqY_tgHEMGi&0j;~Yl7LRVp|t5#$6$hwg#dgd$0dO}@A9D7o@MzZX{ibNBm z(23Ntha`jMD3Sw&tM)8DRubrjvVD7$9RmvwKr#>GLcCg8CtT7c9|BT zAtnkUMlbAO`E^GY^NsWn)GMPP#zQ6J%uk_@#9J9!NVn5^g~0$r{lb zn8o?*sLt7*g6zRDZ6$X0ujL7Gvl<-81a}W0GnHXAF|ljqzPGSXl+RWbwAXv;%8=(# zzyK0K3+&0s@bvT`e&H>_;NNq*FIE-59Q7LQlI{nyoj7l^AzOVUMFi<%!%_1q8dfHg_ z5sf*dx=0ng-y-CB6$(msljAo&@Bs-_tX;5MD9y2oHf;v|Sm`5Q1o^uYL^{EwsI|7w zY*hleIBjE)FmCj$UqGves$!aGi2C)oDou+&Vk*I$XKE~b^qG3*4;T+8CS=(JVK}9$ z?s-2Iaj&bU!=C!v*QDIb3o>9+^_A~`*U zNIrm%wPr8GP+i4)sR$rze0Tb*a#8TCDZUx3QtkfT7Fw|XD#q*vG;0KG=cA#v1SEMk zgNduiHtCJ{xgUk|exSgQ^F7v1*qJiKT45R{oe@E0s{0Dmx5euD)+dKqR*0^FwHRU-o=ztv*~RF3Ve%p^{gKRpl4_Pv}WTGGwjKn3$PLtm>xNgBuk@z@6f_ zkY6sWCEh=fs7EnE#K>OnED08n0lKrSj;-&U?@&A>bN>Uxu^hXK)puze_#=lZ$d}%k z;a1*}n~-=rpGz;4QvdQLEGw&i`Ot}eFUKt=};V({Tyw}snjJXcC)alIahC^0>=RPR2Tw69; zZk{?BKHo~(g|V0V_V?=DUPPitFR3Z#i!7h|NA_(JCO;E<@SMf3eSPb|{I3~ouNK_o z3wh%3^s&|aPqNrRRts+(m;qMYS#rX+v7mqG@ipaFT~U|Rx7ZQpijOV%3~R~{ho^7d zeRB;M2_ZhdWN*!9vZ$^)I6AT~GcEkWt91QPjkKekdPvY7oz8L2UmBRUzR}KpW}zOg zU5)%uQY?n(+X3nLx)jW>tyRvj$X3vO`B2*aT?ko!+PB|DEyV%9!kzedPbs#wVf%|t zu%qyiGI401;MPo?u**u5JSiH6IV3 zbr`X^Vih#cy*9|`XUQ>VnHl2)AKD^Zv4Fvy>Fkz$lis>ncqENA_P=K}hkFU{N7H(( zHT}J=#9i(ho2DXIpW1%mb zgk#pylVI!)ZM8#2OZFh3)Lfe7H=Wz%lh{?1)4WM1@2-E8ynMhR4R_#7O^s{*$_gIJ)a6){X}Q{}W>FxJs+dP>QfRRvM;j z{UiABvF9H?D`jw~*g*Pfa1LKv)IZ3DZTD>NxiAF#<7rS*J;&MB6&(H;r4_nMz(COP z_aEM|Ofj?R#NXq zl9Ubnt)xdR!4(q3w(cew-c1sP?vhCLfv@2AV=7)&x4ruXXWb>UtT*@BgsYq3GDL~9 zq=cRQ8zg_BaDDOgMe=m?B=ME%99i~@qT~$LH;1fIYfLZohO1=$hll+3ro7-&gOe+q zlr9PZqS;`rXSQaTLdEuwh5TXoaF>>=7|_G_>xq4Soe_<`^HilFs&a#wX4`Z=#E zT(;Zd=Td;3u=CgnY;RZV+mghuodQmWP7dgivY*sQr z&cr|+ov=vxS7=v;bZBo{@JAu-Yr3QC&K>#gt_(-&ZC6IhUiUc^M)Uq_d|c79SXuO164F+d3Z8a!54)B*=M>ppR*I5% zTT|z=%>X2Bogg}~EwZi1D|W>Dqh$z+3dj_xhtUgVmYz`H8fm_29y=O&mTa+Mo2TMC zcex099^v0m9UTSx_%1GPaM?`o-`8+5g0~w#PSj*o$1%4g;(H{KKUSg9ij}+eVx-aWJW=+X<%|o6O{n)8o@N+%(nP^5sl|GK@ ziTwI$tV~d>e7*}}$!^sG-%=FvdH&Ej9-6CObkK8Bphx{avj4%RqRG*DKZr z?ZV}($P2d8zr%sJI8B!_!P?FWknLM$hx@H}^9xRhH*2^6=od(gK&+jcO-w@j~ zj@LCZ9_VWkaV$X2#My#edtUteE;{qcl*o5HzRnmch38-`4^MB*k3It6btr!5XzKjv zvLr;HdU)!z8(74@s$inLwGifSyT;*wzGZ)s&e12%Ie&6vd(OGKs>#}A07z5+M*w8> zCtTSnr!skO&99-q<6DAQVkNc_0@R|NgV)QlWlxSB*j|awn$T5Vv`qIz*lT7wi#sIMCM3)w~zRn_vN>l1U zIsFN?LOM^B={r>F9Q5ipB%S)T4TpQ-p64F(T=_9Cm#@OLTV#0t{(dZyuwZp&BTyDX zOuQu0og~zwI-L-HNP8_~3UH?v;IB)q3awnpq*I5?ydjfhy_=*|%L={O0u9;vHzn3C zT&}yt=7v+*UIp+)H?>{Kw zNp$$bgvs*0s~H{0o2=ivb?w_>dKe$$YPmNZe9F*7NJ#thSs3%F@8JBHMPC=BF)FSw=jA81J>f&cw6W>^2?yRl471qc zwHYN{@mskG0Y>F{{k?N9O+kx&UXIxS|1goSju|Z`(Ey{v7^_Lkl#rCk(y4pdQUg_)p0CrxN#m>4h?aET^Rkk$|u2(qGR=OIB@ zpw2)mnGh4A%n3y%3ppo7(kZXZ9CBxiHm>prHmBtlKjQlvxQP| zwrbA>pQleoPB0}Y zNsrMD6w-Ylm?TfCbkX)e95#h<39`-mr3>+j{q7hks$0mW&*ZSMOG?3mu_D(_9?y8k zQmk7|RAVt53o#xF7{c_Y$qoECxxRuwE^pxSdV2Nt>IZo99;VG4;rgGYNAmMqQe8Tw z;pOS+H!;Ogym+c|lVJ|i$-AGgXTRTE&2FaGyxoo?!V|u=R5e~ap=x8ea*hZtrLMXe z&J_(MWi3=tOB5-27+|X275av#n)%t8SAXLyG$rnC8yb6f4W7G~&Qj^a_lM#xqUSFL z=c29uOGTHM9FN5g_$`+A(i4tgGb(Wlrz8H{9{+iIdN`Yc&~jy2f4pZl))UoZPPQ=}`(7?xBjp$O^{(ZvGVtCP z^@1(Y$w2q=1fmCb5uSmhVcfHww4xt&mK(T|5y^PVfF$0YSAxOGYml2|vSHe0y8B9+ zU6T&cJMdm4GalL9w`D){B4WP@9VG)8d{OXh)stPV@oJ=!(FXA--JQTkw&j3s`4zh5 z9^JF<#y{wBFP7NKdv@&Uw|Giel^@Zgz5D0#FU+83i{Sx>A$XiyA+k(l!vYo-^%w*7 z&C6JtSOGP(1&zO?1bCdiS^IC>I1>KZ`YWcpKq4oOleYH&oCnZNv%LUmyJ)g^yVxrX z+M;c4BvB_(cHN@)x8FA;^>Umh+umJ&Xe^PO8P4OIhYt6G)oL{?beT`(Oy_esOr<%@ za{arUn&Qx?bp0WTgSWYwt5n1^Q?aDUntol%f_{+sze<%3gWzVN3M%x>tVAvezd>QC zA{o)HC=OJyJD`;^3tbu#>6+w+ESE(=IwzH6v64}MgSkk}dPtWkrJCeYrUr-Nn9M?w zC~-P3Xd-DL7iP9^{1lbvHVv#iWBUC05cbQ+ft^PB1 z<=aO=E+bW#Tun+N`Q0p+GF}g;C?~9S-p``XbR6pyQ-`jweQHULg5c?pZm_PcP43)| zlCm(+pkZC%lDTAEOTOSSt#xVF174rTLa~;FvF}&8Hqvs|m9=Y)(dEqUsgx2lwoXZ~ zwWD%s__`#fx2aymGMXoBL98=Lzk?z@E&09GPq5M@YzaA`v|K`cYz3%=jlvS<68;5s z!D7#b^n#U$4bEF>DRVYp;Vuj!8SazDYf40Zi){irDW?l-gW!Ip@V<#;HE+Lq5Ikpn zJBbwdCSqMt%4MRLAi<8|g|nW=KJKIpYEwhhVX$`?1c!S8?a|HOF0bjw%c~3e$BS!v zadmU??&2l=@GIS{=aR1UvXIc{UvcX!S1~<1I{Nbv=lJLWyIU4Z1FwMyt6Ui))1iGU z*b38Fiq!euOyJ%eW3txz(9tN=N2zDwjrt{tuOVVO@6#z|TBYo&yh`Dp5b6eDg)n*k z>|g?4E!KsRNzr#SX6gg3%$m%XGVHVGu5^COD$STk2Aj@&FbvyACgps-b^_;2AG?Lo z`RQrcAJk7L{J@u}UYvy;zSZmfQ^(qfTX+(vrUkps3}`U7&NgVp63gU85fKB_cT=6M zzjLQ@xF~GNP(`s!=f-&tB^ngHv^CqJL#9}XjOAtB=lp{;XkQ2zMVWQ`X8U2E55pP0 zSF<#Ns5h6tyuKR$e0?##zPZ|beSP!p^3AL9<(u=XpI=_Q48F&b0!nRP#bJv}l1@Yc z%b4Nfto5$2w&r*6#2y1lQD&LWjm0-0Gtf(M1g5*jfkT-pjx`ZGWz>tg6mh%`dR3G{ z7j}(N!lK@EA*Z*F2FF&*)fjt#|Bens(>cQ5Ffl$mL}sCsV+}+!5Q0^Y!~^`d))3QN zGphw6Zp1MKb&=Ca6pmkCpO623@vcuhJ5)c>*(p6m5K%wq9Ujta1ri+Mv{XgO;cfur zdQgE1{l#)xs5y8HgI-tT7r*>;b$NbyQ)?^uUdC+^#;@M|d_Ep~5&RR2@Z9r%b$(v6 zdfsMLJc?H#@7speG*Yv`!3=eDu2_8}lQOme$(ciN(gD)AECN?B(P-p6gb?RIR09MA zolAp|c6pEK*p!Bd@|NN4Hz*Y#31dZLE*nY6=J2dc<3Bie8t6=%39JRK?rZ5(yVv3Z^SZ%)}7#>a&7r*!ZXq?`aPH-cN3 zbsH~(UV9l>Jc9MIak!I~am>Hq^Phs==ewjBdcQ!)%hrCkW6#tqjvVQpN|gzDW$0i# z?DvoH8eTQc)*)`18;ixfBN9gNLwn~|*=n%{G!YDGI;|Z5l6J#$o8a)I94X>{iOJbu zJVlm1sZDUk?{kP3x|8?c<^OmIoEWsc1bnw&i5IqsYtQ?|ErLd}@qvGL-N_M0iUFPG z@M)b)J5IAxzs8R6t{EJ$T$(b69?${I)6lCjtZ&zEtN-hGZt>Y|tgSE3=KFA9g% z!5P+$>GLCad1@i2l&Uph{?zbCz1d~W_j?rQcW!}muv3Do8`}A**TDteaxYxhk9kOttRtuw zg*Sz6c|b?~2j!@GcvyUf+W6bVGMXRSsnb#I2nsr(d(BNkjWv}g*^&$*_c&HssJ=%T zGL8iiXn)^RKBm2lo}AL|KaX~gX@5UMSXnNpUzrhB;pa}SnnfG>Te1TDGoCki7S_O@ z8_hbwtU8xkMXvd+Q}*HEl|+BWKW^Hil@+4?cb>->ty$$FodfB4IyhgDZw1}4Hmaj# zwmtS9&!4OyhliKYgcOkns0kQ7o#{oYwvU;hc z8QZbT=JpmCwb34{^q#6n`Rss@FK+9xFQ!Jn6)~iW#TWJ>DmOEhD|7)WnNwCbALn>FHA01+a zQHL4W2xIb*mUgCN$AG}pLMJRx!9%_oANI3WjcO*=Xvm`>U9XgxE^K18Gpgug#H^_Mxf>4+5`91Qu` zW*=-PpKlQ5i1SmrbLHc0XCO{Gc$WFym^eaO$7eRb_}T3v{t-A$LAzj#^dM&9qK@!p|p<7;;Rlh%Q@=W!0O z8&u&(hxT(po(o%B@qLB>IO(9=o1Obs*lj8MLr>=1PP9?uis>z!X~vV6Nb)osF`zxd zy7?2laAUrRivqiwX0xzV-Emv@+|@fCS?^ZzCIhkxU=bA3UN3%{!tWYw1)qs0C@PJ4 zQfI5srd7PBH4%fYV~g$JLv-|ghc$*y3KoC*LBqCH)1VzfB`2ULjxUzb-?ziEgoNzwWsnVB)Af zO5HegzrG*zlDlF*>>W@3xR`7_7Sw6Dy{{Qw{6Xs-e;t|X!VevP;A+R+Zw_xugGDKl zZJ!aT%@E2L(amD3i9Wdp16AttrR`&QK&8@F+ic%%j7YzQxu5nto~zAR z?jw>FVEYHijrHog<$nN}KQ1-1;SqS8?LBEz8%dU*rC*Vz!ypccqkDUI5io%yQM7wtHh8-L{m+%Xj6=%$F~p)>qm$H#faJ zon!+!OtVYbOJuP=&eFfjL6NT)QF3=XirXhybQvWUI2rNw`e!`w!H#69Hl8w_`u8Ala#FG%m z11^kYHi&@1!59b{1O>p(*NDjoHZFk65mFzvGZ{vCkwq7iLSor4lQOx?OkXJxtCXv??3G9ozbVBuQtRKWd zgj@;=D!<9nLej{oRu;oC@p?#YG*jAE)`0pB8#Gm#}IssV%p1`zB0{c)3z!nq=VwlN)Od?DiIfFb5bi z80|SlQEJL$5=KJ@?t+^1y{mf$u74mc(07bi^ z$R@JiZeOQS=(c@3DNX_VMTRk7PM_ml03RhfQN&tAQJ;XtK$_dV#kWh;9+7LU zuZy4MZ4iQ*j?j(*LcsuMbtZ=(`D6g9!p+_WVA_hSES+3liAe%2lS|ZLu3h}@cK^To zt!`IXo15Q_F4B07EDVeRCQ$=Zop8Q)H*s17Fh9V)MYpVJ@6ro#6kN+-ato8R5Fe!+ z=c*G-M$pb|2v&p}U%@n!XuCy(Mnkfx24lO_U+USBpcrR1P&Wx;m`_{cCb-MdEXi9i zS7dGCG#!hs>O-Ox!yt-t(UDmOR183WmdW~EfR=s~om`HhK^lX>9j22cT-M|LoZf(` z2R(A}8A)VXl#gIFnq$;EYwR#sMoy4@j^r zqqE&TVo=yYE$9u-;cw8IRS~TT=+LLetE&-zAO&QFBwgvVuD~Cnm>PX<^ZzmiyGb34 zx*ENz86D`2io0JoKJ;jYd0&r+1ci-4rf!IxxrW&EhuFN=5PNeCvE>i3b*~|QTbOH% z@BJ~pzuy>3bB*zXKgJJpkFg`Z-}21JVUXX6F&c>g*QBHy#N(@AJ%NQ0R{3={2CD4~ ziL(~~;0jL_(SWp@Y~;mc_$yX^pz-m4SV#n{BoWxmjGhFA(H3C63+J}7;MSu@;WKH2SHAIr%~`x;)ZMt z(?27dcPDziUW0TAUu_`3K2V84uOw0{L}EY8^O%+?UY!PguB#bkk(ydFvSQcCRi{5n zJWogR2KQv66zriK4x>SY8!2P%24IwXK60PipJAn^h5H!x_uJd%V@KfMXRyx@=eXMd z%C_wa-=Rf%9H4~-I$)h{QKMaM3}1&)mKO(LNkdg12mW{1M_sFriM&-%O4$6{qC*3k zuPdPbAr5DU>3h|M9E}-d+t_pJqP7gG9*d9_3L5^?-9vP+FqE;xjV&~Vub*3lo!#j$ ziU+V3pQRn)jvc^hssM)3)(7$ClJ4HAEdCP26F}w~|1m2C%2v05opSavC;~u7f9#9; zp<_6OeG`nCEpAV+D=rmBQS$LH38}5eMuin11r`tHaYtdHwGQBlfBmacNJ~62)bI6^ zEMBT31Tft1T&Y7C<>F=J7+GfSgj0iCJH)&^Ie7o(@c2w~Q*lajle(9{`rk=M4sk2e zQ5)pLckfQ#oom47XD4sZPmYiNwk9^{Kh@~?;N&IjqtD+T|M~djmt(dTYIB3)0RFdp zP7#rPTg=nZh^?^8$`c zp57=(iVXhNtVpjDl($tSb@0#)7DW(-bR6RY29lymdUMJ0YYMMsf@|ClU~3G>_Z3Oc z^kjAb7#8|-ja$xU=?nA^$?62XpmIcFZ7Q={8a3Mi=brs$l=7LLzT#7b1Ai=meWApr z&s8*3%gqYrE>sYS zV3Y^HuNJ{15$ zOVh`jfUnE|dZR}N>lJZMCoA{xRRN>)27RWTn&T4J>k4PixP~0gZG+KRp9Sbp*I8b( zqtgL{+-jmf{ zIkw!}JjAr4I%)5d0c|&+x&(H;y;qUCJ)s`TJv@I$GnTs3w2m6HuXH;xwe|#DcGP?> zEkBA)4J(kU?aY?E6211Sl`Iu|+sp@}2%h!vG(vfzQj0-Z{9f%0eV>oY2P%Ct=?2D} zEU;t#zN~O?c(BCF3(2=A@)|lHN9MIc{Dy?CPvRao{1f|J6dTh{CyQFs&Z}@8DXx2< zh8A00M~rXN-EX2(BSIKp+tSc+$v!+fRL+Y}CFg$m9*52_<;3jAr1)WI)vpyie=Qt-v2Fb)Cr^!1V2jg{}13|{FN_mgS1TaVO5kgK~Ax)j0# z6=?{Tm&d5llz)3w+p{*}pA(T8L`WX%k?s-P~db?s8ESrx_aSbQ$&(2R?oxeGJ zbMkJUn1;_!VHBo#9!y~67o3)!PR@+}`TtEZPqU_P(O7lFtJg<|U^RwOtW0|-#~4xX z+@0YYqP`6TrM5H#U%=q|A`$ISKlre^s&?8#Z4MRi1++&C3b%H(dgpo02Gft|ZQ4Pw z2n-fR$hEEy-MZY2y`$EhQpK4OZt3QVYpPoDN>Sv!-uYet=jmZmfe&X!005)S@u6KB z46bCpO&vCu#eO2B@-FH(ngey;$uBu0{Y)+pJHs>;>w7dWsQ*@_zew>7ULXp*+ao|F zC=UdX zPgREgEm2g{aaLK)8md<}?V-0B2>Idt8NRw2>9h2dDP9kE8b6!7qwdQ9bJ0?L9Dq+Z zCS#cmKwofj)jTfHo%%dkwNIaW2r8ohFn;l@?MO~<;}U45tMtU^O}9<>yqG-*$iZ3Tq==q8x@L*rT}y25`kH2*y7I@R$gZdWG-i1bzsD~Z8_>u zPa;)oPu*0|pK(_J+aG1Sn(zJw>Q;xJjg)Tn`7s|aCS-h^?g&|RKjV6UO`rA1Phnc@hx)0mhl+@=Y|zQhf6M;^Ym^ zHx<1|S3$fNWcg1W-9HHG{p2xUUpy{i`bg&vQit!9E6f>Gct?q+qy?9(Imz)aJ7*B! z74m)O+^E;xX_nSUJ9_<{W_e`)X0dSqYl!UtM`;kgqMJyb)5##Eq#IIySXS%rsgwfb zt6T@?FW&zoF7W+q4{Q0kicgDAx#tFIP{V}3u+V!!8A!5tMJUS~*! z&m{Cpj9$#b=>S&8EE?Wnt2inO*vn&518m2sO)yCfoljb3rt9Gdq)I9RtffQ)aQqKA zGYM>)a(rz}`>K(I(@e+-QlvYfMUfJi3rUY@W!MwH;EP*)V_jsJtziv6Q)ZNM*Q+4p zGL1_RhLp<&=!=S_TE<k^we(|7FyiQ=RGA$VX~tF%k(eY$ znzSjT&SF0d>Dk>aU@Qz>BA_WsyTmNWuX-hSnr36i3Xs;)GMm*F734*-1gtKiB*^Z> z2sd7Ns+hxxMu3ax{Dwnjj0O(}KRh{VxA<&N$8~@Vb|UGxJ8yxrYazQ>poj^z#PZ=@ zy=Ovg1m?nl4**y_`j<~k4L**yhsQWk5%GJx&auJ%GpCSc z$@F=nPq48x`@|9mD?(&(#al!D zxRIn4<4ks8ieXQw<`QaZPyGD;r$dpCC7kI&yMsZ|!vWABa7qPr3dp7Ws09v`ogNCb9`xCZ-zp7nn#20B1PC*%V>Ii%hB!t~gyw*{qX^p?O*>whQeYgyDQ?oPO*NFue@rmbkofNQCH%in0>@-i_`Og|80Mzp++mnZ z>yFxiX7getaLiazp@GYava@cP#yV)g4RFGKxPG}-HP&LNjJr3;b{hZ z!&NND%v=RJA$vku3{WuK2&_?3F?l=2v}X(+lbxRyjhLs5qN?BFNhUvU5 ziW_U9Gw!O-tD8syO(trzRtKp~=~>48mi`0HG1w8){uJegmgS}cW$y~bIK|5krRS(( zYQNt>0}i{_4f5qUoZhWrwV#hj^E`BTeh|QRJh+r9jh106rJ>Qw5UlCLfb(=Es-Idc zfiTLsm}WOY7U~@=quMk6D9gcRv4_hj58uFV(^&C3OldO1W}AQ?yfY4FJvTXt4k%OK zvJeeEoK6k14Kgd8G0M@`z8Y4DF0q|7QX5}tI>sTl$j$A^j|yf8gz>h4UQQkj*KT7X zAUZJ!Y)Y#b8+c4zI2i>OU~{d)i{LV#C0}XY!!h%t&=f3oMPa@+mN_muv4rCZW|(u( z&>JR4enMN&=~BiFG_7{U>alqx^Z6E++z#zEwCkR%oqG^a!wcm#0Rt}7AK&g_i3*!2 zzgL}p!1tY8_6+5n`zbwV42vUJ9GC{6Ki6QkVCRf!sMHZ)Y|ljYD7|pAU>%{*r1l_W zalsbe;b+`<^zq4`O{T%J?CCB$vh?wU`QqnrRBpGkSLa8E`!CNoP?EQD_`W}1`%P+p zaWQZEEp7l>K&8Kr@aghrQVcp39M&w?Y8!0MYOrM*09)0?)^NP09)K%8cZQURurnO9 zm6_r{^Dda|-F@|jX~vC`zVP4#jJuo(v0o~GDf5A@!_Vd-wGI$XWUwXMvC%d_W7@C3?9_QNUQ+vuqYs1yDzGD5{Xbc|f2F&iG|4>(5^;fI@ zcYbD9^7{V55f~H7M6Ht{OXG*c14<%e_H^oRZQf7Oai4v0Kme`@dO_v%5bQmpR9i6U z;-V_1hPt$r^hL*}QpN_L3r;`t(ey{42G3#h$w@!@{yk*H*)=NEsiYgTspDK8^U2E6 z^+%uxt5yQ zht3Y5&m)}`__B-#jifK^mj!^g;1*nawODCvo!Q6Fh3C@qeChG9T$+O9lEv|}`{cpV zi1I^;y4M?wOFjsaVaJc@(V^<9$1b^5+NCJ|)At7lho`4jO}Y4&cPGa`ouB>f?IBIV zM&$e$|AyxW(@~5uMmzj+9Bb#)sVqGHc@eQXC|x}4{Xo<60reueUx`W=9p?do+seeH ztCXq;Z7NMQY;U0K5##MiP_v1vG;5@;POFTx9R1Om&5Jbh(#^t_odGEhRDii`s)aYK zhsP_<0sf$ci7imyyseumn;BVfaPsC}fdyvd`nUo!Z0W7^^mo!V;Jvo^#-EM7gVgm)4#oz~TqrvLJeA+sGd3*{96cH^92_X)@oU!WiBJE@p5dJuJvqK*}6NfYL|c~UDJJ5 z)i3QH)2deyj%j`5?d$sl-F#CFT4e`2;{Y>l?^*Y3a*jib!O_z*Rr-a876bc9RlrhE zduTDFR3xuz9!Ki_DgRXJ6S`Z(u3+QoRau@FbwS^$Q|YFix`sji-7tzi3zbH5KoTL9 zW;}4InXfWF0`%;;>2|Y!ZL$R8au>V=C)iZzKer zv8^lz&j0;p%47R-PDM{&)FtvWm%tf`g1L6r9a-H7s??0-4DJce-iS_nm?vJTJ8XI#DPYTchqL*TbW+RA!4{n|a{S)bVO=>_Shs-}BBb9te# znKxVY{iW*?{nTQ8JVN;weybC?)h2C?I788*&}ZDeJ<)M%#3Jm=*6ev&u%~;ua>-c) zykow!0r&qUR>bDU1_vUMFZ`5XzJ}BMB0^n+=DbIzS`|=-Fx+@L9_HoYtNr&!XC{i+ z-H=3y=S`SGZ(62zXGhVS8hTTViZ2C)cw}QC?QLbI5<#FxQhn-y;xL)iM5kmX0`-P) zQMDx+Fu?_2VY(OUDT|^Fs(B~kS(gg>rlJOU_j2O#kvCzK9tEO?2H)MIA~&7S-tTXe z9UE@y8)q-9A4&5}DW^VnUr9St#TnC7dsD}2u;FdNXP{mAMFu~m^@B*U&oI9NMKwvu z>xr;$>l^5B6J~!sIvymTxoP_fqEb47r{_UBNs6h|n0uhPrx52_ryorxFS5=&6YbDw zZmG#L;04F6afXz({lVcRr8sgofa7;#le?Cyd!r}doT~<3%0Lb4TjHZp_lNNAeum-; z*=JyVlk9sWZG4bimcoC-oFyS_>; zw$^ZFqR@8pokx9{zD`0tHPm%C-P|mA-xcJZ$=x#baAtDA`6JGqB+kJ@P#j$;IUK(M zbZ_U)uh2cyn0gyO{e;5>yuL@EU#9rZ_60^zyFbHK?ZD0X@r@95!`O5s*Y~oTvI2Iy40gI6FX^w$+kA|tb@L3cS{&26Q zMD?jhb1o$R7kg;niMfX#c%0>Z`*YjI)#%UQU$If=N~A(jw$t`z^h#-ocJ*CZ^0la> znKYw;NKirz0t^63R`cci+wXbp3jis~mYudY)2T&Zv3qv+?0KKF+ncSsySrYI&GS(- z$@1%{mqz9GEYJQCjml!XjMMuM)1-Bl$JcQhCTf(8Bh`MnbvuDq?;Q#)tPNGN+Z?b7vWT|T7P}g~!rg3_m#QzNQac`7OJFV96CN5Nw zP0G74j}-h30NlpoXskBEVk<5-y6P@2Z?bs_!``dt!z_=ALS?y%r!#Nr(trlQ*@E#adiQRPjf!a01M7wRffH&HTHNgQ4!k%Adxhpllq4X>j@g?U^6Y-*Bc zQ~GXRL@JxWpALMzR_kq)PvfG9VN&qo8b=0L%M3fq(g^>;FTKyqV6%BX%ZjM0;&hbE z$2cCW!ZgZ9F)VO6g9(ko68bK>w8+?PQo<_7IQwxckH&FP=JD0MjPThckD}zhtBUy* zZW^{n&?i}vWOvv*tQ9mLQI|Wd*7F{02~3N&v^G06ofjpnV2Nu5lguMr>j)>ftM0Qo zy>H?BQ4+?uN?}RQ@A9mSXyi;Ii&-&sJfSvvQCfDdQx)QFkLRNjr>nxz`!u^tqVe?< zcM#rVm(oIwv(X%%)B3dTvN`M}zzK_%N3eXj3$QG>DF|U6{W6bXxnRd$^i&@g5gIVE ztJ^5Y4J>%V(8&zulP33S8s_hzSqN(~AKlO%v=%Q4w!4aOnVYBHYJG$2%@D;f?lipD zJ>}6fyM-pB|oE91V_I ze}JbkU|;P8eu7_IzBxa<{C@DR^@mv=UQa^>5aL;EtJ%D`QJwm87@iKwj{4)DzIpaQ zi~s%YpRq-hj^hcAN$4G^y-|5Ti+VQ)&ZD9n$64)B5?@uH0kydHpM^ycwlUXLo?#FjvJ3F>b5NqruCI*Q%q|*VR|%sXR0bM!y}vC%nA4h8O39%k$w$ zE2si>&{EE`ID@BAI6d$h+Gl2Gu+Q`1yW`W>K>#z}+2P(`@T7>GkJpg$!n@wh+M>^g z@!zJ&x&EAChZQ+O+#JzSfc4D7{9aAwDV=_#eMwIpX46@m0Q$o&rlloT5q_RVcd7^{ z_IwET!U?>BjlPE?7!~OTkezt~zryjDNU-7;Xn_I&=I_&}socgo8k*@<`a!uKRERXQTS;5E*~v*+q&RF!i4GOJVrl(_!?% z|MVz=A2}Tm@A=y>$Avfw%WxL}g;hY#TFTVk^#AMZ9U{;9@!6@`S1)$!O^#2!CV#3o zdD|Zz{?%#n97fvS432?G=EM=p960z~1fenqMvr@wWGw8UAQG3+v{0=;m_GEXCO{pC z@A2odYV*9v^471d!1>wk1i`QBFaepg-Pu*YwSwC$9_t7AF3;`&u2Gi2|8G6VCOA}y z&vy~6o~f&_Kxu)VLOcKIZ!jU4(Pk?Uk~9iMy6lfe(X4ED;K+cOIqo9m6WK!x2Qy?_ zAT00%z6UY0gc$_9M?my$0E>Z(VwYF2GC*}-!78O7Z5J$J!E%=&%4;y7e$m!=)>VRB zfY~IAq1;Op6Z(T;QFw;2Y1jd7$Tt7^0RWwaG0^5yI}#G;Fu4ow3k7R;8^NK%M+J)7 zk=G-2((Ztaqn9L)V24w+0h<+Vh%m#=%-R5Rg8hnbfnP9IGPF3qIGtNrk-KUIlQ2PH zdGG1~#QM=qoB+eIVk<5L=>foJiufu{pu=Ks`|5yu1tE(@CmAs4!;?u8-l8S|9k_56 zumb>6h-4_7CnYHskr6d{Wf-JFPp_?E29&+UzF_Q5PyGnMrxEJ|848pjwffBQW z%aWJKb^ga~0Q313&)zniF5ZLCjNY@~TxD=lEy}hPQyg#R>-eGS;NfP>!=0hSzk26z z2p-qB*LkWU#*-BxmxH>lKkK?L4Vedi73W21em^wD2cW1sO#lBD`E29uCgWyZZO( z*=2tSYQ)Qn;lMon;oaHk>&xMfZwJEaw$+6UMbf=cYmmEvoJ2*BM`3(QM;RJ2h$T~J zgVV#aBT!Q=FHZl@>Ddpb-TI5+t8eR1PX@31hd&YkF1||tB5E8BUiB|dhUP2a=gp&% z2(rn2yaXu9$A2D1wCWUVa0E9fINo&EX&&m!#}~8da9S`JxX<^^i^j#RgR< z29=p8xqQK0AiD(lkPHeaNg~q+0aXlIpw@$u0}BX!IvYkDG(~}@>(gQ~vhf*34v=aw zpcSwjVBTRveuT<4u{UA^M7?2xS8(p8zyXz}ZfKi5(tVN zwYdAgfWU87)aQVRV|WH8c?^w|^9C8`Zqo~+6*RoFYJ}yeW*m@dcLJaVIZE~IXGl?h zt1?_^N3VcLZElhXRKZu;48m2!y=f68w-L#tAxYnC#DMifsU2{W4Hg1s+c84m;YqV} z>wI{krZC;Eat#~-O7;3xucHPrVJmcc1$e7QI22(qv{!O~(s_dCFo6G&4T4TD9NB4D z;<+N2*+xpj9_$+mJkT1BCm)G4x=WZ?Q7`RRWP=4_YkT4Ob+rvd?d_>-hWL=>J=ks7 zV6&*CP`t%a+v?Tv$zYSg?vfTX2I6p|Izrs{)w5k$ax}KyWjV-PL`@Kx!fQY!M5()* zh?e2*24qxK%)(Km1vHrdd!#q0CIs*iS+=u$j7J=;C+{PsTxf5;31_o=A{{V^>m<7h z6I^}3(2>Ix0+Qp6X&rhgKt<3Xkh)=snHI{&5v(eSl@5%wn}i|A5)utLcfsamBS#Y| z>5fp*fKEv4WSeP>aNUNr!0cKE4a&jBEyAhQvJ!>dvq~pT&s=*nztMW%30vQ%~k~8cqLkT@g zyV~0ASdqz8%}7>Nc|uL0dUQS_(r*#zL35o?Q&KRVZ?WI4qhtuy|_vY+C(B(wSpOo$LREID1$<$X4s>%H|j2g)_|U+ zHq~oVad1F$!flX+%A-j_?wA|Y^I(HvKNEnc2U6T9GCjiZKoR3fOav{v&co>x@eCIR zDb^L)Sn;f6xji?m;^A@`EGRnEC)#fX0yCHSY#gF*CW8(&SgiRK8s)5t#IwjnR+`2s zj0=+_f{B2SvZCZ8J)O-eNHHzgA=nqV|Ubzx|~C1=^4J3nU+VK#(FH zr6m?8BvBWdFB8$)MCOu{X#cCyEE|Xs{^|6C+Q}>CZnSXVyHO+reqb zHx-kFzkp65YCRmC9bVAn8lfA!c{w;bg5^5BI5}B3_)&k@U)b;P?Cs^* z=?QdQX~8}}0R7^0*a}cPo}s&a1bk?xRl#{i-1GPG%oUKFcU`prQ9HXx1W{mCi-esv zb)nEM1_Cu&7y_XQZ6MnPH)+q)BEC+6eq-YfwpRcB-|)}=zS{VEy5aoDH(*rg<+l|^ zCaXL;Z}5x&3jtWvo`M5S4jm1L|4rLKuxmjjlQJ3i``4iDb=gc?=JNzSk{|;De?*!z zz%Z5KX8QynN_)K?IyL9$MT2%A(Z5Hv0_C}8kFhh6;GC2U7ckO|VpcxXra~xO_bxmt zL*5a0LAak`*7!ZG4@@@%w8$5Br(MM$g$D0{*rFIgu9h^Ml0`am)jX{&^h97KEy57` ze_&X|EG$^cNy5SbfaTSQy6v+1_zW38382Oy9n$boo@co)?7O&(V4gxZ9u^~McBi<> zBQ3#gXUb?UG*faomzfJQBh<%X-B7^(As)St#tFNuljs9TeiEZ2uI~3yG-ENPU4YOJ z0^e=a;dm)@+oTj=GK!YZ673v51A>i3)&jVCM^YJTZDp93hUoaUn#*q&}F)^Q*LHQks ze?_D@yljFq;YB;FC$053{fY$-&}R_U(h^N?Hx#x5TRh3;>9~vj$h1Hi7q?P$TZ76~ zse)$>GS7fI^U)GdBL79=DjmyB5Np!w^5y~T+!i^?ImEE`iTH_TK)v`Q7&IoE28vU7 z@ThZbH6gv^87}4@SzPK>X=`N`hww-3Xz?GHkC_7#W{%Hks~MAAqSL0$eq9n8zWSEv zH+~yz%2f6%Qk&Xrw;4c>wQP1~9rZH~V}{i|9Dvk>5d`}8p86951e_+|V4LcY&-t|m z+Pr`_7D9eCBkr}n!JJ3)6$c|=1@+qLW%Jl9jLYv~+|Ajp!@p)1YN+>2Y94(~OQnl9gl#wm~-I3?p}v_`Sp?8aj*|JDfzMMceg^ouS%Eq&QA9cE-mclc$Znjjq}_fd7li5g8ib>AkUB7{Y>TFVYn~(pSD+3!r2(s&NlF zWPKeWuChCfded~{opl#!9-E>^%uo`e=!?WaPX6>>Gij#aMvaoWA3MaDL?jY=*lEI| z5nEqnWvB^-HDXAvm^V{GzmRRfNS`w;R$*`BVn^|`2fu(^MdxNsLVMP_JRh*6SjRyjbpwft$vB_QSaq+ zKK+=Ee0E1MO4&(v7YU8JeTauWj%iWrTi`IyU%*r2y3GdY3G)*C0Gb8? zHXYqyQ_zSV`^o9W8`!Ji@$g3sRl|e*rvEp2a(Oa1eLeguy!dmAzmw%*%PS>a&-CB|-|Qvr#a_qhLNMk!TE@%I;Ej+Mw?k>4y{TW4zhG z8FC=&JW^b0X>$~^IT-tyBDat@PU@>y@sDDMYDcj%^C6e1^?ojMn_ACklNKJp9uswi zo$051HZ%*=*xRi}0l->h=n;n9K{vX%5GfCUaZa3vum!CB>5ym;C&c1E?eVy%>d_ZG z0as~XHvp)E1JD`0S7Z**E5?V3*pD+8KH4ixMkJW9WHE-nD`YBeT8)`0^x#erM51hl zDJ$eNWdCP}RFlz-bR%Kwpzb-IS0%1jX+udT0_NTxM=Tic2{9=at&q-?5r`7S{S;Uj zaKE1VA*UEN=_zFFc0@T85opeL5r|!af)t9kA(4>q4Q5{$Z#MP=yQ>MLpI!t)8*9DR zujx3F@l*Nd<-8=_nohR(c8dxS?LLW=5>go#y^aoXWKWWrl#AG^P5byE#MS7~Vv$#r z_EC~VJaq0#H)J%Y;3<&J$@eN@%r-_0=kt$w`krOfJSyf%DN+8h#tV|XkP?tz-40{y z9UBG8Z@^B_Odx~}l!LL^?!JGD^mMO;wesiqBgKtTay-BR-zekb;G9sNLIUI@$( znlppd25Uq*$93RX)?FL?;BWM(YFPjA?ZB~TS0Yz%ytdfvc(&6hB$*iIyFvQnhVfxe zbZ82Y-*^I?MfjL@31ert9Zn!rU>t`5de_PJDZ0>yX+j=%oEziUPT;;5q-&WFqn&^- zRN{@q;3a`Z{0?oeDAr@BR*R#Vc7nhhRTCoPg%*iBxtL$+Kpi?lcX>GTwRbToS|Lhp zevb=eJa@)##}3rdCC1orkUZ%g&Gu_2NU*F2?~NeYg+KvXf}gtB$1_wnq$H7`j{; z)880MT0@?%nyJ0SyukjL_^HVR1+5Kyx6$)6J$9wbGg1Jf84@)Kw&=AiJs@vygpy29 z@t?CqO)yrdvHiwG6f}L-@ZBqnu{p$9!Fc?w`EX+1p*x-Z=|dBxLrYOvhabeYL`FF_ z_ef%$lOo|y)&szU+Z%p4=*q(=*|31hjZX&fNVJ;bx25geNHKwGRQdJ;vO4sh6JhdeZMp{9@1DU(h|;?yDLC z9JCR#PG{@DT_U|IXs2jGo0HJso2npu5?1h?ofzTMVY@SU^RQ?yTLSXKh`tQu6_D^z zb6A3oPqwwrX#UPFVGb*hibj5*@j*jxKU3{XUqtEb20A>dnF~FBbRvFFG4#Xuv(oI% zSD!Tb)yDSb{s{wnLRCNI>IEsr7y`vY`g0d1?`xc#)pi#4OiNI*bNmpKV`X zVg=Mll2thnf^|gVvKS5PgCGh#;SSL;^6reY)R)j5q^!@l+QPu3sjG+7weOq1T!9d_ z)vAQBHl{O>P(-2ssDV*3DdKi@u?mnyM>nFIj_eXr9xh-+8IR@(&~xDst1q6*lWOLI zM=xjtXX$>*DzCE04Qp&%*tNBO1ov4mxduYG!n#>9S>4$xv9wS>hF(7g*aiFX836R@ z`WW-o(T+<(O&%qoR5`+J?BV-@f>n^3n7}E+Rglit1FS?|#$Ge_e8Bm@fJu~!bR?L{ z(6dN>CZsFwvQdi9ART+W&M}vT<1w8~R0E%A8t70u8xD4ip#Zu#|{)@BV+ekf6z5qbI1`rIO4G0qeAcM_3%Y8p+m{GLoK37cgo_k<#`B$dibP^6%H ze*EMB3?~Hr7oBDw z$CO!mJBH6!o#nfTf*Z|5JPq!1z%B#UcPHl;3joJs;Xv+Ko|*wCfA2dg)73N-KKHvj z4R7P?(6|Fw^3=W6%}GL-t%O?3R6*KJ3hT1ZsunEy<|#n(MTADFV(BNB2+Y%p54G|1 z7>}137J$Bz;#T?glhn6I!Qm=#pA1B8NnDL-F&H*MN<-p&_eo2!>iB`D%zo17o+sDdZ!m7vD`=)Ar)*n0sjMYgwR9%~zR@>2K$9X|>&<{wZeA1)rjiviHY8HBI zFy1MRQGl}1s<0U7($_XvT?7Fc4H{<)4;xTy8fM~~5ldY0KAuUboOEkoJTzP}!K4K| zvz9vT+fTi+3w6C$`tlZ0p0z8By}aqNH8x*<%re^{{zI2}DTc57;VQWPB>Pas`jwd1 z3e#9Zvzv&f2|M{H%Kee>ETZ5a4U9*~ABodV%WEx+=GX+y_|(wyiE*cC1lJ(-S*E+d z^|0z1e1zxXDHg_#^ihXu;XEGc&3K|S^*C@AxHq2QNCBJRI#Z>N6m3iPUOJzW32Lm( zlHpZ`$!}FHaLC0jP>hLe@X?Mk;Y3OY6DcQ@i2u_8MT)|Sh}}2=MLnDGk5Ni>pCgV| zE51?FMoqAq_2nh;EmcWywOH#)E|nKrTjx}|M@qEPKdPd@qDITkiT!5fgW`AY(hfZ_ zn?Itbk9l&wi;`60)67^d9jVt5W54pl3aa_`l__9!Xy(9%aov7E&ok&n5uP4Oz;W0R zZp>nb>!Xle%5*K0U*=I!n&{*vsLZ)zs4TJlU7?cTAq|!M{Jo))uq6$Z{QSM4!hk6T ziJ+pK+K&GHyFumDMB7AccS@wy!q+|zR2HoI@zaatAHpxSO!b4O;jwbp7l+3?avC20 z;C)eeyu+s9F-PvpuMZuwKzZQ!XYGrE?s4pO(oFrJ(UQCloHJ29#5gN(}>i4bb3QEQM%NTw%B|6)>a17`I$+*<=piV7(~Q zl*>9{m>TqS8;7=_mlOx)T=xl8N@&@-e^G(gZNxM}sLuO;v+c;mE@1amo6=owvOB78 z9NXlaJldifWfC4i#lfh3AWTtSKp*a zl5nDThg9D6Dk|@Ahv`^$xd#FO^B=Rk+j0}^!vb?1IXy?0pVWcP@FA9baZY*}=BU>j zJz`M}8l-{}tO#T&p#*MCzBp{i9n39r$(3e~Q@_$oy-6@@@)B;;wH#=tD8S1L)IB9%t8v>%uh zKm$0^<5-F%-s{(tUWO4=8jnjM&ZcOx_>(EH!M$~cXfb_W%&)JRb5n#h9P1>@-YcCV zDHqvPvsZ03_El3@%@^m9m#QlEI?04aQDHg*g5g&5^uGtDzGDY#OPacwu|yt{8+4x| z|M=13>Qo4VYwmFfQ+@PCgAK+udoKaZ z>E5yaE$H9Li>eH;%!0Z!FDt0!Wd*^b2Ijp-2@5|wPD^ikyH3HHmAa(e#xe@}(ms;Q zuBp(|n68xyFy#yXXddVz$5GsQ&(?a<^b6UXDb*!+%Y|G#RfxG)4F-{C*qHc6IBM*i zWUtlBMN%B)cUzE68XvP~8_A9Lv#_+&@)le|)99q-AW5Q^jv{s7PrA?t?W7WLY^plj z1?~!WFM!NYT?doPiRV>BbINkjA<5na1{BL|Aa$~wAA9s9JmCvC3G zQFE*yk)wtV7B1UAEJEvd-03;PxwtGySRd4;^wn$a5$&T)K93kW2l-sEc_Ddf%olX4 zj5Q|;)&?*|fOUu7TAIErQE2$w$)MNgUia3pRP{a=_GnM|C*@SS8&GGujr*{q-{6Up zH8tTP_NHS}9P!bV%dW`wTo=&yJvukuoU-l6^NiGAFY}2wtrt5*yhe^+o?Ifz`b6|B zP001*W_lG}^F_A{=c_}vmdx2{@>%BX^l#=)dbCj{d~L$?v99tP6Dx1I4?OHKV(uGG zC2^QbEQ ztKDsZs309`3AaL_m9w!--%9KgIgyKw#59(<4oBjkvAdw_>%kCliYk zfgqKEmPq1B;Zb;Taa7$P`noSinuk9LM=C0MO_!)*-^VHIP6vz2XZb)I)q~3!n-$TC zz;4+mswhLk8ZQkKC$CJfs5ss;t>sjxh-c7n9Os>m#iDbey3Vut z%(ocul}lKn$Xs)!aR4ugAbX{l!X-|?SkL@WfEE|dh-{H6G1*cvMybvvwmcmeK>-Es z)n>Zr28o1ovQ=@W1>UI8(2-e!mI#Sx;l%_;z5A2~KzxQTgfgU;W$K<{(=6WXQh@A+ z?XU2DMm9!-Sbj`@81dOQ_mczLC)Bv%GD!MjatHAwAtcT@?JS9l67A2U5PH}lbMi6Q z1@)WI8#JOvQ&PD@wA0WXR&fgFIKo0`qsZQu-Y)NFXn5|hAasu#F&b{z?=eS z(!DdV_L3~W|I_$bj#GcEBl8_DXQ=^xPwhC8|AD59_%#L7)XO)t6?rDoDCx1jzpvKy z6Ci2d0ae`bo7i~ZhTgp>ijVBO8GcM@YOn}6W3bs`=@@=GLaq0O;6I}41@H&20OcCB zl11Xvk}sZ4ngT@hV$pC!J&JI{2P4lGfZQbcuQb=j55MG;t-@d#=l1sIo54=-l4%Z7 zt($lZ3YGMK60O}E6c;0(Z)2ib>RF$X(m8M`}$u~I*4Z% zXA8IMOmGtZ87*2=W1%8N>sovKJyt<W@@TJ5z z102xMWF78`eNui_t|&uisu%=>%x=URT?7FB#qfZF(jeqc!$+){RPT-dJ=cy6VtVPs zp!VR(jb-J=pSW_`);X>&o;H^DovAq1RXf8iu{STWjk}Be7~{C_ZvEX2d0Ro_lz(&IT&?|bYd3XA(L zmjRw(8TH9LA&ng)=prhHfZiT`d1^7|+jOL+T3pzSN__{E4(kj4B9r!S)2^K&BAxXE z!ZfRtb=aeBi5U*nfimborupSAce&t*%DR8=;)Gj8y(-XC^xnQ*agaZIEVDC1HW=|0 zwREr2s!xUL;W{u$_2q*9ZPQ>|2af-jx|i2j=Xz6vZikh(y-64+QllwoT5sn9uj;~A zLj(ZrV48)`9I=)+m2}F?WrOTX^5am@$)}?g<)%*#N~)4WeIKXSpywCjTzb44Lk@Ny z&Q@~Pzk&VLFvcNcAN74*{`lB_8o2RtPO%7<8hw6<$S(n=?gm}KLAS~P%XNfhIaiMv z#q)Xo`82Nyg+}=bfm@Bd;0fT}{SJ4G)tn0cujFWc| zvO=52TrrFEJ6ub5inNH(c|rabV}Rp}$*K|Zdy_0X(7j`Wy={C_34!PEcX%P@9ZKHh zS=OT9;r9l#-!S^Lm)5%GjHZ% zHBNW$sxsrN1D>^Nm`kbeTQ@;;AMTPP_Lb?8eHkedl!a2X9gnGpu zt0h2dhynNqfX1ur^@(tcWSXVtJc=Ls@9>i59q0V;F^FsdFq+4f+|zdzjnLBucrmdx z-6RPo2oT-kB+Qe0qUmEk7Jr4)l|(x`L+fcYR#bSZ6SVG37KrqP^{Oe~0nPsCffaL% zB!-N25PsGAV&~$CPn-l*NaZuv$Er^#?97&9@_`X5R_xh*HN&eR$!XUHJ9ysQCkb@e zbz?)yc|A77hI>%mz>U3)T2x52$-%~#2mtxSv}QaPADJQdl-Zt@B*M=F74ys=biHDe z+@^D&Dk*yu-#MY%uIz1FADf6&y~ewq?PFG{n(*UXd4N==EjNCW2Ol5GH9cuua=>e$ zIjAH@$Sp-2YI7mM8Dxtk&r3DzA3kX4xKwY^~I%*7;f(f)>k}NNgD#t5Ugsh=JL)YIFy*Ngtx)#xH0H= zmBC;;ZSbn2?f%w0fctFSMt?MW*i5@c9yYTq!LQYN8O*0lxbvY|&(-)A-f9+kpMD|6 z6*9N{N*}4OwzmFtIhW1Dchm2G2bR?g$p1I|sewJ26{+W=0(#G@Y~^$Fk?rlKuFmE- zPx|l-z8v)5D7ie@nWZMoCa!`O8flp7TZMx3Bg%h#VKN8h9!4Gh+f!>PW{xLo`VEIy z93J(DeG0}P6#-TuME{HE;ZxFIO46(-Gj?oa>L^nkZ-J*P@$j}Sx)hjF;qOAG8Nl*y zBfe#ja*dJs(+z_d)IpXmPFP`xrlx*m3+XC>CdvZ4V-OO2EpMt^hcxI$mb2`pPRowi zNMRyxCc?F?cJ}gKFOc?!mZEOL`cMTyTw%FVT@-C|7a6TdOz}T5Uy6RAx#;`0jKEOn zDE}}AB?@)s%Mns3T+|ILhqU389;SI$<4R)Vig6g3YP(w3;BP}oCA3`3`H=G8X;4u4 z!=#8Lh}z>qqGkQMJfqWD)}8}&qb2Y&g6;>vxDc2J>&!YAvws|#!m&ve)MTgRYRl@k zr97PnV1_O!J7}}R2Ms+{c`@5_SWbRAek>kjykq|ECL*zwMl<<-GB6id(D+(J`iegy z+xnCJ;yEm*X{$F6z&t`u0_}n9@ueB&cMt@) zu9LB0{0fj{gH2+95_O`YA+BWbSxqjkOBuZCbrFMR@G=S0_clQn zKr=RADP|YaRW*3J`8HqgcH+iVlg}%qI5Dw&oj4sSP8abC@YyRJ>J8fkT8|P>++mt(30&$O6a}@ZiP_sFZS0QYS!}K*u>>Y)^IVHb%WW8qA5@vKDd zVf`2e={P)~HGp~&n@}bb!&0m(|GKj7xBqfF&t&rY5Y$L8!y6J7C*wY6-YjgspUd_ zh=S)`5r$}RMJ6YTpyjMv9Xo&$SsB@jgasSAw(en}@G$(d+o>Tt)ZvWaf`APU#<0n)*vn`o~o7{STn=OH2rjG~O)Fs+BE211Yx@*lJs4 zHd6`cpHhWV^=);CE4*wM8eFq6Pp)QfQGMK59E~E*y_AqDB9UE{WZ@Y9{qak};}ziQ5RKR~yd{iq+kmN^tBW?c&v5J$13#cg3Pz{nmT9 zqRLilUDMZ`iy(At=Lw(>tSjxiE$&(P;8BPt8{NC?4hFWVj-9M$aQ!;fM)*90J?JXLUiI$iKj0e zQdOczIXqSp2T@oRGR$#)n7WQdSlO?_5vpUVl*J`oXgnu^pKP+TJSw$_YaF3KQB28K zZ=hJ(XwRvj5vIK245?@{nL3zX;C!dyy>pkZh_!Q=a@36H1m)-1=7$%&w#O`YJ;*B? zQP-n)pMb!o99|_)K-+!Ld$_$F1n2a4n7y3i1;lF7c93$HT9~RKlin3KT3>g-)=#^R z@YivY!km`+z(}3bt|u-Azb!Z`jVod1ifw4j)$-rSt`mARQBBW~gkN!D(*35td$ z2yU#d;3!ZXa1wF$vhxs_c90h=n3WsYK!Zg0VDY-VqU5sCHrsz0A zxw7{((MedY_oI%tmRZ7ii+Q@}%>&A{SAXcuMh^lx+hWMk+Xa3q*_8 z4g)kjniWFPFiSw(z$(}i+_ZU8#+Z~4nGzk95^4m@k{cG^!AvSQSUUF4hD+&eb)e=x z{7jYw9q?)%S8swYx@thbG?Sq4jf`j|Can}%mnv4F#7Pa0$2ulovNDugz#--`^0BS# z$78jP|AvBWxJ+!v@A)VyMsCW#)x*k)xJ!NZRGSi$8~b{f-AVWj{XEQ)N+tni5DE9H zfC?OfG^dVa-VosVgtzSt)9I;~81GCGKwN-(BJ~#q54x31 z7bZzjiPd~H@j%OkL7Si+V-fMY>OFFWzdv?MDj47-tz^l3O8!^*>v>m6W|Vcv=Gh&k zCBZ+>QSmhSFwX$%LKzj`a&i{+a~EfJDlpY@UQw*SDG)SF|F+~Nt{5&kl9m*qvaOnW*li`v7Ks68|9A-QvTp@^1R;PplGR7u&wVKY(% zay+M4v8ia9xWTSMwHF@j4zoU~PU)5#pbh3LSp01zJA%n!t;O>}hqM<`M+J4cyAZQy zFw^VhJykd`_8lfzU9F*);gu?2UeNNIw0PWmAiB@GP3Q&4N0&NSBavIhglm>ik!;66 zOi6-d^^h_RQgxf6{_>FOqEO?bvo~yZM(oL?)Jc)eQEK3Lgce_-qhaQxy@y`b#tP?9nVHfgtlm^vU$Y)^0ZK8SA(mk77cMDl45sw$L48HiC?cB_@^^bk?oar##`DqSkh2MBBMWjIHLS#?JZ{H7cpVc5c|g}UmH zO4SOS|AYzAy%G&?kRigmwY8>~E**tNHCoxw>GrnYiV~S?&Gho>C`w1b1Y~44S5DDO zg2Z&YR*9HRR#4*TYpCs)_xxlHSh`swb~9Au8Sy=UHU{0YS6Q}s0T`i{9UcL~kd+^j z7WB1Gl&z_Ai^Dt*??GaO?Zt;b{oL`dcH>YjNysGx!jM^^$QWCsW>~C{s?e}8?x&w^ z`Xz^UlFEV;pv4IFMR9;Q8k4rSMb$yLhuIryU~FJYWIe~hbL6edM|*hoaoJrTQZnUR%f_-#y)u-Mt`$gRS4_~?YpXcs>Fq*WEG!MHgzgUQ7LpXxj#04R# ztYI-{GCD&wB0$q>X{Q;LPG|$QN>}UFCu3K-hc$W=kMgX@CgsbsH@h4-3fp)we6{th zf=B8Og!UyWJeBKXica? z5n=uYbT%(zx_XaGpQ5`4OMQjr2E!dMrgcwmC6-^NsTHg%20U$Yspak)`& zO|(`(1wizc!?JBA8DKH=Mtq1i0`Ea9D32IpTde(4ly1$ku7Q?q+qP}nwr$(CZH}rM zWsS0J+qSJU{<-GbYo5K=xjUC%%O@fuGqPvCk^O6}=QQ8ba+&O`x9&R(;67P<+0lSI z&2fIp+)IAKHM82}uN$cDd4=DvWGOew_=icME>%Bx9~D7;v}-!IHW)2ZzKrK95;C1P zRji=T(th=|hUYvS5kPynw)^&dNsai(6Y1x0P5)}(%7x{m=;G2!h$LuQ$ueT}Smp1$ zbb+17{Ot(iG{dd5hhfp8(pY{WS$n%(^r4oJ=)V_+0ALGqE$)*dS>IobJ8C%cev_0E z+FGJ?gjR!3=o;dB$HR2PW|;U0KRV#wywr}kz}2Cu!dzv$&b@kEocYsVBrVUsFMC#b zaywbURxr0JoL#D~5v|}p(XHVCfSbveelmJ8> zo3#OFbI5M?C%HJvm4m>P?ugb4Iz7FkR9gJyXv7Zq)&{=279?Cz1oxUp>5gfB?{V8; zv}NB{3FO*NVa~pBrt;3`BKb8W8)Jn{5ekZHIlNOyC2&$t`GwE8RUas!Sb`6VCHnfZH7OB4QGBkORkf+DPJ!jPO<}shtV5 zA^TSz89F1fYVtg@CAY^FG3$`9l_G$Ep==Lo3TB;P0$;#@J8Cv>y3#fID#T4&ne(?= zQ{8AC&M)1Y{I4OA#>U;lCHFCSw>?jqC~L&c6?MNc*X66a68zu8r`aNcVArk^Ckti) z2}4-bJ)Yu|9f>bVRpwE4Q6GO?2};?|QX_e5^?-HG=I8WY=eX4N3gf7^`VaEX)_C8h z0Lk_2tqk>x1Z|@B_fUE2qBYM8aC<841jp$_a%zAokOy8Y7pQaT$SQD-QfC!9JLNiTbB$y|rI>h=%7vfv5UZrbZFL__U zwFMK`2sW*Qt1uZB4qz+Y1c&dXu+;@PN(A4UPwku?qk#vs*dN|P_)%4xZ*c>3U695J z?=O3wz@R3Nq40t#PQ%cRpyERXqwD97%|rvg=!L7mvt!xc%)VItQ4L#{=THnj_ltzp7u9v<^$ zlAnTl@tj$pqPA*f`XL?d-9h%Ecl&s37>;(%;GjH^w<_^g-T1ZMS9i9MmeIEwUiypq zq)Q9rcgA|U`Q{(h->$B$UBceN14u_&zz5_>qaapip7U9!y8fdXIUtix4iNoGXY_Cat#F?y6)IL?+Enc2MO_N z*b|$Jrk9-4(&cq8gVgffR0>Pm=zYz9Xace+ws|asAxWvI8-%QtMHE*8boQ{5KPfV+ zwm|`q$~nuBf8}1;#4M9<(IS_9j}GZ7R0(L~f(Kdaqg^~B>~SgAKpdRM-C;RGf_i9iKp>D%K}U0UP3N(zgp>x_ z_Z{wmRGT(c`u?bgr{k{7%>1e=H|?Q>F$3gZL*vF-@F;%b$@@H-{C*d??Zg{ewYV7y z#5sB@(6ilOi-$BwIhhPGm-D0?tmY2&8Z>$jGuW>I5LI-KTww6!N|mG+T~F1G{#KRL z$nVUhYPqop!pSXJ2(Q_IHa4-Wo%46iv9)G(%@xp`j%$dw8v+=_AV3@NF$G{li6y>R z)EZv5fDXZYjw#LwTp+oeIYhq^xm;K|s#f3vwdpWbtG&03KxEmNxGX3hNg2dLW^Ydb z`=u)M6TPsDk6Kn|r7Xn~gG`|Dj--k7LwMD(nP3U`VScmIttcf#o+iea#y$1&V&-yq z=Ah=0)=JAX$sY9({kD}cS>Y_?VGB7O#vJTK+anR^W$$aNOMRR~@5oMiP^!SEN(;rN zZulRbo?N0odps9jJu*~s zzwtUP9=F^wXN@)bt`AM|&Q2Ouen#o;FQ}@c^mu$cyX%{qYka=y>-5$hp3aUBpN^oN zUGk^&_v=G883K8;&y(Y`i!L*-@rF=9U&5+Rf0IZH6BnT<1R&YF-+2dyvntoavBH^C z=lYP4u3fExE4+9iQC9>gZ0n}K<2ZCmw}wZ6FGvmeOAwRn;)e=!;?v7`7iaWZCh?iO zl8u{g_Dj#OJWnjMqJba$D9KsE(emFw^692c`WsIcrd}c?+uFQmPAHjq^z1Ld@sRSI z7QYmER@AGiga=xT1EaoIKKk2h$ZK8{Jnm;LIN9lOVf8bZI-OX`=1LHx8vT1ze*nf@ z?C)9^{`Iv8YxNC@wEQD|#XmE{Y^%qKF7jAFz7Pp8+#p`SGA;64;lw3O%OYtwl3^ZR z_d73q=cJl!VP)R<<{u?}5~{6sTkWnps(Sjin_F8?4=zcdP6=l04f&%+zB#2o3IF<7 z1k)E+6t=mh3o@x6O%O{;QP7opNn}zs$9s8x=obO5D^_f@VM;U)E{eM!8K@5!h+VNlSkci*7lpm+ zkgf{Mf+XO8T<9m)v`Jnx3-X)=3`R&1ATKjNWtp#IP6P?+y&4(lW0bKXOzAE8Ebqin zGm0=~I8of^g$7gxlb}t=_h?UI+ifES_~jshwD_XqKc9-&EeO(bezNpy$&Oyk;E9812&F=eVQB8ea`go6OVn52mS82iOINqGwmkmnvb4Z%(q zFsmr&&(8F(PerUG3+)dGl9}>cMfo_zLWkobya{5BoZ$w6dkH=S7}&96W&3KNWnj== zOnwepB%uoo0*!$#Op?rN@1wX6vgF==fU!Xs@e2vPfp-0wm=~I#tvJRIW^v>xV9TO| z?bwaHbsQUzRM-s(#rKh$@6ZTiC)N@5h$m2mMl9@t{Zc{jozgMiIA7^r9h4eQ#sOnn~P`Q33&u|Evg08B_FvCP?5!aU1j+1ILetP)+cqo3E^&oilT&3$m z%pG>$o|K+LoXJ}=SHGEtulcUQ@&?1)?P2JefE1ol9?--2Iq68QN^Wf3w^52AA1dt3 z+sqljNyfGyJ%%J`ndnPkA5e488vJVd&55Ga~wa+ zJynCS<1TukDeZG{fAFWEd>@p@&lG=$BmU*`fIc}z?-L;2-*)|kPXh0u6Lbc9$1NhL zmRyoSM3X_12kYdzm>&u{stz9m<#b9m@k6oAuJ z2-cFd=6vx$L`Kjk-Gt)-h+!zxKqD5#i-)bJrhxd)4MYVvZFREVA2Fo-LN(u!~q zWrBS6ZaHqZ@@YRf5n{vu6)L?-hjXwtbb-MYz5v9!xj0w&dbR))Ha@Ar6S<~Z_DUBQ z7e`w5j@BX7Sp&n)niyzbN7fk=pme7r)i?gLFfhz(w`^UsH*GKdAKM>&AJH%KA9D{~ z*7UbR@?ODVC$?_*&+upl2N%P`#@=>(?I+8{-hBQpGwAWxZ(qgU-?yiE{%f~!0-XKB ztNi>Nd}szxTcaaD-feySy?$%2ST^UrUm6blb`c|PPxw1e>u2rFkNoFYyPv_ddHx&- z+9dP<>-P>g7KC)?57z_Vit>LAA>b3FW?1p)+e`gl5JCcB*eI++lcMq=0Rebfj|}?s-sc-x@@!|(aH;Kia;Li(@WMWCB`ZRfIBom zs}na-gc+m-cvMaBpM1V1hUS(!z8-oKXT877%nch~HZPBcbIk1HcJlRgGKcYhf|Bmo zlk{~T9s>OE=4RMGA4tD=5IB6Bn%7wf@1lm!38bqlBQK+5F|cDv0G(0bOyo98C82S`P|_1)0|};j zjp%zf!L(nd^Mf)k@A@N~bzzY!03D`*`GLJN{NQ}<&m{~`zQWRjogt_?s=WxR4NAKJ zFvL4o!{qg9M;zP}Vzw)>Owc=3chlsw6W{gSBKsPeZRYmuHZAP!)j#Ws`}lv1`|Q8! zciGbcYYWxiv=l#-!FvM{A-&yvS;fm~G<0jVphw>Pc<|n@qUHc6zOzICS$U-bnGb+dfQ7T|F<^YXzJ7e({=vw_S3A__jCSp=}N0U&tp1Pgv(<9SEP&mSfr6 z5lZ1tcaS9w;|$-CLE)RS6QqmA9h`_izP@8=QmR~lYtUYiEw+>`Af_w~P+kR%5t1yP z=>)>LXofV)ljnYzSAH0dr5t3xPZ-ouaR+n+WB3Rh$7XgP1}@>h`o*U)0$SmpBNuiR zhVtC7fHuD_IG_YVlB%8b0yehMY!K@ZlSmyEEDR@Af7B<=pSFA=)m$bIxw^RK&_v)TaNQad0&Dh5)-okf;5SYRE<6JxgmhB1l zA&4xGDa<1Y@TgYLAj6oPwJQ)dMsc>V2%_|Q|D-Hv z0R-n3@PV22tB#fN3L7B>aQ!JE7_-jno%Ms2k&!-?s(_SK6}ajgdK1bK6^H5K9K+P-Vx^>Xv{I}Oe&>`NlvTP> z#&3oOJ3ia!-nwNG#Z?`+nO@`rJ=4AIi1j#I19D(KjFKXbC149A8*H)rItPez0g=HE z?G@4#7)rn>CHVSmQi0AJ;0Q{(jkL`Fn-hyzH?oXC<*x+2L}-ldS&sdqiJXmFPleOR z9WBJ__Q$rYF=TqA%&KhBxS3aPqhy!gZ~goiS$nLwpg|4^Oib~K)kfx**n@dt_&J|= zl=OyYu{(O`uH3OPf5PcrYFKwjy}P@4e|F3iX#w+tlQi+Er?Crd{*A}E{lzs_FUm8G zU@-apy?ZbQ4OpT67uoI618#jwm{MNXsV~Cj+Nk?rBGEW|_ytS~m9iI1WuBlg=PkM8 zora$Sh8MDCS}-@zzyR}T5!M8BWTllIiDxsfc&rQG6$j3!fxvH!EUI1uWh6OGu>N3< z{3P%dKa1lbD?^AP5Rd~{0}610vvMd&Ei90-7Gj|fcbQMi?V(4y2RroQJV7Wb&F2$@ z_dRPN|Nb7Vjf!EH`O0leSUf-b|(yJsXX=@#>hNo^Mh$frvC35)}lFD^pGcZ>xbYL&iva!#t1QzOkD_Du#@h!Mv8q z>?zxbhg=Tp@W_Ln!u7@CA3nxvw>GomSdt3Vt>d!C()7m!q?{>C61@tUb%W$&N)5lh z0DL5vruKJ7JNbQg`x=0)-=hyUO(hS(O_;3rGkO%Pqv7b;sQeuA6K3W)P}WGmiUDln zxI>1<%k5JeJF=<0Q}fj|kjR#5MygD_GkeAgPG<)_d2;gCag5iKc0_>_mbFsz@pW_c zbN&=2UZA-B=}?_h!fL}f6#df`+YEAxLlXuef+5V^;{o3h9Rty<8Hiw8-&p*Db+bir zcC}SvxeAtA`?U}V-$-sKX$N)5V#Att@0{%;s-i!xGZE|(v!>q!HH$;w&j*Su$6bTc zgz>5fBc==E->7n2KhXq}krL=(ni9}oK1vodO*L&QJHiM_jZtU2pZcP7O;lZqA-m8H z`T+5#+wQQ|j^-IaeHZ!zfS8E1Fb2(!Gw0GXPi3KBSIz1VHI`r+j-m#t}`S%;#u|OdwnB zHjGk(_IT5MGr?U&`CJdRFNPIPUecD=j>X})42;-D?9XM5YVhtPV-rjBhw04~gT zZEJ*hG_1>oGE_|1B?S)pw9HMSiM7@*&yd2Me#7C=)-V7qKwadBph)4HP%=c<7DO&l z=pUgH+;DeGGGkbau(~iMYI5x%o<4m8bQsuTzB@QYRKB`?78ry zXz+%M8DJs1H^H9*dtu>JfC|Y;ZWEiXF70kx;GMTIyr3hggxU_Xk$%Pc5nd6##+&es z-h)-Ks7O;?&CzM%?*0bkUmbFDSwgiS@2WQkavRq&)|?fak~l~d^Lm~PCbwhhRvZH?UFN*Tqzfk3g>AE_gmt8T)IvjH#K{xiZX0$9;$ zb!@R+YKvRHc*WJ;s+tfdvqs>`X&&623aV~0b*bz21_)KZrt#{328#z_Fy3)?IK&|45xbMG(Z!Vh2NydiA@_81@%Oy!0CV zXsfkNpKl?9DH=@QpVxWR>RdEw0@!P4Zg71w0IScQ$5oVzr|w&5V@F>^YBWnz?)#MP zf{lfBgMME@-Ie$HQe5#8GzLmVBUG7s`l4`KZth`!WIB|cP$mr+(Dj-?q)c$D9ndE; z#$Uc*q&ga#n~wRr{MVq=@4!E@CQ4#l-?hxoRlU)_EWqnu?{r=gRqb&Y_eT zr<0Lck+G`^C07H4!93Ip94@pNxJjW_$$I@=Rc1*nkP(lCKFuP4$dIvi{p9+jsHcj7 zm`O5W=CeuO$;~8tZ3Kv82F4s8Go`{4gTS~IymL5(G&F=9ufX%$qEH)QErFn6r_BX2 zA#=+I7q{NqxnV;bi5RgDhsd>Sqce)7-3M_gBxB)DlhnUt{9VtUZ^_HeP5t8gm z4~^Fv3z~Bi^~J`tKF#{2^d)+CXKz1EFPFXRor9oB2Y2aDyT<)ag2RlP<9@q_n~RcVXcu03{o2CIg3o<)ti(^i^s5wY zKA)$(Poz6sDY{anVVEM!Q-7)~Z2rj7fc993wEI)5TgQ+Kog-GtJRBCEj3cW=6L!ia zJaZz)vag1SekEbK;9nXOtpwPc!k5E-Oev$$tb122K8leXmA}k=Pg;2-i zAz&zQc*Ujr>s|yH8=WlkgFWQ3>On3QA#ERLhKq9C5`nrDS8hLhOtmy#8e(%GZEZFL zG*A>qyhf}p-xOc}SHnoncX((l9v5v#1_*yZ7z-ZTb(A?kfp%qFK$(QaEx_IvqF!2zTi6BAplqF@0xv>0-vIfY*SD3%E zbcjb)$uNl|A}={gNraqhBZrtnqwJ27FYt&W6{}F7$La>@)9(suW#dt?&BXRw^qSjc zlnSLYW=sV$CtKXuw|n@#<<0MBPdL0@9){?%9IL)Z&vxWy_;T985}88L#FGp^jTJ=o z=lTMAxL*reN1iPE4csSydq{=9=rkD*D83!%N8n9OQp%hFl{6397 zX#14#jauZ2N!f5>6BO1aE}wNu-MGODu+_`nh2jEOw>GYtR(Ne9`^)uS4QLM!3FNr0de7>SQ;?1j1nyX zshj`;916LFR-G=7zdHMVRZ8c*zJg2u%+xQ*Eas+ZAYC$i4mys(QdOS_nW)bN-j1?1 zBcW3=*4sC8LBJ#nvfy`;Nx7nOWHPqVE{qe&Nv?7qCsj|ZvcFr{k2nD|!^F_c%WTx-o5R3k2i%*no#is2m|kMRm#)dqczCJ6`Cri|0F)p`z)g;v#gR|x&+2K1eHe?}+jYQqpd?s* zTfws0LVwc%67m-oNR+mhRkq{Wm<+RS|3$_=>L@m=fl9M@DzKG){&_mk(N{2JKQ zb&&IS5!4Ybw|+oW*GGHMy2opDk(-xdEV?N*eB$5|5Q2BeOJZr=kr$%!Yu#M^XsR_? zP7>tHfz8E~(nWRLhhxiA+LBWmk1L~Wl1Z`-mQ*L7_lXA#4%flq$`@VAc8dR{UDMNa zPMmTvtx^edx1OfxcNwm_nwM0TP`NoF?zf(O(Oc`V|mJ3qU%*euq&0vO|~{vUCji!jv?-&QIiOpd6o#n{{rB^A&Oq4@2* zWu(efxM4%+m0gWex)u|A$nM5zo3XyIJl(kx+_lTf*HNBtkM_PiE1G*nB-iIeYs9`F z86qe!PROV?1G%{EYy3|m4D-y~@}@;_esfn6@dKmx@iV0{V^;93<(P62()n&urLFRQe9j>?wp5LtF{0J^XR#OzBEABtyT`S*4oN5*)DW`^oKRHKW(g_ZWtePYV2JZYsBQoXLOG`}jR znz?HLwN=YLNWPLc~~*AF#NR2@qf zSf?LBCJwpgil#CQEFzYN==e|;l4Mnaiz^9cA{4OEc2yNF+SIT4J}~FJxioeh;x2Dr z(sW?8k4#$i`j<_{OoW&zvr>TDg3hU4Bx+FKHPMW7F_o;891`;-8ED6oWF*1LDPP>@ zRuN}1puJsiq5>MMvL$Ocja9PI$1ZLhERPBij8rui_bH^$0`-C$4PhmpU*7MZUrsG` z6uX<>q~E#PBrWYXs08TKhQ;1QKP%n&;%@&45OTuk260PAMZ%BA&PxgbV!@ zdyP-HkEU|tl}S50V_CJ#-Efg+)wSo;M)!q23{DlJ9NUW+F%4_ErE^h1#0})Lkm=TT z%HD2JQpA@$tB13Cuyu3H@|$i$8I|V0cN8{tevVmT*}a)=j4>V`_Hkw%lKV|g|cEtK`xX-kK#OL@CJzl%_)Efns$ zB3EhZP>QtYC{@0GhEqf-xpcuYC0t_8i}PJvVm|9J?qqrZHMdl`&edF{bDj}xs!-ey zP5ulC4XrR(B2_lA5HhJwANSUH0-_~HXkDZG-8eJnb-!{K3#hdsOLa>zK!%-$75r!tY%8;oGB(O^gS3QdJtf-0)=-ISOvTE?-M^X(P4O7VpJ9c`wxBceICd+66f23 z%2}f=LuC^l+u5+S=YV>veU;TDQl^r4Vbsy=UK|D=%RyTcThmMcK880J!p86Wu zemAU&ZE0L2r)71TJ5-w6}qWyBNk67l&q?J zD0t6%>P9R8p=xurbL?{t>G9rTU*x*YK|g4xdVkj%KOf+mo1@zk9&)+WyL$P@O5Z+#N=87nQxsc4faZ zX{|XoVXu@YMi&R@WgXwojH$lJ`u6HVn7R3iV*6L(Lg5d6&O*^j}6Y+W~dEimU=~!ha8X(uJDma2r=uRTOks z>@Kc2yrgpFBY)89DiwPD8A>Vzu51n)F?JuDql75^YIQzxfUR1>0Zo!I)@cE`Q*0sZDf}KK+HR8=L|MPzdQa5{io1G~S$ekhP@#TyzGT zeBKjTC#RbXw{$neiP;nLV*9uedb*4!||U89az>Qt|kLV{Nqj+SC9} zU#1KFp~Rwd;FdCN@lKZNjYms;0gY2!zbY-#^>-M z?h{8-g1kiP`A+`**sBTKhvj$MGfpjSy-c~Wgltq5tKhzzv88NsrDWjpH*eUW?{R-{ zC5HK7DIDz564UZUZre~y0Pc5z{F3(dxcG&v4%|;|I)n5|ohp?CzAX z#(TCp>O-^FJeh`S_gf9rW%l^pU*4AoV>-oHaD(Olay;6H+YAwS7NOqt~d_VTMsQEFWGxr4E8df%em ze0X!Zn-RHkckeBEY+i#xO5;>C-3z43fA#QWki(~;Laf?Xj01F6S{W{!l$|Y%VK&bG z;5wCc4t-;nOv{)hH9F}Wwk`Z>iwvyH&F;bzXPpvUO)4xQr2X|r+ie0rr%RhpPnS=| z_PCg|y{)xBmJ=Ihz$>K6$v7=I#`x3RT)46x<|U5oQw*U}V^;t2)@Z~>I)a$|7tL@} zeYDZEJumNssxxR#u#)y_iU9NSXkqlatF6e!4ljxKVmHQ}gET?d82|gEYv0wF)16e{drh%Cf>zSKD{{Hc_^d zedh{vPgG?0CNZNv6WkT$)Qy$8_g!Gu&rsvf9B8`1#@>ob!X1nDn-J2nR+mRx^n?1c z5JqWsAVh>$&vqroq?-;4R^T=)`<2>&=do7i{W~-==Q{vh#FOWW}dz^HG0H% zG3w)Ii&~!|3H*p6rXNm@+Zw5#*pc?ou=fGYT6kTOXr^0D@Tbu4tbrKnaRnw<@{^@*s9P$!jKowxri@fkw4l|s#iM|x*Yj& z=5bTHy1P=NkvQr)m!l#3b~J%D^=dG^_;5mVT;Jsu_^@CqNC5Th9_^Bdk9BtGLvxZN z|Ac5P{m6CQyA)om1A@$`0@MMf1Lygt3~sSd9kXk z0uN=DK=6;hbfGpBt-z&JIRS!r#}08pdS^rvoQkecPr6p^UQE@pOLCk;MN(&-w=mO1 zS$_ZhDCP6_(UzH@s z-d}Ac-5FsPy)-S=gbeKpuoHko8l+J3{|(TOPD-x;GXco#gL}68KaJz`w10bV z08mW>fB%15D`+HWm;Y()g8-;6{o6dGW^13#fbhNf2?Z}(c{Zp$FJ+60l$dU30cqk{ zq1J3U7y1iD4H>e7y^6B zZ~JO!(`DJpn1^pDWzlEHYKT_aPvTeRR=StJt+v-IdBCyT2jf+yHNbWxVtAr5q!nxw z!wEzK5X^H@%A6%Q-VMrJxrA#1zz)vW(Bx1D&y=$om~73g*jV4V6Tx-tKiI(Kk+qGq zFLCfDMA(Nx2{bR^KSq(WJm5&3DQJn|BH{DxXdPhVWvMl@jI1n=C%SEQzgYu=s zne|Ou9{cXuHPLUTGrc7Z~@GzsP$ITR@?7}Ld( z`i&LonVOZ%-XLwm*Ecr?0Z_UKrT)J>cG43o|9&t5+#Vq%_ke14{XKHB`?!K#g$au# z7V`c`J1zUUx8g_Zk$PF>k4Mo6K2KH0^v3|4Ey3dc#rNp`2alM=dW&;n&1}^FjfKDL zlXqa?LnUeNOkK=C46qRii}(+&`ybwy31fwkTQS$QKGVBAt*Z-`Ux2+hv$ZipF##{K zV8{OA`!N53pS=yhLv=iT`)Mz%&gnijf_RsI)_vI@WU56=A`!CV!F`G2V5S&8Ra zZp`~cjU0KEo8BI)i5ZFkJk!A;{exTm4?arIo~^#=1cN_~ZfYvzzq69(GAq+JamK|`A`UsGaaCb}g9C(yj|Pg2xd6gM`SSM zRqwsV9y#$pkt6(qU;Kwx`M>z(lxFO7sP1|%Pp|$xn(Z!@E4j#jc<3Vp!ablstbZrz zU-&m5if+Je80Me8)N2Go$fsoSd=d|bKaEI02Y@Kv@YdIWHSNHE4e$W=e$oNc0TWnJ zn4+2?9M5~!E_!^CiK>Pk=E^Fw6D8#qsNpgHp&9>Ajv(?QSsQoLK5deZ+jg$=R@w5O|h41$B+w4^DVJ^VE`MCO@d`|eo4qO8U{734) z#_qiJ8?~m{(DENXqdlr-8bhctk$JxW#=u}}4}huvhRX~v`QPF4u^}r-Z&a9iv=cLX zUft_rQthrLN^+r0OjF!0j}8$s)m{E}anf_s-36m(!bVrR0IKQ2{i_59|3oUT&Gz={l`%4|A*nlEm1rw zne#^aTaKmX#jW`X_1s4+a_R@5%n;)HU&C(r|J~5=StTtuXe9JS(|HoE2I6Nn_lbYe z!kgu$nh@#DI-Mk3m}fab3_fW z_|pK`07%Tpz`(}BLSSrT>1;t~3_w_7+znA)R7zf4RxCHb(#UyD(3?mc&kKW4a{cQQ=1u$xZYc7r86NT^^q%_}kt06<(OQJ7GvJyTkiR{00u2A3t%3R88q1O? zyvVcflYi}qx`XL)oA&FNT=y36r(v%Qb}$_c}BsQTu28+x;hNtY4-YV2caR?ikGd-)u0Pami*obM&Qg z%EY$0z8y1U{Pb8(wxX4Vfq|J(Q9@3#W=^5HVotxofxiC%ihQt@W^Hw1<8eN0x3<%e z3`_t(Q5c~NfyML)FVgc1W~JRb?$4DsF6~u;e0pKz9GJx2}{#C$_FgliGi~ z*i|hra|QGBD#iZSR{X&OSG)&C`*%JJ0rLK9K4<_@D47cWytp<3m=rz5*e&>!oA@;i zB?|yD@~HO6emBM0;`k^1`9*B06n&)6{QTb;v$r#|GZ0TV|FxeFA4^WW1ZBZk0>G z1=oG*r<*$|3Ey*(I>%OnFLI>gfYCQ2_lnjWHdJG7)7s<-A-F{vU}6F5}s1 z6n&B~*ywAp`roy3O^P~`b_>X?+6b<)-<)$TaMf{0zyr@9)5weG8I zv6Q7Qe=Sh^8mXZ!w2rNlbQ}|~o{(-7-eV4#M5mSaYbYV)Jc8}~h#T^q^^qz&(=qfL zK!I6SqaY8Hg0d`RNekxGk{z6NynY=XY}|SBd>ynh(6-U-H>G5W_T>wXd?zWNUf(nLn+*ynUBFgM^<;m=y9Ys&9+*OSY zx%hmiWuP!OBRP1XZQ_tv0P3j72mqxpN{E1=b)$9zZweIMNtH*bd!W$O@L@2GQ1_() zDxpd@5Ps@0m?)%8Odv3$vkJ3vRt`P*#Kk}ERk9J3-1+!I02q>|hQ$=}W`dpRX_J^v zozhk3( zldG(Fpo$-dOc@y9GOZb-;)n6i#o zs9si$uG><{xF%0OZ*!AVI^qwFAgFpzLUefv+0--Tbv5GkrY_0 zED>(Lu-mipg>na$1{uF^R;zw7#}GBgB!c4VrrbYiGm*1i3ee;d26p=ajx2TtuKl5h znoS4L-3A_Uz*S?oybi#>2l?htb*+~wey^vV$C10G*jHV9dtX7bd~tEs7!|_qbLq#@ zlugM+H$O5S4N7(V8Td*9QbgkVHY*PJou|Hh9g`W7zTOu2$I0q9FnkJT+lueKGT83; z6`VUR9nJ2a(bZ;W+IKMPG0=w`J4%lb(JpZNS)znyY2vti(DY_7EBLA1yAPCxDTj$9 z4ZuF&Qo4-cT2F4=W^_t;>oMnII7`eGjk=?9G*^c~mBgeHS z88~F`Pm6P#!yu-{LgT;sen*AZL-PS??;d8Fep^^CI;G_c+<7njt{97XDAqJHqiOUI zhT3i#L8eKY`83ZBlK%NBP5AijmM}Yg)CJ;nbHn5Xuln&KUq(E7<(Swi1Z44-HUe(q zcdfqf0G=(YO*r&D<#XYkumLuI-&TxmcKMM*;}Sk!=^qiNf#f8A!&w?F1xqz^Cxz6f zn4NF-kyjr8RY0o0pEkJ^zhz#y%Z}TiYV!u=T~ zpQUd}oNkAGS#mNUKT6%`I9pMh*=Rlf$2B4ktme9?D_i3+U?3n0K0*BfA<|kKyA&+A zve&%)`}wYEvNtdZ10aL(-|}F}?%z`NpRViX0Z|@ovb`$bKNCr7$|<=tSstDBg3|wb zY6C=~M580o)HVOx6> zSDU{_uq}YBs-|n)^2@j86t?Evbxq6=l2l?nX(?diBVZNaODU?`A#|YpUk^nBEmp{mMNJMvaLQwK+I)kLh2d_-Yf`EJ|#gHv`Cd9IVY~TY<_%yJM zkO1~D|KtVvF6rk%+h)fA1^zxDK?(;FUp1=n2rvi`1^UGGr;ME{iW3q} zq$YW^X(LcqF^kF0bW9pQc((;U3Rf~SC=P;ix9GLl1yKE6R)dSvEQA52H2ln_MxSN? z#Eqcpf0xh>$p2OHvbHSo@=sRnz32`s;!`EtHl4%V{j22tZiOej1gV(@{c9it(D>Kj z354w53xLkt(#6u;&fdusU@y)_hjLe+9E%go1|J`&=bccHZlh0ktcoHaFk zCecfc{wt$Lo!9XBc7ZhhyVU+KuPA5DzVEp>XVix)D50~V=WUL^0s`#+g8l0{fcZbhCp#XN#BBPL)&aHJ z5$=d)sn0S0?dU{(01j~00oVH%Huw+tYUWpN(!C6|THWR4j(TlDE}n{)?Z4pd4A`w* zpg`FFfk&6j#a=|wYqHBxC(qfK_dE-y0xyHcs$=j0o=o6w_kd{sn+yg1?3}8I0g3_mh=il=_&dCbF&U|UZp$KOBxB&8;bEQJVAW<@R3rBG zL7*?t4^zs_j|D4UQ|32;x=du&iY6NdlT^B3=;%ys-g~uD07s2U?EmI=K>FXk4%mq$ zqA$TD0iJ00+%KKb|Di0+PD)whG`#m5HU+r3giAdIs%b>~n*|Dhm7fj3TEGMuY!g!> zOG7(=!gyWGxm&C}II)i3+Bp^9f)hejiDqPpZA6;Hh{w$b zGWmo^lW#9I3>iiD`l58m^Bhbx30-{ap=!DerS8oGInkt{916@4vU0mYY-kJkF&oHE z0cA!-|B1JvNY@}l;R%wTB4dQ0gyJ^Gp^?0CqD=J&L$rvxzyvP|;y8LDl_l^ou&tGG zx?e)$P(_Rp)uA+yfZj^=Q?}<``h=gftfhm`9M6<=ui!j7w*nh(G~CxbOjjc01iQxy zDTG-pmll?&m{ojKO=0FxJC3th4T3q%84-epVD4s5b4-Oc#)}03%T|U~ctME~N7uL1 z36S5>#KPD13E@>X&H_fd;5{jklExVBR`KwR=ZOY-SSlhQ+2fpuKGMG z-&&mrB0fCdP0N25`t;uSQS;#=rpw0jws|ABz$B@0Q}W}(YrDnGt$hA7(gxSTq}5FC#1@>n)lZcukGrV?khMN^sdRD85qg|4`8l+ggw`BLPW~ihETo69BVr0`}E*IWNkMsp3~PO zX$#xLS+*0XR>BPbXL>ntLHs(s&;(^=t7QzHc2fQ4i z%Ccl$2`NlOt1YJam}Gv)itgvy$e4~1T@D-E*W49Z3KWNmi5v@bv@|KUVO5tr!H_m; zDPF}fk_lB2CnDZ`+ofIyVBl$eAOqDva&mP1pqh*F*;l8fo^yGx^4*z&ySJO&iMPW8 zia#Jdzxiu}zCm9#zc~3IgL=GnN1lMz*~AVe`YbRIS`oK3oAYA@7Zzv98q*wYryj5o z9T#Jl1|!_FF9Z9Ah1VL6+GBP7QILzNVTtf8M|8EStAux(~y5L zWmQ%sj+i*doYEh(m6@(8Q2@7baM4H9EHp9cI41;*+l}2GlYxJ%08JUQ%;OKQtXVF$ z4wHCrE|uJLG*ddqFoQATQ~Sp0AC6azp?Nar?tLv*M;(v3p)re*#oC6Q3hxNcCAgbO zxVXliQkFlufsNK*{wXMy$P@Up!YED)WbjVjkltJqTdXiM{3zP;& z+!x%J0uj0tgfgJr3i_8Su?@zU*S2bh{j0Xrk*$Lonbor3Bg}$o-TBb-I`x;8(Bqr; z6szQcHFhQ@e=re3jePh95IdcTB3`Q;<<+5b1DKBG1r=rhWKi}l@HQHco>_{HKKn1*5g^TMU_sEG&5|kbgKnT70 zpg!Ie>??}^XS7hf=o8W&(zt7vB^#Tax^8H!r``8=Px@5=epi=}>-ll)E6lVKhNHZS zv9CqTvPJEW zz%d`_+Gv(4dL4}mg~tnRK+iKPhrIl}j8r+sZmyWtBmpBja0DPcS(<~J3ryI0(-T)- z479tFd!=9{6<~?+-Gyh{u60ZurWDVm`>X@_+I7@A3aJ`aX~C_w8{BsTZ=er*#p&p= z@vR1r(Oq@{T6I|s)hVS``;aFApMyJ)ATnMwq11@NH4eBN$fMG66kxER5T?D)&RwA$ zV9_Jk2!Bj%K4-e&>}zxu%#bTTuu(~y)||fAJ8sp1$ggn~^JqFvrCG2Rw%-e$KAJPd zM1iDd_QUimkpJ=oJh4;Yz$e|B;i?g?A5P-Z2EuoALk}(=JbIA zR4*XF)T?^rgeJ?zuQMQo&Ah71fP()*DUy<=CUm60zbaA+3TQcxl(iA2LE>)6rTcox z9UQZ302&YUxHKQmb2n?h`P{VNN1B%(Ud`OxI^BrJclw=SSbLtkag^LulBTe(nP!yG`M3BxlmUe114WyVBdih4mRGMwHqq z!z7$|vh#=Vt46#CCoG&;I&x5Gv9kv4J@n5k`8j{ykDMupfLh%v1=e!atAs zt}<54afJ2s!Za1X&qO&cBr#H%Gh7`ILdKI~Yyn!e5^8gL^z2OBsy))Z8qidPUyl*NoL`#kmFEXO$E&N|l;m_eSR% zqF#0>L1>x8EQjEMn9E9NM=8_~x279H);}oQuln4KuIODQs`7G(Dcu)F=g{W-B{yQI zleHD6x_#AiqvM^lGY`KIVoAsok~Q4#6oov(ONcqc@x4cZC)y7?sB^Hp_b2SVmb->Z z&DyWW0afHcA;Q`~f z|4M&5WE-gZ1^U|$AV_A*?HOROghx)t=u?1kFzbQ|HrdM9(&Uduv~&~`G+BDxCMbZf z8|2d&aIoFKsBC9p;$$Fm#hM^H#jK#HuxM+Ch-mYKGCxblL_aeLabS+%FR`J7^s#e&Hxy)C3)g2-D%>7-yNbLmr4q`kvFbLvsJR z_NDP%nXnY%=anD{M-?{@i3WQFEG!u#>h|peSYVpC1sT; z!1ouUl8Qv=06IsYrW^kjw$#(3V=`1N|NU@-Iweh^uw2@p#yn24x}pSpE=C0nA_>=J z6y}vyEP_1aGiAR5ea6w4G zp>K?(B^v;updkFlWUiu`@4m_8IGjip(DpdS6HSf)EcfO|*WZVb{OcwN!1u44`Ty-! z!A=br`CH^F_%WR2w}fp82tlhzSR&aT3YP55R{j{c4_q)aynpgJ=tOGJaxyj`BMQAb zm#x9qNx9*Oben=cA@E?Rd+4gR`ZIlzU1qO24e#y+mP3Uc37bE1U zBRNu9EwOfiVAz`=MYqo0oZ3FKA63Z7^!>@}#n%#9o8Q*3*ia)2Bh`H<+$o1SlbNM-Sp;HnKopAzId7R&W z)_7MzZNm%S3A~9pXgd02(@pALZkTr2`fe?}@Re=ki_4KGuo$!{(x`j{pJpm*-WL(8 zZy1}v-$u7T{_`-_>+07HU_#`=;kwm#*uGd#s}2H$Hq7RDi=##XhRV!WZGfLT9T^Zmx~h|`UFwQ<|mz>gr1<4>5qK&sTM zQL)1UO(P743@1IMEqn)^$*n8#o!bXO1DY?=Z4uBiFTnv7Kp>zEWOob^CDqG9(p&T# zrKO(Ql0CdTuhq3>wF!9ZnM85&ypL+>8(ZRw3<|WF5Fwwx2}3A+@J3(}h>l zN`Kk#bEM;T_EsF(4dkJt+Xu|!jleCg;QDIKoAG0(?vm&sSiC~MhY{VuC#sO}B02V@ zY9@`Ql3s>)<+F)lIm(G^>XJqj>t`A!!aeB5u!^9-5LdNrirCM91p#bHAWH(+ya1L2 zu;qXKFeZ4dX!v;;VS3=l85+C3Df*@-;`YYc0}bZ$$nh?6k~0-%iEhXf5>WJ0lC!E2 z@-&kS6OuDiQuGtGi_1&GO^+?AsR^nHdOu{P!A1JBC`)Isyp=OLJ_!wA7=RUO9Rl`` zoBJ5+VEPLadqPP7++h%qzmm8K>wk8-|NRCm=q~WLb2YqZED9t=;3$33M`1rd}S;N`3re+4(f;e zJ046nBTO5K>|R=8Hx`k|S(LVk(9%5nC|?7~)M@o=HVC`C3MrqU}CMG3SDQ0NK6eMV9$7WIO;};F#m* za3j2iiU#9CQPS!9xju(o5&QSn>tbo=>10D^0pK`58CsJ5A%d9m5!E<^!_z&TLzeg< zoD+`Aa1B_K>F<%VG13%oDU>SFRuO%FLxVp2%HXK}Gw$t}yLn!T{J{nQ@GA$J;26yB z-(>%1hUW>dY7M!F1|FJ!$7V6Ps3;u)|H^;;AES_jxwe5qoIZ2!4%2NSZ&_KJO#<>< zTLUBV_ql&oY$aK6;m>&@{LlSKt#29z?Y9*z`$J~dlo+xp|+kO0*GzmBr! z?*{IhFef#@fD%^goVVZGsSx7E*GpFk{kyKP1ho@EXnB}5gN#^`+}pd+j^pC;J6b@l zJLiYroT(4pocfG6Ow99BL2Ex93O0&vRn12V2914Qf;?zYl?Eq41asDED*cGb-vo2Q zQV@b@dxjw`n8~{wnHIp$P6t|#r>B8jO9al`W04zYnm8%%TlG~N*yv)B?pOi~z<8x! zx<;n7L+c)N>No|}H)L*l%HxE?r_PRF1ZLrj^io{C^BdP?Dm*#mG-5kGPOf`B&X)UKW7iSiY4du2qwVypEpuY z37$deH9;-a|LhHtW_qTIae8t@=sC#w$rv{WXNRZzMF46^%2_OoT2lRLgkjOhMMC(M z)R-hJj-h4gY-nRJB!w}P`$?ZgQYiHeNW#Ft|J66${DO0Gb-8mr%KA)Hw7Ulu^9Fd?=(vfRS47iHbYUU5#@?-0ksXbmO z$&Mp`ShIsAyEadjUwAzC0%Lo|-W}rqzPrbK|HA+LVE_DZ|NQv5z2VObtj*{5kMq~x z-KotNq`JM)zuS=h{NR6mv44HJd42iW+wlju^~xgI<>|=TdM<7^+%o=R?E)n1ZPg@SWq96gy z>t4ab)z}8yD)%?yXPvuSi~Hu=9cCp^zx=h?n1|RoTXC$xYR8tDXgEt!cF3)ic(Ngs zV8O4luDeU*QMx|G51Sut3CEl4;DO-j_+Rt2@LVHT56-vmhcK6dp9@`$(|z9?16|Ax z@6VTyhn=w0t=`+$F7eOZ)&tMLKfeC$D{p9*0b4%n_$3Ql>xT!ZDkAWF1B>rqzIHa( zdDmC|tuJMZFutjKUd48;`~d(TwF-vr%jZu! zKd#@lFCWiqZ+&BT`daxH*c8Ry+hMHR7dbhs%f0IQf!_sbaSxjI9GAx{Tk77qyjmJ* z%K%e+7ID2hdfh36@-uSVIaj!v0j9qmz8ZrU;$TmAUppJ!JyyS3x?U=M!w5Bys6>j{ zf~6+u8_yt4=FFClDz+T$Q&_A<$j!yQ!*!#e1Y51j&268)4m*oU6mnWexYE*sZWl|U zJ-KjtnM#rknS`$Z$uE~{8hyyfi(j_ZMY+t3xWX%LT^spj9xmR+K6E?2Y8HAW@eBK~ zG9-zPe6Jv-att@OroRan&T0ZG>lk- z;}k~LMCrw!ky_;|6P+jjbPH#SVBn(YF zw9%1{;KL%kKm~yTig}Q%%@5fl<6Z46>aDRO>NU$JL;M?=2?tE@)?=CFjS+_6Et#wx zDFtkZ<@TT$t=)r>-`U_00Nyi)f6inO!%rUhg1q1_%+Kq$fUt+?sRS|v7#kbL61p(W zp97MK&US%-uLM2BS%R!h1HP;fgPLSLoJo?2g$|0*?2ZkacSiU=um(f*j8cnH1b7Tp z5kNdmIhJz_eb7R_qsGCF0mMa`u`XMTeh~^1E&Td(2vqB|IDXmiYzG0hiO;QQp)f)_ zGx|J!_`a>!&JqJR=C+HzK+U9Z*cPC#dW5Eci>aG-Pkg^9bI$iDncWe{y~?rI4Hs7V zdmIg>`?t_IApX>d3?Nx>mZ?vzaJ*@;E|<+9OeZS5-1yqRdfUDyaA$SF?&Q+e8{Id_ zJ6Vzm&qaS$5XctYuD6zu;AZkm?}y9s=?O%IBDEJ8waAKEW{;mNA4(uz*h;N$uk(g%>KL(zoTAQiNP-zH zhJ}+uFLdA{qO5b$8nNL(A+6bm$ zgE6NWZlCcuS;B)uRm#AAq>HH~kvZp-4#eCny-wKV*LkCj3IHJ1BZCWo7I2t&wBaH|zSwEu z>X3keLY}4R&wfoj%jLejQE+h!3aofPp!T|{$1vT&4g|NX;x+EXHvqr>cZxQMP?Jsy z!22}{J?BSQ(w(8C)Nqh_qTA6`^gwtFa%`xtnm5}3)VT$o>f8K#4ZLr>+L?ko`}A_L zS#pb*Xm6`Kb(Urc`csq=*2|?~%&gN<=u8hLDRs3$BoaANWk=I1CC#kQ_C2#Nq@?94 zz+HYBj8rg;pPXG{nin{q7@+Va-hGT_tQ>%(p=UK)`=47A|C>7RMCQT3|LkP>-LwF857eUx!sOE8|A(SHPT;OIUf(wF!ofAeKOiGX`Ap1DT=L!n{*aRF?2^Vm260=6Z-1%1T1O_WYQc3;hgjt zMG3v!L`mz(_UpUyYD?++_vsbK=y$bLQdlJGGK}++#?T?myciGS|3nX1&cU zU%JpQW;rv3{jSyX@52)Ef@J%?PiF)*X-;!lw@{D(h!m>g$rF66&6gx;1r!FKX;tn1 zLz7PlXaTFxR2i-}5L1=SjES z6$O<4%rc*dyyPhO5M|0%2Q>Fs$Ydur0mqAq*H1y1Yz)cJKkpQ2_=FY3pes?6PzGBl zzHKysgc2?aQDvCl=rKr~CyjRmX7zwa)x zUXiEKOh;k#kd_>O_QDi8ww{}3=EIgY?aj`EO&W~NFCS=GSuwN;pjew*TQ*#bTZ%a~ zp86P4{O&^k$RduQyl6h^ltfzT%W$sx@GhU@!rs=P9FUSOd~68)tR^G^eMtH57#MOP z6O4?WKR7aLwGBZ>Y5cNcYqI;pGvou?z@0G|R8%yr}bHboC zHnJr+LbmaTw`kv2Wt{bKIFeI1CF(kQPSZ5m@?>L+acmP|YqZmga)GcpO!dHbtj_o_ z+-7@$i79+_kfDUd$`(z|_wK4LH=4gMCpM#VC6N$c`hVL~s%y@gg8{ z0wOt{5gbPdo;8FXNrWB_ef}za{!D$|Xnnqq1%rmczYahPfk6Wwfb)=n1A&2<=y-_{ zTuBJ75do-w{qwkarKRWyL;2TBW0gwTf7|5d98Ljd*wVm z?0L-CH@n_&ySA=&c876J+Z^u8H*O@67#oJ0RIG*#_#F3oX}IIKj1(V+G1px$9}?4O z+0(^gsRa0XL@sFAHbLAbBFEHGA+|5X_+vmgk>r&z$RtVp+sT@45Cq-ss4uZN`Nn?3 zBHo4YoC`38undRm*-S(*BI#iX3>)_nnqp|+8Hx!=8&5Md@qxq+?FP?lfbfaY1_X#z zgZ7R%uCtCb)pM9IV28zpDTnvnL9GAc07?X27auc(8vetHB??nqthoA%E5-oRWQ2Ig zoyr$N4*(eUvw!y;gEyuSehu0X#p3-vfDf)%K{W-@ALI`UIE3(oauCF+g@ola0$_|7 z3!=erNfCmajnVw8EHdXUorwc=n4o4nq*e|VA1WFBq0coVdQYZLpp?q ztJr}Mgq%YZfz~m1=}M~o zEnsGbL9&eAMmtYMnTxP=Y*ibtH^bYSbbOH*)*OQK-F~Ry_CQ{Edq2;F)U8^GKLVLk zU-az1R{@+;@~#8gC=+NI!mc*YlOSGS+CKw~z%D=%t&KO9kycxLX`zWWRvU;La%rPZ zH`b9rc)Ya*2~>gdwrJIexmWKA?vWBwr>Wtu6eXal z|AuOVm^CG&X46GS`eg(g(I*`(V3pJfA_6Cm@tl{NtH8WE2gx+J05@N$dAtYd?67p6 zEiFrhdIW4j*eh*MB*8k%M60f<@`tir7C@3^44A(q#v>6~#Oo*(MiK1XQ80&Vev@;y zMAA)gn#{{t!`U%zj?H;!!TcgzM;pwkzQE zR0kvJF)OR8)9GkQrtx`X#}I@fY8CHgvNm@F{Y3LdgN_$sA4IZKkQjCqPu>4r~f*=B0O`oukPZ4z3+ET~L z?dp`ND}b@k7845$lSKlN^Fatc+4F6Xbrm`WmZ2+)w!z3lYO2*thyZ*0)MZ0j@P=hM z&5Dr}vVCULGC5^~BFO>KEeN5g{Zz=P^HexY`)8VE&pK{sO4Ib4er@oZeDB?c4A70f z--H|Kkn2%LpT~}0@n~w_zkVHyGg`GOp>nY|%JNJdpRJ{y##9=bSVhN3?u(K9PIJL3 zT7yiggq{pQ?N@44@hA`VSn}(7c}95q-sJcBfHGgsAf^}j{M>lnGZgMwvi15RdihC$ z>=uUveK;cue5CKAM+>UY0MqlUJWnaNMYQ*Cj4h@sG}DFN~j8UPK`kCx5sw=z{GQ^zE7k?w)NJg4uO z7Fsw9iO~hwtH?-k+zS@Uj>ZHMoUByEu^cbokEnuO`W=H! zYGa&o`mJ}NaXg|qT#A-+gwQ$^O)=)nJOWTxEg*TGsnv8ao1<#0gI%BXFx5}uq(|GX zGK#r6^1&70EmAGaHLTZ3(jFAaj8LQZ>9T$U7pI@UYtAvwu|aHFMacg&naTB(ziqM1{)=O8mq>V;3k1fO>{@kHFEAzk zli)KhoOM^efKwn35~ClBKo0Brrv4_PK5b3J`obV!HX+!1_VfMCc~+#=Pw)pTi;v-F zg7)=`Sz|{Jd{P(W^JPgL08n2J)oNpx`IG-l(A)fD2hT@7bdW%+al6U&N&9N52Trcz z>fmOs-}C|KtwRvufzfqdprzChJ9}>q_SqQ_db_B!E5uYZkCXvv`#xT@z|Shd+vWX_ z_6GO)W$qrzBf!oWv=`Ti{K@T^?Fk5Hc;C%qW{J}bQ^$VnA;HWSO|Hk?&c_~i&h3DE zN3*?Nj}SioWFYUr%{QOd&W^aegM_EceWfhYDYVSU4pL4;zQOnzr5`Wv&>&v2_T0^Ggr!nbBDSd6v_pGKNfexr@Pgb|YI2 zjbFfx#~3{MZu!=_HP~I2K%M$M+2{4mym;PlKg#9!4Uu{X+3Hdf2n@VTT~(O`0`99_ zajD7Wa(D1mJ#|*tqtt_j@&SDZE04-LuTN+m2bu4tD4xu&NO(!2c+N1=DE0!muZU$i zImzB5NH?xKB+qAu^k$wz7Or6Gw7uxv5(;47oAeEb`cUef2@X{JI}y_uMJn&W;*A0E zmC@3|$ksX|+S?tXmsJnfX#)FWlXkGFxGgg2oOq6yHo9jJrHl}{2;b|>j^2GrPuFI( z;zj(t2LbH+?AI}^RXDjhE~PpN)SrVc;!FTP^tNC1I6a9El2HKxVe;gH$sm&(jl!Jx z-BCR6Ye^4ly#-}pp9BO>P$8#2(M7@%S}MvQAPZ%m-P+t6++pw(xjcO-aUwB2yDnlu zeEoMG*zO>&;JnEZ)FgqT`hCtWIU#tv+~+>8xV)Fkvm6q2$o3@Rj3zTAs!16B7XyO|7fIpV{0(alj^qp3@w%3K_E3u=L+sW;LV}dlgv9*jy#f< z1OdyxGHiPdtpR;5qe10MYI@U<8lvZ*g080aTqjl34Tv}vD(ZX;v!p+%I7~fyB6m&% z*4OYNBQ(KzC&Pqqs2C-@VM$L7y$~5hT`!F%vCT4Nrp)c`?~FN%`#T5ODW!jx3l^5L zl07bkrWa|wH9)*(F!9=LWi)%1F!gkvr4?BKGZ-ZmZC8KinuP?kIKI2JR8EQRU6>Oc zb6yO-d+DhVNoLp8vIkD7?tO@|$l>2MFz4Ad!QrHySr-=x@iAja2LEMIV4NIbJa_9+ zdniCMd4?n6&xPDwlKVf}69%TKQB;r}&11VsW(njO{iwq(rtv`{1U8%q#O5N-GR){x z{N`8uJ=e0yfjX9~ph6BGy_Z7Yl;YPz8dUxp)qQ1=^3U~bBt19Ff4&m4iu1?>72hkD zlxWjzs#iUFyq(qqkCE3jT2nC0cK*oOSHwq#vPD4AFPP4?CIbfhyTec?X+S z08CeA6Fk=b(6Ium(ZOq%(m(k$BG8CiR#Vw9ammn2gg(V6Yv3eVilY=MIi++QPXE$~ zLr`bYM9EnD{q1V+16uuZX*Ya@;q=WWl|mAD3hRR!k!7}p3 zMF!ZXuMGTU1<`XO%+H4<0EhE>8y$FfMIKN_0q4^&K*!{&k`y0WRie~Ze;Bb|PC)Q9aR9q(8AB$!52%K*TcSc_RF zVyY=8W%4H|y1{1vX^6^WYBdk&er%vSrFMBt$*2BWeSy87qzLKnkq;GW`%ifNim^DdYg}$$`~>^6#--RrK4aq zR;?h0Tdkl(OUpfNv>eRrlD_3@sSye20>9)7s{1l-Tf{8BNrlJki`2Qa!Zy(GzRZ@W z8`}J5CM{veTn$&g(X&v8k~P{hP=z^lriBNE9C?C|VV=Z3Nh(i`fypjkfj)cPLGM0w zOMQ=asE^o$De(%Jc!~yYY$1x+I}vrefs}<>fa^Bs5jB66Pl9XAB_JcO7B^rMG>23g zIXGwJQD@A)o+x_Jc0J>jEy9 zbQxz@Ky1Ogi}qe*32e_K8nUPg(D=A*G0EzYKZ`ntZET1AV!65=+(tWA1zrO%e#O{( zI5xwbs}oPV;m?FIH`$BV@8h#?D%aW(FD!RYo8Ae%c+a>q$d&7-)ihCEJZ=Qj+L0Qc z^ZQldy}66K;*|sO+L56yJZf!9efFj&nW6FmR$VR4#y6CvGH%C`uw6F_i=h->sI0cl z!UELv50sP!7{+&BC@IQHVZmXA7fOn5+RJ`M3pnyd>&L`pGrMKu&R*Z}O}9Gq)AZVp z%dOUg(Py*wxajpqI=7u5s!^>P%Lxb)UBnpA=Zspd(+_?Nj^gPdBwt-+OH6AH7vaVBUwfKM4AbJ=%M^zfiE>EY zqHyMj1Jo#JZo{UuPnW0=yCRFKZKCJ|C%T(^<~{wb*wrJWK^prarWkIRs4H#ai@b6t z=eE-lw@S3*PAd9WsV?aqwLxg-F6&s?Zoa@6j)w2cbqv1UX0@=RF%pcv;sqFjfhLwD z8lM^69;)3SQX-k%t7r-^tW`KaAxj3pYe;|!`HSqcl&D_Dki7HSQV74-u$Qc=A6jem z@jI>a?Iq&@?gx%B+PW+XfAl}KE@HD}InKh6Z!fCXleem~AdI{gKQeaPe7Uxhg0t@* zw1n8td7J5Lp45M zHD%8ZM}i}ZaQ_$-7UqXB2nZR)CR?Q_#3u7B+c+n0L6zCJWec2R64LIFbByc}!YAyM zdA6RZDqIC5kuGf5S7*x0J`e#7%&hx+vgBz{hlvg!S7zb(C>=O3xe6*+KJ2St>vb46n=U zojjz=EsPiq;*|2JmsNI{v<-ldh(-P+K$lBO&qn;LYv?{JUi z*X4=jz1rZLoG8b3cu+&*z!TdIw)5@#^K2r zDR5;X;G0gR{ZurIK&pWxsAPcT*>#M1nDz~7PK$^8L0W%0!|k2hdJ^Ry31)>D$5a@I z(G4@kfnCxXP$lox0YoJSJYTXx)*()hougDM-?P;Nr|9lnXMLFnWNGkNkI)H zP?(;dWiKTde|sB9Z1#b?<0_CPoNAnH7r!Qu+7tG@oh)LNVgydk{jzP$>ruQk81X--~_ zJBca{!JJYONi0gN@*M9=h1JGNFBsFX8eoE%4BdO7m447LR_iXt6de$=CzpqBzpvoMZG?EPGBTGR z9T-ueds1KBgaV}Jv9tmO7>kDbv)RKXm5&Y*933esp;nxRTkf*Rv)`kmF5e$hFz!Lf zd+%ZIU4{MV$7O_?cutVGgd*70swjPxaymgXUgp;*SJR-{fyy6l53Lbp9zz!V4U|U6 z&oe_Qh0gV3SdN;>m*sV!xV5aOua|-AQ@mV`Q8;L}=2yUt#ZjPJpJ(Y)`FlA?nu=t2 zI$W!{1nXF@3vgaJyGDdu)wY_3B?UKxgEtHh4`z9LbqE&CWd1$F5KhHbK$7!B6M!yy zfpB`ghHAkqa(1;0Fj^L%KhVE#bD-|J<{}Eo3s}eDuu{TthPV7!Tr+Ifq$%MbP|b_- zF{(o%{iIs5vg(psmK4g#m(yf6y-r)P@XpuvtUOdUvuH*#(t87KT?QX*p{gEjz`F&z zB48QoaBvQ+%2>?3UX>xH75xZ%N$ZU3m0JR0FN1u>@KjDI(h1D4MyFZi=k&lR?X4=BETFOr!Hg5I&?TJrq$0xElf2x zR-8rh*ux#9xFeKMwP4eUwIc+r;84?JY*r)*hrf^(YE0EcS|_rB0i_K_Uwe;3#1B&m zF&kPsMN>=&Gd@C9#@2LtC&hY_HmnZJ>>^ljsdH-aJ!+V#YXmTd+~y*F~NR~ww}+-Me}#d;Z1oAO?giS@RvI;!4G)h4v|0ks!})oPn>?dKX_ z0Z|`ylUb_{Ky91)LuGaubO>ciNvB(rP~n&O0B;~mA6}Et=(FdNYIDcCjM{AAoLav= z?9Hu#N^SYO&BZPVxCgM)gzrukSnCAmT zrh$MaikeKS1z@5z1)CV+6G3|SAD7>vhx?RL>d0S65yi=$hz)@T4Lmd&Ol?3y>IgDu zeGSFbPC9sLMvj&uv%=|UL{Tt(he29(CQhIxg#;NiL8jvDfNeB1L;DT43&`6U6{=>f z5USYYO0wCP%%gr+ho~V)uO`CC3$Y$bLKF)FGFTb0UZclQ5}VJ!KzLIcC1#W zh3}VHv;MBM2QBNUlUjpJH%@IR%$uM(670;UO$U7;N4Uc^sB8Fg-@{&n_OX|t0U!C3 zb%rgvAc;z?kghM8b{6wPK_tj$Y zw!hMA1>ILh#_v)SA}YC@KOnzDI3B1p5FPhZ9V`dIMK4!+&3ZRcWWerd$HM-#eg+(g zk&8OOWRjr&s(S+U5m`2qRA=RwHKsN~cpk(nkf5=v{vgt1>RA9(kYv%i%W;$`H9EQ^ z2Eof&G95Dzved;e(&T9LuqcBDh_tSq3;k#@OKOZ{F~X>=XwRSGro%>*{`s*e)44%E zU>LiuVN@Du2%OX#uPR+E_PxhSTG*B??S+g4b<^E-d%@JxxAGnY28j z>(YTr3>~>fMR%rbHPQUs>fZ_9BZtbNizBIznsVD2R`i*m&vlJH`>KhgY)bl_dR)Ff zlN{Oe%G0Q~6%p3}ZDrF`7S{?CqmD2C{ttxeEDj~Oi~nm2JFd!zAzwuV-@O_bIQT2G zcIuKj57md6uB>P&-TD2&;f$=l)`>ID_*zy1dC!WQ~ffHgtS_-pz(K3SUy zy;@2pLNL`Tqk!PFj+)}(>_{=6YzZ;{*^Zh-57iLI2{rznx**mlo-Y5K;fmbkQ!AA= zSwqEWYPN*@%Dqa7^8S~5t_(FscrPX-js$E0BevikR|A(x1j211{*+!Rb z+qP}nwr$(CZQHhOdoSDOUf(|FyyO14Kj%#6m`$2KN!p|}5F^%9pN5qT&^VdNzkQa=0Zjf`>0mL zZaSk&TQ2YUau|a%Y>A+vP32Bql5c0=%YmW02N(lBTJXt1#zXp7_GBKq0I%2 zrQ5{x$-;MnbaC{~bO0AKP$FkNoHRMA4Td^sf=I(1S2qb_M2(It4kCyZLNSzQD6ko& z$*5WcI#U{EWQ?K+FUs_SS_?Z;FCg=J`hF2 zzNwb|9W8sZmh~+y+vx1=j2TEt-{FTaE)=&*u_A$%NdskoN#|NS9dU=#|)ZeIjTTMLHIgCYqW7RDI&A@NY1Y;sXCW{m>dT zlCp~Tlb)xX3K!$64@3{gMIjM`tAd)1u1cUSrG%TBqpOf10cj;?wKOEn2rqf|S{Ve1 z{=Zeh#lG-ZP+1b}6 z*KS<7WB?vZK`&(W41}yoa7Q$}Ob-qm-f`!Unw0ZqE4YhDC_*Moxc%3>x<0NqUp>CO za>YyaM=f_5DRYQMK%VmDjZ=L$*0U{f^FKWdyh_Qto*{Xd%Dj?DKrQD-ad zuYUlv=RetR*uls5-2;jlep=SFzA&!=Py#_(^L)scd49-)m zOh$vvWDQha!qmX7a}?|-YO_RwpI%cp(W4+*f1^1ikz~LMDq)}^ z%B7=|s~M`%kAibuGbU2RJ>R^XGaAl1Ms0T!lnbvbWm|^$mxQsNyXieVxmyo4Q%g&V@tzoUhNUcHB^UH&t77p znnSy4VQM@!N?p%9UxjCAjxa!5tu7`JkhpPsh422;K0gO97v~OZsbTOuv?UNFIjN2i zEl8nBCYyoSEwcod?CM^*Fqh=2PT2q$(p+f_uX$3(TMBfHB3m3o_rygMsU)fHYK01+ zT$P%*^ID9tg;M7JD@tPM;y?60{* zv?3$9cm(FPY2l;@X{i&lcX3uGS;#i^xOtD9N%_*e2qH(O=%YV$SD64K-wZRK%HxV+ zZ32tqIrc6wxf%|~liX4B3Ytq3%sg`#7#Ti*q?2JS2uqBUvOY>pmSc|~8lR0lKNHh| zEwX6bKE}*k+!v;((Xa=kBjWRifhM+CF@P(+=K!!(>?-!)0OARIOdBgc1t*D~XTL&54sRcHFw2-JrnL!VlPXBRKuG7z5@notq8XcsjMGdlBk3{YDMQ9-1~sGUFe4#`kI_uU zjxEQ8s1X_cb74c5X~I;i4k`j!h!e+1F=C?`2nOk+n+yns)965(@sa2%102fm3#>^(%_ zszLggBrP2qS6tADrvk}@Bq}eQbeO@bus&xp&yWJBXELD(g0?s*CKT^*IQNh+5N|!$ zx@b)!|5-&x05HkTHB6lZKO+(nc@$Q(-f?hYViwWGqs1H_0TwD{6hXYfNx5BoAY;@9IVtK;Ypwy@~mhL6h#wf zPB&4212`E-Xl8TU02Y`zMQX!F92NXR4Bz%H6ifGb(&_hS6 zLklTG+8zfU9#I@k$}CX`IMLDwGASXAkOCfIA#|4v3j>VvVF#r6Wj}#CEt&`dR$dno z06AztMCrWW=+m1W3Um zD;`jCl;~)LGIAmc4uKX42*N0_eGp_gaDn@ULO`S$7wcv|;s0Q#EaH~zQ|B#Hs( z$=vU8#55zIkb?&PUm%ytUw?jrmtB0xH1ALMz)HQ(U=`Q$zfd|0w!OJNA?;rTJ)`oz zJj~U}UkquxyuN^Kbic2HGTr8%9&>c_uZAL{Sm|n@zzPv((M7L^8u+G&wfgil*c{PGOuw zjmQlHk|Eb}m@78mwpXr}tn80P{h*W%;kpJJy-Q-iQ$_ckd9kDuysMWEbII9V$VR-v zZYP%`YCpYHopxuLZdQEe*@yuX$!3T{BioiZ1P|I;30%%@Sm3g|X=ulTxw&gr4k0|w zd%5{9bXq@Jw(fW5s$VVJoZj1eyP|KO%m1yp=mzLN7$U&Pq*#<7}WtrSvfT>!JaQ{!`||s`HG!gz9LheoRdyKR-jC-Sy(;BPz4v z{ea3?skNQfeSf0KP>%sOySz<{x=dbfHqBhvetpAp9{X3Sl3okYX>o5ZQ0Kfp;S~wW z-}T7M!Bv^`CKNhezJe2DpE?G0Nw4MpSS=wp@CnHO-t?0SlS2JmeW2p8 zjG-=ruai}u65LI{Pl@ci$fs1tuKEV=bM;;IzG(fR+Jy8^P<;w~ACNv}c&PcKA)Yio zh}LaiI{DmP=XQ0$9}oQi#IB@UgQko{SOq$Mup{(+P)8TkJ{C$BO1%W3^&{zIBJ>?l zMkigr&SNwboW3~n+JvH;TvH@!eV&%`(%G_A>Q_|+TK2a$B~tdbbh$LWUVScI7^S(8 zj&nMOVCO^{ZUN`z;`QfrNtK;-dg;{N^i-K_AAA1~lZT%ltBIs(zSV`X_4jH*UOH|+ zsN~b~opgCT{HCfPn!XKvK*JL~|IlY@rE|E9~fe(R-YQ#}DS*i?<+3TRdVXV1a-1E?yF zn|o3d_em(jA?jB!8ovP`ZHj`)zWd~?P&Hfym?9bLfuxB#2e#rvbNa9fxzaYcOeMJo zQd!X7=Qbp!=EBmX)*U+=WV*Pv15cOB+7;60)4d5a_$=)}3zC*3(g#UF(6hw6DCv0s zSQqzwhZS~GR0Or0<{4Ddq{%0F(rS>&4%-WYj)a~CK}9g%fliayKIkcceo*z%bioHp zSrk)GOq0}bGi#99?&b@Mwoo@#c8Ld@F4svMN7)CLBBklz&?MJgUl>%nP!~{g@@r6O zx==e-g23uSpepLOF)H;C(WEmt$2Z7SWkrXOCXVSLqZNtPWnKgmZCVdKPD=YBr^)Ah z$yG$KxaBJV+FlA9R;H-(LzzlOLyrYD4TlS{($M4~QyH1Or7FNOcYB9Kc~IsdRvj3+ zhbdszKSo#hEkV~heM-`E&D|@j;}WTi7$YL163pfh(a7ns2X~2wG~t}%x=!{%ok5^3 z==ceOlg8hITF~_utb`9WP13cf-4aphP^k!W>KnAKie`SQQ^=;hiz$F%?JN&1MbL@J zLcjDu(EeGdLXoYtnMoIpoL;~xZE|mBWm*v)ISl!pBS{nabL(CN<9L`MNTmOlr0LX3 zND1-9ND)-=a?%KJX@oMAKxRidg)}0Ep5iQq7LTf`C^kn$MIyVSq9OtCMZVCnqV==Z zraCN{&ilhALFV-ha+v)71IUlgjgRE#3TDN9kar>(P-Fhi|I_s8to-G(*WhFI$Ib7z zFLiL_>ji%M?gr%w`-@z>96bC6%mU99Ve)j5`uz{(_Z@4+I_0>Uc~YPmJ`3aeC;y7dbgNY=HkuiR7dC-TS|cNawh!l0NqAVw;3(g?7=7 zPl$iW`@;Ft{r1|h%*(OI@AFj^yL@ae;s5)bvYeJ*TIKcz3UUOkt==P%qNcIq8*fny zs^KRfEPOm@xmz9Q>fjIWfUZ+-f4uycAeW78oj*m1@QUihN&}}_V;wpo@MX#a@t6E{ z@3&6wIe(=r7fsGxvP7GM_ZLuuLzx7WHb;)Y=75Igrgl(4T*Nv;&9Eo5d9{H<%@f)j zQFvk~lgO{dAyumbwcWBjbQ$;K0!?n-9{_C*MN$yD92r8J16tbKnqdWT5vxcQ!~VdA zl_pMgZ%A_lp~;~v0-si=6wPkbc8fR6_?97RI0mC!QU(W~neH*8 zUPFN&G|a?_7Ak(&|;X z!LmyrYKsMxf2a%-26t9KSyYBOVnq)y+ib0lVF`$B7C~^K>|)5b#d3A41(nULUDny2 zo(ljkNLSk+cu|mWs7=&nyh88b~M0VTwu4F;F ztTvemKO|Q0!g`7e4|bBE_CT2;?P*k#rXPdml!}fh&#oHC<{yCSUjId1)*!7Uqv|6Q-IuPt z$X->YP1g5`H?xd1vmB*mwTX?mb1j!7+Jv8^V+>4Tl>_My2t9-Wo+_`RSONmtqBd+0 zxq%|49dvO-6xpUH+Yu*j!y;}A8k4cbimahR4;-;VEsGIISfQT_>a4bB)H#4?@9KR_ zSZA${*sNZl2(1vKtUGROFqKJA<6V917=5;INV9NITfq8J6U8T$?9e}lpd^T35*y=V zf?|B6;5a2ls;>+R6UT=f75~&50pS!A03_tYD!zl7=yTsv>4N<)Mn z{&5oL;S)?@WST>aPfrvdOvF!+kVR$TNkf!}844ns;5~eRd|1R#wU42)X_#R<*f)hT zP9e%Bg%MQh=ZQY9>6^u{4BV4p8HVee#KuY;y;e7i5n>reR(;giP&yT>%`>yiG4f(z znr2~IZ5QiTWfbE9dXvU|cn4J+o8S=R0Tjan755b=VpUzZ#~{w*2mzH%upT)=KP+af z+QU%YFsQVhs!u*pFpN=_C>YLW=}d(|30!^Z=b%O<>|EjD#GGWS z(k&@`vJ6et+}bM*c0!}4bst(Hjtf$w_vLZywCZlpLc=ruF~ExATbXZ)w>)GHqS_yB z3hhdm$`(mgBAm8BA=>a^Nkz35P5h)YrIV$k3Ft#PvW%z-fL%p>vXD|YmHOSMLp0X6 zWWb6yEJc8yE^=y2VJ}S)A;hNI0Mmw2mTn|NQZl1-rd(}-*;9fkK@bO=o*4bHKvFkF zQePheUW?By=$9IsY+;`+gTuBM;>D1*Kvtymwm^z%janmm*NPL>UA!p|sEXc_>;{=K zrnh3QHHvD^VN2!Nnn&H3=kK8hp}8c$Bx7F3$u;A{*q#hkoH9_l)}W@$_{aiQ7IeXe zxTvW>OtDf$FjaIWufj7w>JY$(-G+kEUY%t(XVIH5_qiII*-RNp-y z27bt*vZ?$>OoV{ero6&T4?w`DU7?~;F@9R=^2<3vGV*27qh`>fwipGZcFP>fH1W@RHj`BEuO&cc zIlzlCZH}x+iDiZy)#A2B^r0OqsylB}7FZRvEz|`%X+&?0S7RL2l**REvpt2fImO>Y zhtg1)N3;OG7Tj7Eg%iPcnbKI!C@v|hl4{LA!Aomf>tlIjg0*Z!UO_YE$y!9sUR-q# z!obF2%7b69qO+lk-kv;fQ!GXs@0h`BlC zg2@GZHMq_d6)2s_6C_{z+=SYxLhAZwB=-B z{dLT(9M*yx<5dt!V~ECLTSHj4oK#jSViD~rP7*2@rvipXMB zIp^XO{~<;_Dn|V!mdyZL=@C!nTo3jl)I@NjYL)_ECX`C<{< zY=tf5h^TE2T@r_OIpojcY3;yiZC~N|rqDcH1kA$%%>fZNAyZ_K8-v-2hNAT1SmO>Z zVsDx0eVPeS^i6cdp&v^?HFH3<)dAoYyPH<;gK(4E(W9E3&Ole}Fc&`hQmeY8XzfNv z!3!4spjB+NM)gB+s#a=hRYfUS&0-1rtS+)r(whMd60#^|wn&0;Et2`kG8?LYOCRth zl~uM#Y?L95RlY~-5e*9RNpY-JU~E;(ZWxU!+l8J`WJe6@v>(T-6hukRq|y7LnzYfm zEr1T{gDpWt@6f4qovvX?Xlw>akOVhb$d|>Gn&Fh%Qid>_E!-a;vDhW&K9men4b+ak9`qCAc(i>iY~vAO}Vzk#*< zOIC7alcrwi3|T1WgPSsRIiWISrAjMCP^XNtVU-mQ(U2EyHJvF|x=5~?V@eTa8MVhy z9xSQUEUDFYuYlZ{#Nf}H9%(zXIATg+9t>zosM3^A6v+{-u~^#r(26TayF5iHnkyui zthB-H6^tt*h~|*0j{I4Js2PK(?e_^U+0S<4blu@kcyXh}MHJ>&3{EYn#x*@#?Ejp>MkO(ASg*54>7ss@JV*%Sym&6WAgTg`@I1 zG%iMi6_Jhy$57%)+HM&mNQg-3C^(H4IwRu=5!Ec}s_gn!?RH+vE$)mmDM$??c24Yy z@xcxbxX01WhKWIq8ccDPcf(w;yLqEbYuTaNtb1dMI>l9?)Qa0m5vDb{@+4KW(I}tA zC)!0PU-OpdGiYU#wOSZ2x7>5TO!nQ~Rd&qw5G#x3w(MKEC9u6v51*)*YQbhjL{d25 zno|&yt4lR;!YuJ-W|?MXQ?F;uI9|^Jac`kxaL-VM9fXbJu+PknRV-v6+BJSqnCQHE z1}N`BW@Cud3)CIr!OE?Jl@*anU(9ply?tB>M3PA#g$yh|(an5(h#E2QpzUuWQ5D;G z^w7HXSslGru`01v9!Ay(@VaBy7^^C^aq=edV&;)z=BBpHCXUaF@j<_#aXvvq6y^cf z#03n@^yjtoQ6IsB9$;=6`{~VWQp7A_|9wa6jYQ#`U{s-yg@p zrW?TgU8rkXKa(N9pR0+y-{RWD-<=kxlXKxWC|3Xfk(z~z{;vJm+nqM1OppF=!_S@| zQri7)_fK;1a_}%4BX~m1&i0k-l8~%0v9xBcXvuKryz3}Oqso@8G zJ{up#Ud{H7yn6GaXcN_{Eo73N;>F4f?!-RVS$svV7M~I9^%x-1!Loz3OumeNce|ac zAMW;O?K$;Us-Z8SDE`Kb#{zOz1dBn{T(4*>ln@$6^sqRwpWI+|qc6bVf1y%%(bx>) z8P^ive}RI$;BO87<=+0W$}an}MzUygsf_K^`cFK13qNcWHATaqNzh>8iOVp*P<1as{9}X z@0b<8pe;B|s#=LLW>h9!=aF)AIOOxs?6c~vvKhtyOqrLR2wB3#!L zx}7L_idV3fWD==GqVl4-0ZNZhW3&m1D8#RsyRMl}$~OOZmq^(^<9STBYP5DM`P3yO zf=7mw|G4nS`37 zrL{K^NLEQ_K%Je7L8cM7cwvQ#L9P)9xgCs&L9!9(X}h0^N4}-FV44kzLux^Q-|T35 zHu{4U^thg_!I3F>aG@IZ`p=Werz98&B-_F!i=>IfcO4+y8G3dS+#-;QH~KX zp4m@4@0`Jv@*bbqjwMe7ya-SN*#Af%dIXiK&~lT*13pYmbwkgL{KJ1b^gdes_;h zmT13XZ&2GOh`5k$0qdK4i7ozT5Z?E#CD7@hyg8WfiwcJXY8Gv)z_C$O`ygX{V+@$s zKKPB5Yo$m;!3lULc-#8fH=nE*Fn|I86l}hoi45h}$oYL5#Sw=bML8n%aDVIX+{EE^Yqu9Jk|r?seqE^v zFcXtTGE2kl!T?!WBb^kC(X&_s!IHV6@(dz;io^Ntq%hs7Cu8&fj+t{;QAxyTzS$T zfS*9+v8(;+dVn?v>zdHuRxm_P5$9L=xUmMS)?oDsiH6VN@u%c=^DkSj89shde{P4I z?f)J?VHPZ@5R}|NOL5hqpgFz;aSJM7+2{Vk{RsNDPa+kB%_&nB2L1Z&U`&-07sQ|jv-_1dig2OFjY@Q-35 zyF(^pAy~!${U4Z;4oN>faw}Y48SsW<@OlG9NnL9PsAPLUl1MGsA3MPCl1kQoJHkeU z#X(GD8ksMTUjRUXPkEF~Cdu`@0WQ<>aaR!AqKcIePQ=NOfTU z&n*okZ*vDX^?H8OPZQVeqSPcB?%P=uC|7f;4lmsFa_`K&#V#hkm(P5`Cn$GMndEG# znXW;+cN=6m#Z{2X2qBaPgl_AeAH}qy8tCP93T0TmvQ|FJ%dd{wJN30S{A`y7N$FY- zeY?>bM3y=gS1{^qO#H{iEBO0|DVwF2yJf@u+o z0d(A?sl+q=LNw4U${9amQ~)XvN3CS=$&Q-`L?$4x1t?>h`_q_j&ff=!zeU4p0D;IZ z69~Rvdbm068{@Gk)>$!4*(K73?+qCK8k$76XT|XrI8^0BgkY6We~*`gwXAz`YaWob zv-y8^J}=U}ety2n`R)6{fBUw2jJRgV)Uc9riq0EuiKsf}w#a8LmI9-=v`%va+1yi_ zYg^1m+A;%Lzww+>r#e0T`+2pIV>5;;RyTXrv&P7Th(T}P7B1GiC~&Ee$=+R_EQRqV znKC6BtV;sq5xi-#X5X^2{jqF@nRcK-1?@hXWxcd+H=A8CDYJ!0=lKI{nc$|qeU1L0 z078ZhnMt4pOTe_ku9;=PG$LYNw^aOKT;GckV#3Km9>B7p>QHG$3}%63+b@g(koMK7 z+zz)HE~l{dRLc2xT+%H!qQbE(enMgd@CTlf2>#sM&F2fZxl7_d*Nblg%=|L-_5$|{ zYq!mMK224wE|bYtEHBFwm-GXZTvUW!$rt31o09=n4s1OijJ`r$j!logpeYi49MSM` znH^9-h=|*e!I7akgksau<_YmyN+IK#JU_-eAO)i>EjpA2S_=5+>acPC{M<$5cnQf_ z7~(kpO^$qhJds|&DLabi^e8+MH?W?H6c(akM9M-t_%LSgC!>BR77J1!Y$b2WHs_FM zd^)f6e9`9G1Y$wly4gc;Q>b76p{HR$Ru zZ;x>33-HiKH;QExc*1A1L+|&!F=zj_U7;R-F+DaGc$6 zSJQLxi|JCgj1#wCrtYxDjXxZYGg zVnFFI;mkzREBA>XX>jfl1~;$|;P$&6e78st6K9pTbjep*tfwsW#F&~$NaP@28XdY2 zAdDu5;ASTF0EGO$B?JiMDN#T-Wic~eLXS=2(3CxfTaSL34-EV>rylMPdF#}^?4277 zbVD(EER_h5)pGwYECWbN6+&_-(?3GD9kAZY|~Tl)m4m>DABIY<|0+Q2#vJ!FiJW8o`BN z5M+Vs!yj((a}fb&XSOV#z3bS5$86Vkd*@hUgRyqtCN0xka(a#wLIF$zX>J zt`I_sOyfhNiKo8O-@E zPw)qwIhI1`ZPs+rZ|r2XN*`Ba>7wr{CaOlHmli;DlA=fyyH!Ya9Y~O+vhIDzyd_?qX07H6soX;XSS#`-_ZtewrDp!ntQ?{M2{ zUOr87`F3j8Wn`0TY0NOzB~53@0L4)gD6@tA8-fafmP?1d9iY#6hT-q|HITM69R5Z9 z*7>=)Ikt(RVhl2L<^}GY(q%=7_O*ewosEx~KN@?!OloK)wW1q?jY*U=6KBbiY`Ls! zC|&85Q{*a)pc(9T_x<|5y2{w=X%;pLLpAS*&#PP;fV2eZ`iU`XN?*N<6Jx{j23+{T z)0S+9!}8xBheJf9KsLMIlXW$8g7bA%$A9)Y?Z5402gfA)G8?cY@p07(rjB@6PCh!O z9jZ7OEt=W4fGn`v*sBy9o1U>G_khHE<0nZuGu%DyXE*mY0d-gIDC*12$?fM}<5pCC zTiC|cUOyDWqg`eK+A}W1#7RklSixe_aN8%a@IEa{q@G63z9y=~M5s)xB~#ngN23Z_ z4(8W-5nYm^_h1|Ay6Tl5N<6tHu;FJ!-n(0K`W7G+1_MK4(&W>&*yqTjs- zJ+O4Fpm3MMh#wOjn*O0RDZ8=RxB#e9es??q2b<$IcUX{P##(udPR+(ZVa09Su{;e~ z052nLDGh1De#bcV{s0M4<6sHg7;K<06epJ!+1ll|xx-z?rP+zuh}lb;hiECdP-?@u4UA@JQxtq;LeWV&007{G(+MCFb_kA4UUW1ueaEOE5@l=LX?S*V!!d-r1|$^kAiiKUV2?PxrU6=k zR8Vn=8J61fj>^%)^sS4eSnFskSqeVC`qSEH!C1-C7AB z?>3Q$dkZ*!hqYZ4csGGDH}J3(D>ySq3-rvZaTMY3#w8gBv5J*Tf2f_2m8 zf_ao&lJ^!4nAeSWpxZ*_&~6REhiNS6HY_*sBMmZVsy?+Tf5cpN-2swi%b$^vhtK z&!82a>jqf-Y=551s~KjHhM4jyV1lixF-G=U7-pSe@U_t0ua5SQ_O$u($BVOX-#0$N z)%fryXhVi$I_uhXr6E=>+niyE4EJz0m$psSB(9)~cBOyARneFTPW{yV$W>sA!LF^}G@W!U%TIK@=z!o~3OQ2g-(n z=pdOr({ml5In@mvz>}-2({>AJ4E^#$H8sxh&du!krp0N^rOP*hBXR9-i|Bp_MB*o+`Tf#_2GX zlFKrc*~BpaKx^ApE$G_pqf&3n>Hz-3R5u8h&zs4I_-8IKUWj-G3K#no8@c3Z%Ow3} zV91%{#Q748oH{Fs==%7Ec{+YQun|e|fp~2oKRm?yVpkaC{0rb`2ttGL0|5Rs(yW}% zNcVV<6~lla6MV??uOOGR%t9-0l7&RXN5`>X5H_U&U|=?`1ioIj)a|| zJbVjdP}6F0vDJ1z2gX+Uu1Co9L`~S5-GN155|?+|CwTwk`u-RRuDa(=_5N=w_e6w9 zr4~Z~Z*gUnVHrc=Lk8WZgGMZ}SqRMq4`N}|lGdPB!d3xvQH5yaGdYvu;|9sFhsF#% zWn#f*l`rQn-7_2bcrSqWX*h_#-j98+=De_eq6WcNv1AT*eVgL=2WT=-!EpN|KUI?A z!k&mYI7--q;%Jvv5Lf&v8laA2y^2ixIe8%m$(y!pKN>NUEYoH|;wrk2d^SHP30lqF zo5>O&7RlyMl04un1k<1%2!CPP28-GFuwlT<_sKF(9Vk+R^Z#yr=KJ$}Szp=v+Xh@C z^>F${%iWS$D4OTY3OI$sW$(`uVfUZXN*sgWUiQj9fjk3Xng$wjNtqh}*V5(sPxXWM zVg}?Qdy)u9i=#u9tjZ?|GFhx@jg#NFmy?_4)^7d612(^^-T?*FDtP2{KjnX&``^N@ zKZ&^L4(S93@&5eSsInB$%uXU_iDr#HZjU}25!Z1<=MPs?hH4v(%NOmcRJj>?0L9z;2gv5QfF|bDV)JaTfHe3n@^kXj`6|LCPs$l-`0dD*zK{E2e81 zpMv?p=C@!l!+?#~0KfSBS<^8FkN|C?KWO=EjPX-WonwxIj~0&t&cs3HRsAsUR%gh9 z=|>ojc>DEMM2yl+!a?Rw#ux@Tn*-N^K- z&7a3`L6-j;u`~8t*aMwx>rTCMS+rNgt)6M8;QiB!y{svkNYByC=UR51}Mfs&3QXler8 z`qA|CwDg=TwM-zCJq*R2u@R($tLvjnF7HFmvl*9c{g`7kH~UCBTa=ye*5oL!H!#|- z>1JgxcDnu>Le$_LS436v#suLKxLi_ zM`CW<{~mh*4G!RU3fk6;bpUgG~uhHZ>|CZ}K-}#4go&Trm*G$`gFqTLC%Ws84_jZJ79^5>5a1(=n zX?|@(k8COUGh`i^E+GAZ{3Xmwch(y*RCHD(|?#5p4E~Vg8!b zF8D31+v@QyrQ%%l8Rm!(!6k_N3h^C!yjEf!>T+~>bEY|u5zx*iFzw+M(J>iQ!=&X5 zYEH*QLr+m)Zp#2Y@>2*K>jFZi54w_Ju^t~Gy>O)o5jeg>?!cTCYYE0TQE*p5@H*GK zxUg~~7A=nu-8kI>7v>*H}VUI8F=1ve*gubll{5|#LDl6k1qDB7a zIf*9y&iJN`lTYfVq`{42XK|pTX3k$QKa9PuiTz%hrA%zj(kS9z1K=E#M30+m1rD3pG*8jF`7eh&=haQ_uIm zD(Ni4=&u~#i3`Sql^FQZV#7}CKJt}-7uCn%v|{|?5g`N6o_q6>7cHHlTL?EOIp=YGV+)3r^xmTAN~=We0oig_c~FvY5yrHRBxmezBrXUBqtli9Mejc7XR44k~JJ2`j78g(P^tof=Z3^7Ch6^0~(Kl15 z!*pOD54l$pCHr8lRHWR&M7Hme;6>AkqG*|@&g4Bdsl)D)KIx+2_qO1dl)bkC{sc33 z;;&0bUyHrQ@5!JhBYU(X1(4r3@jXxix7}N6UgcmkvRq{gi0@~_)P30E&Mm1>!raj}W|8Fmz%c_tJegHSm1dxEh+{{5vI|Qg=Hg zIknzV7dYH4A@#dOaaJd-=@|ZhisCFs51oQA#_g5$)q12(ZK?eDi+({@wz0Er0i(4& za=d>-zyAKSE!0nB_A|@eFl9C>xq?Z zZZ#8oOhYk6BTXZ@I-Swim?4=cN*EUH?BttVV&Nob<{0LuX=cTlu^)K`Prg=GYW~1F5jhWXP z7+^x4&gqgn-0`33^a}i%pu2?)s>znsIBS%5+fOxM*}<8_9v!w|@r*XXNiIA!;nwS% z6;tZ9Nj424VL^3bN|s`JqKbBUc0w}DiPB-9|7Wo%5_0p?!H#YD>Ja7`HK`-)o72du znH1`0j-~mCvVVMaGRZ!IX%e5|jkbE|NV2S(wS8!hOxisnXS*V0fMUe5VWG;MrUGOB zdz0w^1LjD!4K9H>0OBmAY!DO|NQehWCs)_Vmj@RpcYtWlP5}=co$1^p;_BS@Ihbu_ zTcQARFm@Mbw;$Q|u`N_k5Y)L_AkIMeAx)jEZN8?!!ONhI4YT_j-Pq(OAC3-`gKl#B z+m6X`j-Mk?G6VEP$OS$*qojalb0*1P&1}CHt!Cmid){}0;}<047_`kYdIdw1Y`VHh z%3hy9VB?hAX9x@dKYyU28P^{tv4e{zB#hv4eFYN~i~QVy4qrE*=^3*61wkr*ooIcVq>+~J;=77r0CYpT=Q~J5_mrp1qP3w2R4&IgGw|yk(`f?%IQ-K zQZ{h@G1=m&8c}n9dUgSw$v!`QYJ@gL8R_o&davG~>JY%hPCwne-{^4v`sN({_TU2L zrVw$U1OOC{Am2YhfM0>pWDrshuXAED=w%34kt1J$EaKDT)jD_lYz2);Q$~bxQ_D79 zZP08Wi$P4SF=~<>iIj}L0`*wLVf8o^NtBFx`R<{J!}?)VJ7n^~^)qSo5|muOHq{Uy z1A^UPNJOph@i|%aa+w2R{w|YZ*;Z%YUT3~zr#t^VuQRfvBgo!L#HvZiNzBeKN~qXf z(PQ*kc_VYVebvT1+1QkRs%nZxaW1Fd5Hk5*v=j_1i~!opDP}-U`ag&$)7Qw-Qh`L- z@nO4TCI+A3%x*{1Imxlnq;2_dRYk%UL%=oPsaf<1f=29u8%TJ$LC(qdsX)_CzMp3y<>?~t<5w;q}(?ei6cF;;68WY9{5MOOz%mnWD-K#bLmSzFHD!Z;=S z>N(ooTbTKvJ^Ko;BjdYkFn@k^VnT*G%*(86fR#M){IZ3{C%0?$0qX0*#iXbB{N)4R>tXB*>a$lmt?FveWm4qD)Gi zweM1}|8(Ppo+;u9aE6N&cmxwA{$DNndgZx=tyU$Y-x%oA)Ov~L_Lejiv})8FGl|pj z9K@iT`(N}CG*a};)C&_jiPqT#EIRye`7eB$gmuag(+xqUZ%AY(1#pZYlurt~1 zlgLwCHT#detfSlg_l=TC}HzlhU-SlVkb$ zb(53~n{%>O&rE7!Xm725Oe?rN0yu7SM(M6YOlFULaWjQ9!Q0GO&&&8MjrX{b^0S3E&%TFL1@$~bXcBV$TB|{TX=w?~D zHItYO`hp?K23_%Jhb*4Sof|6s7|g}Rn=&T3Tz|qGMeC0sR&l$Lw=nq8YZzRaW*&gM zvR2G3R=|HQGU5;S7Uh2nv#Ohf{(L9PzdXyg8K!O2h|acmsxTodUOfFtN(9Ru?P-6K zm5aO0)xmMKan^C^9yo>pot<^!Oq5CHeoE1lQi_%)%cn`p^WlH}#;;M|0pok60Z)KAbz(JRBx&R@zxu1e2{UgGc= zX4g0w`(czEy%O4iz?6LAEi#xTe_S1L@=uJ$mpd~m33Du(g&IgTbotsoP6CX7jz^3T z8Twl^EScs(HYe4iK*{`1&@y^@Gu*v?EXnF7eMpU#*>lVeb7?e)m_Jk^2TZDw5+?%{ z+*BjapFzztO8)g7G2f>k#QJd)2@i=& zO1Exd@T8vo*P5-&Ud=Y?D?@9u9C*^`b}JlXhj!ZW`_X0^EoCIlwl4eN*hpZAokTJRJ_@=Ju4tO^XcLLaX5&-t4L)HZj3eFT zt{Fk&^iYY-#1`Uku#yDOG7~L~q=CBz5Q#_jE?jfULGiSmd3VFx-Wy5p8_nhgOLF5a z@7a#?9PgR?eD7VK`)Om3c|B%)*FN`A^xwTs5erKzyF>r%(C%Wt{szh&^zDn-&sf)? z-Gc*#dUiC3@HCk}?^5M&pBmWmXDSBs!(KfX2S(r1IYet~Uqgj`18$kB5%@DlCOU=w z#FTq39Z>4AXJgq;JptBEpgW!;G3m!yNAxFcsW-meOPb2W%Ny)m-lt5C48l1BPmMl6Ch=&wq$ zz>=zd`u-Xfs5wFP>JAQw;MnN6B~ezOn;i;QMZl!s@BH1%+#AbBSFV({4~&t7D{(AF z_TSA_vj%0#yQeR(&mO*fzY7Y+3^JKuPLm*{l4}X{SP>&jO(h=Gnx2qq3_ZB|$T<(z zL$(3+E1gZmjg1lb@+<4+u^z?O=;%3?ak?z#zWv*33&Xf`qDzR6A^E0Dg|Q%4}WQ^NMxxK;h^JkzcQKo3=As%2-A87 z1={v3BR_Xp=5uBzZZ324U?i3kLrNMbPfC`|D8W;Wnpvk9l`U039q}kVjN>SD2tdHu zKRq}7#`e80mOc;}M`5C0a@?p{D2(C2Ls9#0TAlPg48;)sNiI497TDavvq>lDX$ zRK|e6`B+R7o5$;BMtXSz71Pb*g`3*KD;?V*Mmd=isGy&*@i@ot-bMV=bQ0(zJka0V zm=6l3zia5$0P_kxRYBhEghIL*@2;|M@4nHbvCX9rm=341X^{;cXjhM9#8a{wLWDjp4FIxihtNehA-5g| z-6%dT;~09Fbki4W^>%thikamX$`q@#_ZmW1UGj(o3&UaT2lm%PX9g_mXM_XN)Fa7+ zbMCv-j8&p(ui{<7v-+toa`UE2PY9cy3?3IW>G3RO!$Egg^!641>faC_`PV)#M5EgBwIkE=nUAa1E@+x=x@6StyYFkt_GbxO_Jc9qWnInZQ3FTj zKsX=C=3kq2(o-}Q5lnYS+Vq+42#=n3gMS3+;C_6%TM+*|#rw4(UP=DLVn6neoq#6C zLFes{rUEWWLC|x_0zlNJgO09237Y86Yu_cHOdjk3^Rm6te%%N1!*+ArugttJM&CWn z2_^cSL?K2yzpbH6Y(2*V>N8l656epaCmC7U&)6PWMz2pBPoXZuxLn?01hA-D_Nxlr zUQI1fsy7Pv!?H}T`QtMF${}S(=R+K+-IR*els^pXo`tlfH|OMPJTLH{D+8mL;8wiy z>|CDry!!UZSyXSPbg&LW3Q>+uJCDn3xb_PQ9j9CcEtIT>^nA?B{772o`(rV|t;-VC z2TSX!@4@I?PB(L^yV>k@=aK$TL!H+_BJotF-qe1N(`oP8{XT7|_`clO?EYHn3*EAL zbv=IN^qGi1oA*)KKM?l!do$guaFq~@N;qxoM< zRnm$?)wT~)zkcwgK0oXHrr6O)y|#f0@c9&-1;Fqh{WKj}DJY`2=YphDr>oN<{ls%7 z!|{ZsXQ{4ikBNxa@37W{oQc5c$~8Y%(;U(~DbQmp2#iJn4MpCQ5V=sHaF3O0MjRqq3w1C%x-Z28f+XQ1*>gvTbOBoM(woY!)OxX!ngo^~8?UJ#u@k z0@RxdVt~^4%`V53%q$P!bWRmGI7GFtt^#Z5!i?0}Nxw3vceVv)at#OIwF?u~{!#*$ zb_Qzmz7pk*j+m-`&vq2X%~}aXoZ{fY&CZ!+ShoI=ks@97RFM1Z_U+Tf4*&igrspllB$v2t!L++EY zs|D%o7)sB;4J2DO3S6IoUxl%-UdnYPNXmx%xV(%K^nBj%DdvtX`*xSAXJ8ek36o^g z-TOp=-hO|B@B|D)Q{d5$W9r-$2N;i`43_wK~0vqf7w4_reb?_OG{bg12v_yJa9p2VzspNYwvBGNMzu6 zxwX!xTrFr8yFXb0Xj+HpX9ds`8}jDe`IEG@(0s*-f95&NRO2-blMOiZg7;LxWv~k2 zGGvrNWy%=mSr%U1ik*-+K{>I!p5PU5Gd(iZ0$D+5MzPS%MdjHF;__rvMCFT0qxWdv zD_n^Y1okZ5(! zPaUPNgotcfr=UYv7>!94aT!!wO%|09H7Zm+7iMl+J$Z5UD#(msPzK7%dZ1Z`xY%Maa8RXdyIjfaO0J-A^T_yJ$ zhr@qlxby(DI#eQNJ3fuQB|rBhbD|{-omwOkL$`M$%KG*7PntDZn)*JH-yrfG@*5b) zuNu|;1s!+&?$j!oU!?`}8=X}a)q+A&IHwS7e>&QFwm(0xtqLJ~-}X5+M7o+-Q(B>k z4VvGlE20*W&Zyz=g#{`=$fFd7{f5*nkw52#SyG#Uk*qaoI;NXNvu`w*JZpawOwgh^ zR*Ei_v1-hj)B!`=GtxYwrL@IdjX){U1k}BaHS`<=D z<55^q26ahOpTCL&hHzI;lx3N0Gs=ps3UgmU?CS!YUug zD{fewRa@{~qSvf+cb#w|FQo0{G7H;K@}#2UAB@MhJSTWH`L@zt9Oam*s(iUpDJ5{ajRsZL#8ay1 zW~5c%I$X(Oq==zdrOvzgNLt|epJFb|-lX&a{qvW%)wR=D@2#(e60x}789aw?>eJn- z70;`KGXW*+G6AcJWe=iaeZzVoYkFfcicfp>i=&Ns9B;@k|J3Qj$=P%2a-Y~c%Mz)u zr0V1vjtD793;d;I@wcMW5W-RgqRFpw%CFVlbABjQowi+uwDi*zf5T}OfXxZ$|T~P1#8)&$<&rNIm@gDlHkyqjKc(SY9xB6SFi-v9Yr?73` zZ9T*7I)Rc<8s4}xqR$2_&N!YpfsoQ{Dc^jlmzuk+8PGe4-X{B)MrRa6xdJOBp13@k zo4))=#!;o|o7X#3XZeEh=IcS-Xq{`&d;$=6#?fAtX0b)Ohkf})lqs#ows02yK#;{B zkk3#$@lPf)5x#tZ)arM45FOaxgwaN;qp=t4?GOzY8iXynks%=$4w4P-(A+?c{(V@; zzk;6<2MJ>L{&3y9lYL|q)lQrt+*n#$rnbd_84EMq-_#($A3q>g4rUBzPhmm_8T(h} z`u8A0jSOETg)_6x4CzXIskKURN%<@plji)wVvaW?TUFW^=hA+VBF#OPPh+dPG_}{p z&^EkkqJA$dRz&)|v1=(!lM|Y!U7Om%tq>3x&D z2UVG&8G!poB%@pSJm>#@UHw3^4k9a79IK_aIJF8zS~*Gz6$RBr2_;2^MVUEDN|`B| zB?ZN(10|rKT&%#`$-AYCH=(AiOfjXpAWJQzXi=*GEs~vTe4D}GB)hjq->qr!Ns~Hz z<|c2LTl1@K*t99wISUSd%LeSocK3le(4_f$r&?Bv6+_Qi4t~!-B?EtK)B|BuDIC0hM1<_~0)px_S<_I1l z2;yawD#91ZX9*n@B($j2j7&DBVV`H_W6r(rX_tAXlX&?#`R(M$(CWxvcA4c>4Z+y= z#HaM(CMxr;AxlGW@m+JsTt_yiIA;4M9=F5pmzZaZGdhH2$x~Kb2C5d0tqep~9@5Ig z73QM1C#K7S$r-`txD|r+Js;TmHAF}v6`{DSU*XJU!Ve65k+CF_r@jDx@z>heg2L>| zQ}IZVC2T3^;c*~lIz#@pARTXN;=+tF`4ag9g8Ibe#6zQMSkuxpGZa0i6*Y&#qIVXm zx(Nv{(f2)XT6_N)FtokXdc4;q?+X2$n9X%WHFi@6Cw1EKD$vx{-c!ri%B6 zG#qRBQG4Jf3m)DI@9uz450|3y(D26IYkIzRH}Xb%>!_ts{Ewog&i4!bRK(vrmjmou z()Zy=s-Cf<=A$0(OkDX+;rGh!sSbZ9zyAp?T zRjWPhSkPVJy^E@tnGxcJlo1+ujXM>P6(pLt zm?>iH3-&!um#olLqL8YwdBYz=u%PIos&t{Gi(`en>WSuApLPzXS*zg%hBZAIy%N^T z4Ud%1Yb#!`4fpWKvF4dv1rVW)(ayk10{|eu1`R*Qh=Bj!d&dmxAhO~Eky^|qC@4G8 z%1Wrg4@=UMNYP3tyN^;&%1F}84^J+gDQtb#Dcd-ucWYkVhB!&1r|t|^t!(sm`6Hyr zgF_XC|H6|p1)by!?ZPZWOCDcipky5SoGL)o<_`M>LbQOSm1AU(U0zU9l$4g4oYjL1 zx0u+&WbSV$*|?l(z70dHDvlA7jGm;RGGvXf(*R56Wc%M}Hu?;cUYmpM|Kgq9yzHhx-#0P7;|rdDL}!G%6@Hwd|h#IS;EsRgB3I^ zNA`hnQ#o@1ZsD&fd5&IiuQ^B)Q6n5V*veS?XXc0U_iNRe&WjnO*pv505Ac#{qu8)m z;%=SL$i<8Axvv1Z{OEf*eSe;K&OH75-k$gF)=t3FT&TSsmETBv2F8U8IrvFKh$1^h zl*o2XdO{MQH^~XXrX%b$A2KB})Ikqjz`lije}?}CE{mkdh9SJYzi)70w)dUe?G8d9 z4l#yyymO3WDxyCm=FuGAgX5S4#=vw+L~+1l$JK^JBgNrx-bO+&<8e|-dh&%#k|7VV zIQAaHH>~H#p-&>0DRHmPK~~MTYpeP(Dv~Cqik3Hfzjb{~DnUT&U?kcV=@1MS0d0a7S z(Bg#vqfZx(TZP-#@b2r@g#6I-X&wd`RDzzKRX>j{L6zuN$)^wB1WNs||DIv&DNhqr zpbc01t~T7#jU@qDwx+RdDk2VFH}q-g3@>Sv9*2-8#mJlE+a?M9;8cZ9|GZVLaH=97 z;uQ;oVQamA`UU?T92i$y2(mX>r=FQ6Y||oCRAbdk65*`Mur`z1z=z0%eErP7fzIVw zv(Kp1{Mb)xB;#;69{>9bAsWdFjbXNpgx&p-t>h)bW)C8&>4%z^X~#pPW%_ z$K9TW5W=Hx;WrA`KUNhx<5l_YlIW*~NmIbgS^;L)F>dhkKo-%iy|2-Pqt-$j?fJ*y zijv#MyilA|eW${d6S{RfE3-KMtZbW0hDrf^PnX!k@nToE6Eh6*|79CE*DY$e6;AIG< z%^rBDev|5OM*+9C1GUe!z}*(nxgIRcijmogE^mf{e~U+h(|Y#cRDYT)W41!E5r{C! zrz+J%a7y+lbuunE^sDuw$lYl&OTorXCk`*ydank?rv7hMO*+F-+WDk@U;6$Wm z1?e`bNKhqVP_t&~9k^0eN-@f@*Oh9I<)0%FjAZv;nFU}#$gDo?5+LGwqzrDS^!oH#FJ+f&}`_Fq; zq&$W%22^^?AVb8HjJ=nbM0Mh`Qhu=W5zIxe`vu!rfPZE8t*PwKK>$%BW`zi z_6PfFJ{rCnjYbT-NCv2Ht0ri-Fb=;KGmY_K@2*@6h}qs*wc~yu{%FQ>S+;??E`q@? zl`U4P+C3vy*XpVC=Vyg0#&$7=m?7%&$AVqtBC?eDK@>KdwlGG4uyV)A)LZ`jr*Xb~ zJ{hOJ9ie%5BYv*M$oWpo*E}k*aw{ED#AP#X+XwZn=gDdJysF-8 zCDQ!ee;{MPgde<#35XN}k<_i)jn zN5JOfLBoXbL`?Jk^FEulDeLnKDPokExCn?MRx=ZYIk)Lgz{iHb$%BT?#e{%=hmVbe z5ud4-YU>MhnW@5)hj?P6bEtI4gD!vX#5O2RB4wCX0QbjY`zR7_bd2_bg@nO5YQExa zJ57KVPRvHbia++v#m4(O5_tGw;_tyO93Tj6khRAylcd-6#-PHsHc|YGUY4Dd-@vUPJ`6)=sciHotB3AJyVjZk_#M^xpn69-^F>K@(U zKt=YyEIpuqTst08718rK$tV}@U7i3 z_H|GH)JYw6LpN=8+#vcZct0h)0%1nxn>V>+MJTtIpTG<|jRl(=JSB=>^55ys54RJ^ z+AZ_WOQ7X9dBEvxg(<1c3Gx#3a9@sje@!vs)6$o>>t>njqE->q4r;$89G_LK_ zr_-Pgd$Lm@&?<&UxCw)tG=qk|>_mros_+G>C`B}|^JsS^<-|ltj<9}ST>QC62adOR z+{s2sLq$Ob^Z0OEeD!Sa!>kaZP|IxfjysCMOMSkld#5(7Ap-;`&DLd_`bXeXu?-8c_hNViVjJtK-YmLk8IY zDk$LgGRzNFxQbIm_56$*fylx6A(FewkbK(1ori38o^hXi+FA3 zhoS)#s2L>rtPH!Qc=(?f28)0{8WsC-r6Z-*e~qX*%_uLaX6r~O(RKRmv2OTwf(!v$;rn) zgyj=`bhw|1GDJgb8+Jzy6z>t%c2QkIW(kPHlQ7kRmWrOgU>y&A#V1qV_5z{@8Ow2a z^`!yvZ&<6Gff73yr^UmX#$}$cBqJ>0Ufz=}W}`AbR&nS^TCK59;`LykHKv#+*RmFO zpF2F!&YM6a>vYi55o%)7C-pla>(aK*PDMGoVO*r`Ao7~$!=w@#=YQ;h%?p#=4Tgm5 z{{#}FZ8gFWlZlF!gzstr%9q!VdaXVb%hHJ-oc7h3c?D9xKjqU7Q%?Lo%D(5)ar_Q( zC)7>C`vJ_OpYeY~{Iyn|@VDJ_!%r)meJ^^BBx*;KJJjqIR|ejcFL{f7iHC(9Noe{K z-Z)`LvWWONAY_}Knbgg8`1?qHPr<%kAkx_j7TbCS3gqLZRkEqyC5~412-s0gGl!BaHpTwW ziDmi(psKaZ9ATLhih2jgs$Re8TKbm98>m0(+>^P8)K60D1( z>#Kue)X7Ok*Q}Dadq&FkSxPc@QYW}OhRsPz2CW?-gZ7GM3O)u68X^BZLdow55cYW# zC&)7&g+@a^M$7YAkW$8(n4^?klBcVrkyxFdm8YDQT$P?t&6u&MB?L^RuA`xooE1%T zX-Nab9y)_=p%L+U1hM8z5ZwImwEQF$t)u|6ZCwMXwC%I*{i$O$UX%hTcoJ>AK?&gd z*L#Pkp9|JkSY%T2e&qCh$yy2tn#Ji!^@xMRoW6n-MY|^{Nxqj!>l;rKLZwNl|8n?g znpt^b07L<#G_5g7(e_a$Tzp^>Y6Gd(ur-O^1VmO(Z0gT@a$^?inq4q68DwrmjxEt(*XKuOxA`pPDOTaQOs>ToC7c;)6Qi_@ zjDtZh@Bz%F|YanB%7dPC)Q~H zynPj285~uVIogHPK&1t=wvrHNI8C&i(u6S<1q;N&y28H=3oNvz7-n~L$#ZiyXLFyz z?Sjbuhrx}fX?x(T53}e-Hf&vuWT_b~sb!J2m(so!vN5PEiMv@AMn3m@nVY5zj`**8 zcRqhO-*&v`a_ZNC?ofcwgi(DH_ujhU+$4OzyuS7`LJ?vzA-_yVg&byPFdRqMWR4&) zSXUw(ERSw(O0;W8`BzpF&>B1SSYt!dVn~=Fj5%mkoQV;wt~R#RG}&+*U}m{pxJxa> zK<3jk1f+&Fn3In8JfJng$8V9#!A|?k_KHl+5Q!mmCMB&He2C2u#%SeoPj_{*6%~FJv!b$DUjm=bngn z27DZB5$Gz%c8YH1x34y)s ze4r_xhwVr)f5D!IJVx4*wbR{@gzHyI#g6}7lXjy6o%ksgAnj-NbhpguaciV8_8Iaxh+Fh!6gp z(sd1y6!*`vKV2}d%P;DJ;GHidP&DBgqADn{T9lkkWzF!=jRNydc5Y6d*^8+v&&r+M zFaq;vfj;*>YWWBw74vvyUem-fK~2RRnW2`#QMkeZQw9076YS43R0XYT_A=m2A4k#J zEpCuY+J#!?g#3#&QdVwp9ii5pT`xKf-l1_ZN!(s9TmrEFn(=NC6maB zE-|k!FvNC1AEuek+G7~ETUh*e|r$l2Wv05pOBU$XZ-S&sTW!0=Z$ z@7<$52_(#krJTY8EEiilp3jw$dl45Fu!|`$16HSJ9mQM5iY+N5?%|1CiKsf^&o?j& z+e6a>G@g15I&rIrRbEj+^`{ez2z1ELLS^UeIDuT5QqnyhwZnnd{Mf|JHsh$J%-nNzsQ8|3cu zA0mjQQ++{MQz^rnk3IZ?(pDcauDk#~aj;H&Tu%t0muxpzyvlMzzXQS!sK20yMFNi3 zLg8ZnVzKXuJ--m&AhO~IFUjhw2{Bnznx4#`=~#;q!mVjQ%Pm6Tm&>6-VUG)*u-Xn+W&9ZAdM&UP z3d_*~@IiOM4=^YyaN;Keg&jW! z&tixS`bM6g<}n2abv%$z>hR?y1UHgh<(&dPq!9i-!_yB;1wakRFrsk(r+kCj$vNN^ zBQMQtWh=)|E7I{Xf7vIeK?I-S;{dpL5=?zF>ucWTj(=EVZfbHgGbb@Szes^A_ZO*n z%Pm_vrq2rC>(@2rdI>04$|EOM1KLJ;9dixxfq9dB$ey~ImGERA>AlS~DmC~iOP*vR)w=fxt zaIKO+R+YT5(Rt4IT@M)uDd+3=&s+c8$9yLrdwpNI*GYm`2hvKcO6?#0;gwp==Abz0 zi;k$c>WhxDFikCOZRv3?F1p&qwB$3UD%$cRD6YDaBPy=CGUAuI;yqW_nX-&O^ET$d zk$&!~=Oz!E1XTW5mnPh1#^+57YED2L_>m?p^GKfw*^ z%3#`g>t$uD#-Z97Y_((9aHGL?ajxOQx+-@N-Z?nOP|flNsaz_LW`H=qa>`Man}GYA zXHFyEh#JbEbnSA(;808svc9cw;LvZb2N(|^fnHZvkDe5a8%OcTG@AV#7{-wbE(~aH z;Ekl%#eaWm+-HVCa{d?u&w()~Dq~~I1%zEg5!ckyU%Pt}!GPOucN|pKVq+$aB46zh zA4qn5=ZaZauVh2qkgA$I$g`_uLZaixkbfuAJd($%S^P08bnV^lm=LMLiwN1>DW1g*VQ2Qd&b-n`0*XegHZ0iKMKq7}9+XHIkmn==DC3@5X5`U01m@ z@LtSeBhHIATxo~Vsb4RmwG=&M4#h%(<^f~f-gWuZiuA-)Ty{)~b z(H>Vw3!|;B7*I2fDGrR_C1G%Neh~AsPcWS_LL9?1*lHMsXY8EEHRm3xSr=~e?5UN3 zn9!UxW8t6MeBY?hkCu}G0;b`}g0~iqTB#gxW43{cnpVcpGC2^bEwiL;)@%E2Xx}EO zGv1($fCm$KHds*PUEkECjz9Bg6gm7je;Q%+p?m8xURz`^k1WXG`p=i#p0rSgfMHT~WhtE9t1IEi3`V$t~U|Iumg=Q4+;xvO^lxHmv_<9HG71hUG zMieC|hFVAs9;h_sEa6JV_>|F(NNG5&qwBdO&;m=cl{D@q1pzr2gUYt6vItpW4x_PF zL2AM&zfn@)s+Vz71})Bm1uKOKslAlxps^;UwGROh##T<1u!=L|FgqASj9mW|7)y5P zXONU-+!J(q?q?7ldj@Nv0ti)k(0rDfqvXFQ1A@$Yq!=xxBejwRZo_gA$D=?rE`4y% zEfvVDXnNfP*=qwT+EA`O%Ze?23`i?;2vxzfTbdad`0GGr+4j^#y-jv0pYS_UmXnU(baC@E4%Ugdy}7RrzM2{QSYJ!# zL97Y&+sq2TCynKV{C+7~B>2@4q+l$Wrkx29aq@xrRyIqv!EG0W&5k}fr@3qf z9TSVqs8^FZIGWH%s!TMe(({y1NPKx$ zZl>R-l>pf|Z&lXlZ^BCO%BA;Q%f^b+OvPYvWSS~*40c}+6K6;s6-D9Uh1t%nR(tL? z&c!c$F2zbzNIi=T$qI@10#6c>;R!?#{gqvg9&xKNhsbe;Xe$@-G+IQI^5BFwS&lbH z912tr$jh%R{F)U+E~1MRH(Y1FspCIUrZ9BHY4j(J2!c*SJ%7xc&Y|nKz-~L`hv8DI0fF_gU3&ce#Wejc*FcnV$9tQ;w5xA$;N_&V4@B2 z`vgDIf*9#VWC6=x+G1cvL2-VdsHK{GcCn7`<-iQo=q#7)d>giRj73 z>Gog2Zalx09O+77H{8VLi&t|MBHxpYV*mptc7ZwK$?#2|q7IY2(jN23m1!pWyod+6 zQ7)S9CT6^86Pt817p5JOG$yca8^d>aklRH;J2RHPFV|pCHtsw9tJch^-e#UW*?_YcQdMVNVi7DsraF@Lc{67 zs5=fe?3Mdi05iJt0fGPyJ_rRth z^8S7kK>+HGDEEeZ^^|vN(*qjIjU?A~f%FJ8$31`%*Tg>*tkVULo*$bk7!mcs9>8bnE&{DEM>^l{1Vlz%8iOAoWVO%5`vgg$ zBAMzJ^g6dUKq_G81H+ct3n}NGOF&1*&B=4fNQvfq=WgJp5V}0=@K``TDhVNf1!A4< zgha!HIEMY=RV+`BeGVD&lUn@)0@L+MNkQaKB-G3P03u!o&^y&mF7k0KyU!3-^Z+6` z$)CG}U$|g9Q~0qwAmv-#5WprMykx3@OcNXl!HWK@z%np}!iVPKf>x|A5A570AjYGZ zRq_TyA*wGM3@Qq=d;|@Fdb|si3d(Z}``OzKnf3RU_MY#ZpTsMT+PYoKBj@Wr=jX@y zKMN3d{J;Q|?O@Bc!=C>_2acIlzl`d_P)BIxFChR5EYR3HxDmwv5?-9K*TdveFV6ZI zn{4+AotPZFhTz54F5X5lN6Ycw=O>spD`adQLz(g>-vXcWjpio%r&GwO)1remmZv*1 z-Z4?j9+)L1sYe_f$<9pB%+JqI(Mib4FVRs<(@4`wE=?(9>?qYygQe3+(Fl*r*d-Vv z8v~x@>{E=8^7`}xBXiXOix?O?NtpTVAIFUvC%I5}WV|MqQCTxe2BX-w)f+Gab7+`0 z4K3fFyZU3UmzDjPp#VJVmj6UBL)qMF__BI`0XmAYMc-Tk#_&Y90i)h&fC6BEXuwmQdIU0s&p`0K26)w4i3M1x51+?=NLnli^BO6mX3j!S|NMjpI zXA62aOH=oM&&lkTRLu^Sh``C&Hn3>_s5Y)f^oCC6ZuGYHCa(WJF|;K}HiSTHUa`@K zY7TS{fKR>;2Wh4XSD|dCZE99e&w>U-P3Fr6Zy$gH+-7gr5eD>JN=}p`ZYRPABByNk zkN~=-YVU9cqJ?h%_5;cUZLbLd%7Hr$=5aky3t;ic+1?s`dEq|`ldj43Z_Hw7B1JPL zBRi4Fn;_)&^oQOy({=OKO#c6hx0xbrs{G{4kTgj6$Q9AaF!Hq&6Ef0^(v#}}Rv3Jb z%*8GyZ>YT4qAcYM zT_D7oi6ul(csNtF^4_w8RB_K%07;tZnJUWpi2z0QmrYp^g+w6{I+22oGH8mz)bh#n z|DsvJ5H@l1Q3j~N@09F(rL5$t^o(i-PvN%nWA06Xvj#}HzI@tNO@i`VW#BTn-Tq0a zia_Sh%IC{dQB(eR14GXSRmUd0?(1V<+M49I7B0EGxykm;f}1uZZkge+&8jAbU7Z{_ zH7K`pF{(La^Kd6JdL4rSz;q9GWWoo>z$DZ}Mw8Nl0KCd%`dif89zRy>CdcF>^(OgO zy-9A(eURT{=;lo}?E0L+rcSF~r;X<=6|%SsNZ**DZR-t;-j3AB26rxE_Tmz*M7kV1 z@{x+BpEQCa#G9K3w-_p&hJ~!U^AU=<;2J}(V%*~0XKuWh$8B^k1~htCGB%h6B-W@* z2V$PM4P^R-ZvW9oA<>hsfL?WkpiFFG+t$QnCfP*Y>@ z;vNdQbnD_SG01FdgT6%jkE*O!+ zLeTI5jH`ZjZ=geP{sGx%zVj#d9IVZCHtfcYNjdh9QOaJA`bp6CvFWCd(*G9EJx4(! zCo4ZYKPXE%E4?B+|GPObZ%Q3?@_(xrg;KU=vy+EAJ!LN7zb3$Lo08Wx+3Rgql=5;K zvrN9ONXWm(L9yS-zjX$GaN4E#Y`?$($N0;Z*SndgZ0X(1Y4o^s&#;Rp+}h-0M(MWK zGZ<4X<-w~AHucg+TC$wKc7@2y%5LgBWnN|o+CcCDw#3EF_5lMTi2m6c?)hEsyza!t z)I>*WV&yw$0M=bF&>Ixoefp z3{*04urIqkgq(3^PvM4<;~HtGPyuUDL2^lk(q=SGaR5EIi$tJ-J0_l;=fQS2M{fOeWM3KpP~@inj9x$%^greJi2a&mzlDYLOvYz}WOqMqbw6gb zyPGin+yDj`ae<9G01L=s{%`6c zy4y3OxP!x-ovnJ3l>ZzOlAo>xG~_i2C2%my{pFrv$LIcRx#seBT&89l6BaZ3daM47 z*{(ltzNG>ipj(Li_M{0gARFH!r&ZNnMq3qSzSr9F%b;OtXbbQt5VW$n)L1)ZPL@pz z4GqkcftkI9x)egvQd%6`7~cVF7vFWD&S6m`8Pk;ueTC=67a94CpbI1BVLArexl0DU zIKzVJ4E)ZwzP@Lh>Bl6wZ^wD=E|@lbE>)S+)TYf~+`*ODItcvUu5yFaH7_u3pN zt>{o^AJkrjUw!LNi}d5tAzfRN#rNZLKDEM!%Bm{n_99cA)0WjmTfH}Kap&JmcUS)p zMu540eP#>uhT1r8HwjmKx4BhHT5TQ*^>*#4+w+L0cmP3Y^`>#~cX{&zIOfkO?TCB5r?(XK=|Fd*wtwT4!L8i!8QGQ=>A3NH1)-{g^cPTce4C-H#xAD&X&l%l=EdFa%z zPOuNZor@}K*9hE+o7$0NDyohwJKw=fojlvYjJc1+dk+N$Lg}O?sb%o}2{bsGyD$9; z1k*XnbSYnr0aad9lfo(2MVKEQ)TTDVQDkM;1yRU5;k$`)>2P|Imm6F*>CH1N0sCjl zi&GM3sB`mM8A4FtO|uGq<{LX3sO(*}x$NxP(v1D#W*siRwVHjyw)|%Kuh+<}+jXJJ z!n8tF05Mw8fpZ!H`|ZL#D0V4tB?G0IOEz2a@+-`(ax<-yp)!>hS5tR|sy?dXp1x?w zR#_-xj7-8Vt$9*LLE4UV^GXa7l|h0aj(iW<*km?Tv8ml6_dPmWMuFKXV6x)qY`G+$N2pNzLNI-)0mzTR@|uu^FxK{2Q$$ zLU`__8X zZLR2Q2d`?A>>Ql}8}Y)UAQvCm2c9KCUygvCMNFEuDv#IaY20m>lQa6kgOy(PsP9<+cEb95Zx1Sx^yH(w3AHFLG{Q4Hcf8hnscb;l2PB zKAne`k|=TVEBN%v)P2Ur1y~8_vcSFtn7y>wB!fyEUx3B(rImp44v<$lT}VkK-BNhr z1~lN2YcNYJz6vix%>Mv2qU$<*K<7zup6V^X{6H`yvRdrB1>w0@b3%%=nJr*3$y$SPHD4;b$uR#T9k)clmWL|lmdld zmtpq;k8Q*e=IaDAc%1wHf_vdJ?hSPoljm4)O*U>9-n`9Xn&9Sauf;Y%5vk2??FNOL zul?`{pZvg+b$Y7>qu6u-e?~qakA3^x0LF9n?T02XZa*}EX>T$B{&yg_?u-MAF?gJv zSa(=dR~G;7QQ80ws3=I8CmCfx2C!mcAY$wl5o4l>Gvmx4BW)Bcv8-lezHE|>B~LvX zRL~ep)RhF|vqZ#=HDZe`8jUptOAs|1vnIOdy(#a_fZ6?)KZbYDIltd2_uPBmyH&M; ze>)nuAdaOh)GcBhAIu_H;-{ByGyXns{1IqZ*}X}6IKMFRC~u7Fz`vr&X`gQ!H+Vp= ztc}f3F?cYS#%XoVXG8Cd?2LH6N)r<+nr8p0apeV#IVon3Is#Dj?~~EHPu2)hV%r@M!S@?m z-A=2s*osRmwn_2at16EEX3peha5=U@3n#1i6hkkSJgoeS;cW=&^J4#DMAcLL&$k{o zCNecu9QI93?WyY9cW_3(5z~b8%X&J&u2)G%P7utIdgvb;tNLKr8`bxmbShs@8n^YF~a) zSs4FqX_DKYUGf*8)n#Q2C3w8Z-6mP|qU3feC7xFN`(;tQ|B68(hXda#$ZF0l;$pc; z1)M%dqzF<{@S4>z%ueoG@%>kx^-7gLS@we3t2_CSa*dBW)n=Zl@+ZoAHU{u(ELHy% zA^7+{sQ9|_u8Mg1l2vAkXi#}NU$H8LZ@;=Vvsb3Cet8_SAl4Eqc7ji^yiBWcpQ13oNttkD^e zvOWHL_zttD#wJ-=iVCgxyox2u(FEmqPgqwk&*GH188}ZNC({lKWL^J^w%h+jtHOoB ztOajes}|l1Vm|Nr6igvIoVbiV#Dz=QImcL_@o^^W+ThOR5QXIcp~8Yv_6*}UjEoXa zEN7)Iqw)&&3}3e)1oPIj_TqzZX(fx4?9jNEm1E{==1cPCc(j}ylEegGgIhjgAsF#F z>wrBsF+Z&Mh^g_Nbu8AQ*!(dw;2+yrnCwOCu&LX_I0+)qFu~JL1Xg^^4$3}ef5KW| z)aOhm0(`|`i0EUjB6LY8Q0&9KLKYP@ZYn-zV<5KP#11Rs;WZomg|N-+c~7Jt$yKP? z!ak7$;XY$3JZq*UQT-)r<;eKw3i>%x!RE=7$#{Pci;~sCu1{H@7rUr<39nQ#n~Q!W zrbLr`>^9a+Ea-KaFB;X=E=}Mr7AMeCoSSc*L(yS3&2q$6D(#%@Y=tK&pBWp9cXzNW z-khXpCJ^ON1zYA$mWM%WspJ(^G!@@%XKFraMkxNiowaq-3Zw((Mb}!OSa)I93|k` z!>p$RIOjOqg4KsuHdY;x>nUL(@yZeM{96sXszgT%5y#j-N2G+dF&VVIg3ZYk6 zFGp^KdQFkr%~^sjFJ5Qku;vG)kBdLLe7I1}G5IH^68vge zx+k=isPM&KgK3H6*3#CuaV|t+$_+~1c#9QFG2Oi-?>c+iKs?%iCa!~b6iaszYMxN# zuH0rmc&m;bljMY}Tyl@t=hw5_O8lI979{Mr$3}VMGfhYA>R>lj22j+r(f{y`Oe*Qc7csM6v zbDD)!3Q<79@HRd7;?C83Y-V<7bM z#!A+|1;b9q`Opj&dW70D6#RwK5E$f*BZUfgG>6lYJS7IU;BhTe3%M;llI@Ddmf(x6 zyFen&X-73DqhO&f3_5rdy0mJ%)e;KO5)QA+)XCAHUbj8Mwf_jjT;3=F8QzdGA(*n~ zl91CtfDp*R5N})s2SKQhg|iZldj_hM6%az&!PEu?kAq(%5m|4>yK$h#n0WX@2^*3C z#on+xanKxB#Dfi+>cQlmG5*d@Kb)(kTID9eawSQ(Wa#HbA{h_q2>av--_w!&Q{B6Y zPr(@98MZjfbhR@q@D4( zbD~T^V|VJN$Y)`ccW_R`9yz!Z&%-HYL(#aYa6S!Q@Q#ZVewdyHnb^H2m?hWWX6EOIZe}gc-dcqd|5$+WX({4OKEhohXXz3)hvEP3hMlc+4CCCuLa5P-=@` z2Eq-c-{hg>H*7Er_r{XKu~`_i;WI2spw0fLVICdvfzDsh42L`~B#9m7rHK%YCtd=7 zOirMHzlw(h#js`sOm&>H*|61Pg=UU~7Q!np!K)33o8y9);fy>LMWZRB?xUej2`6EQ zU>gG?yfc!lw~VGfdGMNZJ|q@{k=C=;0Oyn}qEP5;gg)LZlJ$H8jKY=UV7%OI@9P5b zoEa`ENJ!={+_5y+Y9!mB@gPX~)7;GR$UkKQH56}a*ifXPb14^wi+hO%V+tSu+vG!< zoC=AqDXD1eCp=r&aDyd<3j02xW87|sjqY<&_-Z1AGx06M_#K2{N*>b+ZHr;F^MsrQ zi%~xrF3RWX@6*Zb=oHxQdMCOKVM}Jx8~WC%kmN>f!1b@g#~!F36o73ros%Vy?HI*b zKYcb_b)MRx`@=E1mIYzvTQo8A=D>4`lrGJt9q8I$!Ri5xKzodMkk_yhs?Ux|jpi9FLUSx8eg>m8_T;w?pzE)#mr zgFbH6NuDK0fZYq>bOR}plt%(w!xSERWBz=21Dh;$g)M#ob;bGRG;LRw1Bb_#F}*k( zi(f2*2mgaj81`63@54t*p+@mdCD1ojZ^qAfMNbgcTu5ID!(7c6vH^5LRT*@b^+@_c z?6($Tu|pXQ#(irc22)l;Zx4%kqR1Zyegt1Ds6?T!Fk%h#ZG`Wt7eV<*dd+;Y4$jI1 z$wKf37|>`el6CS%*zBQv56d>vg4w(Ys$9*snKsH5n<2Fk7LCI?Xfq5D?rwp4AKJkd z)Y1+XunmeqtK%0&w(yCUZY5@JBcJZCV%}I5I7IsFcV2T?(t2>#{9-FT(3iXOswRe-1<`F5b8Wvs(877g1V z!biFz;GZlH!`s^-`A>5gyUI7}De*`j@sew`*Tsb7rJ2`FM8ZyZ1SNL-#~v7hCA(mn zPl;)Kahg!Si^`6jc0*)SQGi2tQ~&JP4QXnvRuphr?c_q+#K~5)RY8#hwCxMfF?_TK z!X22 zr0MNhoIEiUzAfLXu%sFi(tYiNru`5eEkd-Grx@e1{m?E{7CO!FO?n$X zf0K;h7L+y>R@Ff?!vl9AJWdSLoNqN1>di$3cCmP3r?`dVt%cS}HZzBQwZJtIJ5yH= z?QwWLw3bG>_0YDJ^BSFV{@0rdq#iCKoyH}zm`Y5d!abg1lZ-Cc)93QzdWe?jBJV+T z3zvzlFsI1HHRv8Bs$Gf#lXO`rt$&T1(Qe66KD&_rya#b1PPsYPYR(g-!f*GW3&W%b zu;4$(6~)i!4y8bNoZI)3d(lho2^t%V)47v$&X=w&FxaB)sv zkf+555>F}3Er1H$$kPx42^D8nrN*b_mOzDt^3_F3GV>~na`ZDYi%as0Dxng-`HG?- ziHh7DeJBl;Y0lSe-kjgQIiGR+=6t3-VIt<{3c9HksmTh-8M*l>3W?f9g6z!O)p_U1uOMhR|U#h)9wKq1z-q>|TE9g(|oUtqRf~ntw?gl;r z+4s8@_&B@uLecjIuE0+$AIkDOVsh)w1OZiVybo?DrvAVidN>^;cRcjM5MGK&Ai6MA z;rP93Fcv*8oQ%Ee=>%GtVB>e*8$HLwEea?Nu_W^P_QaGj@jf*0j?To=^S14Mr|}aVF3*G&dNCYgbG|w?7?VN1&{D zyMOlP`20-NkA4wv>!+vnqqAR1I0UTk-cMYA!eg5tTv+CTbGM_q4lvvgF1O_kM*|Ov zz*LPLfAS!LzBp{2Hr@cl`m6ne{j*>ZzqI@CX@pPubE&JXIR;^h4F z*_tqsvl8h&GhLSuWt0lX~N)`s=1C zAX4iUFN-~Yz|afu7aH)>TPOmA&B}}KE=#2hHUNY2J^!ZAo@k7@gY_}Hp$|iI6ux84 zO6HefDsG(*F5p1`6Eqed+%e$?OpGd85n>+@zNZoit=L9JE!~Jxp4t09!7Gv=du4|7e|n<;Itw>c7q+5`d*1 zP=YN{xN!k*?kDB-%ErrL24+7-1#q{Q^)}}%{j!X^c=rC~-HWh3d;enP&)&gU`HSpf z1hh8}hT_$D>IdSDm=HB@c;O1fHpnmjv|7h>H(>UI3wwh;v{cXU1DATAn z-ZVS#U*o4j8xhbSbOw%p%9*$fcKtUI9#6eV;1vT<#w=3+*@cpPMPuDcT#R54&#P^IdF3?>2iHXj;>T zU7^nPy$tV#fpQv5pkg~S8 zrMiv}6e6-Xa>dk=Jm4efs>^$10xKM1WB3E%zorvzAWo*&1Fs9sbzL8hF$WQ2gwMiT zb9l`{r5ynSv=8M?XaWFW9SO07=u!aQ3A#NN!3e7rp|8jSO-xN5cs&%32uE%g&pr3P z>r!#WN6qdwuC*jK)|?nF!!eWXXl4)k1(am$j30=(Ll7aI^)PQCuqpO37#=~9bpu>a zGC&BOp=-K8eW!^h?h!#CtDxxC7%4C<3A~iON=1M#$CGNFb1ugT02c9_X&k2zE!UM3 zF$cwP_`?91BzNL?gOG=ed|n7W15S(13*d`fpi^)|VtTX?bpeJ$q=#sfHG@0ANHKp# z%O!~o@{D~XPbJv`@?Nm3u911W^9O;`LxvRjirdL#v|X*<-Q87g{Anc^-&6~!$ z4Jx;j;Q-MbAOzPiB%e3V9S{XXBZFW52M)|1i`o@ zUco_!6%OlSeRE@Dy}a=ZDc^akUXdrJWEr1-D}b!-AMKxI@F{#hIc=Uc|EC~1^CCPf zC;rjp60iYAKqs_&54eS#0;0M)bk$DBM{X!FTY{}f!ajxjfNt}Wd4Iku$lAbX3}HjM z=K6reW7iM7J>)j@mC=`G}(}1@l>v?b{G05z8xe`{9*7@uD>AV8+)x09duUf|k&9i2- zOngO8PLE&1=V5(c7Rcb!)|=+Rfkb%vUdw%ySV%w1)oahMhPRKnJ8&XSoH5|C92tXX z0;=(Eg+h)LYG?`eC!s zXrvQCIt-jacZz(j=yp5TK(BEckWYH=jl_E&R|m$i}ITO4&ScFuJfLL()j{cCO2cvQSB<%Y`i%Z zS=Ie4fX=m=yCNHYRavWk^%Zb+U;UcHt3S{}&k4(4eU-h+SZlPmf6zQX+dt3;N-KSt zc%}A9Vi>#!4j=ZR6zGMLWrP_T!m9AnIAJ&)((4E2RIgpwq@g<@_R9~wYuF=BAMZ9- zaXORi(`7LqU*D8Mu*};6h|fta+Z~B=Kl_-$--kcfvcnJN_vv9RJ09|H+=DZwLCp|v zYim+s9ijK~-9+TJMu(sB0#z6W^3gndb3C_P>kaJxT{vSqd#A^T zBsqs4vs*qs*zMF$8*lc1Zq6>mOmL_5%i*izgBim>*$9+qogN>bS#(5lcZ$_w)(vb3nyrGKqV2E3oLCFhpnF*q+KWcMY&W%6q40?1IK_wEdkbDN$k^s8bXu!)xBg;Sb4(hM*=E7g- z=F)=o3LW27H{p=Fh64|#p_u^dlmKXWMgZh)*FHSX#gHq9V+@gHX{gBJf!r0=RiK?y+&o|L=(+?vJq&6{_y){$_dSgf7qp~gMEn>w!)?%0 zYX%!;V)cS4Dv&qoh5l7TIC7))+z~8L*db^g2@Q4~7U>L~8?U=&tNyY%^P0)d7U z+Q@Uz%%T9NqvSs3i9Go1=aOs#`8li~?Y1=UEAOq6-A!jVXI={A#Xzbu9np911YXm_ z>2)~qCQ`bO($8CWFoG)sS_1$*nZn%uHVshp8|Un2FucHFuZmZ2cMS(lc#F3tSUkr_ z0=X4Dd7$9|UU?_Di*XNnXhhQsrm#!O*eLdIGKQwZN(MUHp=TZHaxEWLFAD8;_9}OA zad~-BtX^DPY*cUZv=LDl2}Ibr4nDYSKmnscF(E*Qpp-%|0qv}|_GXHW__4(NygQlQE)CJWf zKZ{RB{vw~pKeB21IlEQoL*T&$v)lE0a8|()a04g7HIio-y9+#mi$Zx+q++MSj30Ec zgf+@F9NQW;!4xPa+)5%lJUI#`Qk6u4el!6PB$^svd)EP+#-s+hQv2D>GtVO*RPZR7 zhIs%5hYv%#(_-D&-o#;Q;~FKU64(b=uLnGNVo-@U@B=`D!IV!fAi>V`zSHx@mgEt4 z2W#!>WKs8?bb?`k??!NCS860y5kV)g2rR&uRHxX6qi*l6Y|HT zR`QBLGHT@1r3F>|aiPt^yGnR_XN{~_onFsFOm$F0KXGot5>0%!I~}r&i;uD?T)c3<5FWuq z!>p2QGl>hRarKor91#i+99|el?J>kc;V@T+fOw7Z*OeAru8M(k?G7qNJeM|;__wT@ zo}svyc?z7mH(rP$od^^h)-~goJ7bKj<*pxtH-B@b?$NV=#0k#Ul#Wq zFDkvB7`P5m6}%SX#cb$|fo@1$InaK#)^LFh!aIt~CypZ~W5pdivFglzhR*5#&xE?tZI&8^a*80Uoeidu@u_|me zvO=bI9vH7nd=E$T*H8i>3{gR-s<;30W92eOss{KEZQ)q`tmmACO1wNQ{ujVN;y3(q za1I~s-DazCx=$)6LaSC8xa!x<-5)<6rxNRDdVtf5Q%}llv@6rbI(&wvGW}>XCHt-F z7f|qDWH6)*lNB|~5vd9zC0iUIAnPST`u$C24M@E~b~4PjDvphNgN>l#%CrxxN8NuA z(z2KeS;jO30!@>z9cf8sqg)UhdY$)4v+~Ytrsc%Ht}ysC{s}^<8>z; zI8%{(d+$D&dicWBkyF<}P-wD{z)Sg;Z50ss@~~;Z^z)glYXRS))|Lm>b9sq?L!gIS zPwo&j2W-WS+xropSY3IJzaMxe(T9{#RfjjH#B4Qj39Pn|;Ibs*ltF@e_Eb=WPcwimfI}$>`X`}bIwD4! zOhrXaqBbIEs7LiD_d2!Py{GhhGqvBUZilzpzoy@@M&;H)4t$I(%&PdlCN|}LG`Ehn zc{I>M#N>`S6*$Q*i^Wp>%pmN<54oXurV43<2WCW94@U!Ug3YiJ3|MT_xFoQxBANpN zV}&!BMh?;kr#hy#7_bM|RL|Z{9bBSk#ROS~tLMLxEZfZyPCa1_co7Pk)MQrpS#Y#lYZaut?d0VwuA#1=Y6sz@7^Zx_HpqV*68gn)^S%b~(R*;}KDJdVVXl5J!j zCErK}A#{U5PFBj1Lb9kd(lcN>WzW%AALYgD;1-c9q6kuYXBg2J3Fx42=;k)-VjP_$ zT&3JbEwAlqF5#y!rpe6`US_ZI3+BJhR&GmN{@?1s=!*bPhSBh_($5}$SR&~isvuTT z&V<&~G_^x^QL)yB&0ZZq;wp)W8m)v-0#h8qr@{! zqA6+bhKo+OQH?o_0%$ppeOH{HC?G0XY+(^re-dm<2N3Z+)c?U+5Bj~_g3P$vCl^H$ zKfoC5G4Ee!hPPRiB-lGz(h{sXr-^1kf-7DYBlgisUVzj(1uak?Hl4ubOyAIPq6VJy zfpBg@Shx`?NR8i#R1!tUZMUOj8F6XEnY@!~mlq~RQI%ApL0EEbkq<%VgX0ZIjexzY zWz|uXjZr6KnaT5`FCJ|uy)1EpQqB7bYJ6CS2J9NjTE`E({aG`rZp{TYGa!2r!aisS zooafBq->sv>I5~@NnJ|lPEbLmu@a@iLnAwJuF){zj!gUOr{seajM>#meDFv}P8ZS| zs(t~zT|gkdqQ;3*Y;I<(R|GAIdv!@JlEwt%QNlL=_Kj1YTxcUb4R1*#--%tGMf^}) z&{XX9ZMQ)ej;Fz5mQbD8d`XG)u-499Y6&J^N}}&^w%b;b&BaBcZ=cf7OEcIAd)Glx zLmQ=6qhORW&C%P1jRTUJ%-6cYo0D(93)Ym7*(Sg zitC+HCUGX2k0ScK>%AY$x|${rgE*O6d<;-83rL&h(ZE?GLjicgX%@L)EIR;clOG!f zv<{6&Y59`OW{P|Wz{F%)e39Sis4r1hqlBU?eW$cgC1x~mJrVE;3&cMcIlB>gZyn!A z*zw#A+11bBFWCh#e}qQ}Yuar|Dhlk;%*y$oeB)3*hkFgcDh{ZmG>h1ixENM7W$$Rx z1134{lFB^Qm`7)3iTqEEK9iwZ^N5i2=+xL! z)FOB?D&L-jnSOK)wFlJk&-=U0&i-EWpvA_h(iI5~HgrMQ??)u&Qdf?Yi8_gzYBD$< z4V*5^$<<09oJkNs>L#w!LsHh8!qpm`v(bhCwI2f!d~nCYxgi%dKfy{f1e)|a`%V)n zg%*%jv#h8ie%+fe05%*0=xC3|j0DN{k;B567d^f-ZEGb-JE{LGsM9y5OKIoGuGQ|q zr%$5Z>NMZ&pA|NWxS#Z^THX}PYqiW06OC@SZa5)lPI9q`PLqP7xUJg={zN?nJl~rz zP?(JE%oBz?Uu!w{wbb9TH%=N&`8=JbR#meLlPlhwl+WLZ_u(xK_2jsPhMlxkM`OS* z$$XD*+==D;h-Lwk9tRNc`l7K*w)u!0?xd0_Ono%utE9w=SXVC>2zh$%h;35ar=zI3!O8GO9zY+br!sk%z@>2T0$}wi4X{uV| za#=2`8^~(d@EtDV_!IBq@=XkvOnvH^Y)CscEoxXblvdk#LZRKEWz?rE{QmId_x|_H ze%VzoliL(an)k^CvMZ--+<(my&M>L54D(($kD5R$n!98b#&#C?jn1znttkvI_*z-j z!L|RE{Datl3n8+Q08f8UQG7n?e7Ea{A%(yQGH6Y&LRr~1^8**~#g1e(#-|LPnKZK5 z;=m8&)Z%I<7Y?%^heH&8I-++{_f>$>H1U2~*f`=R>$?i%vlShT6!!0Z9+46`c2tKuy_I1#EFmX)m$s{(~RdPW* z-)Um;I{Ldi4uoWn*sNPkMwfzGpb-i*j7BRQ8Uo|R6v8QbiKrUrU-_P-El{dh$ymmP zeDE5Sk(VNi-%P=#%Tlspfs|28R;NPR%>!Ub3uXX-cl@?3Y=O6j%~lH|I2;_m?(FTV zLa>EMcnimnH>j;=@W}Zgw}Hn_y#?nBa&OTx8=2L=2W%6W`p6+=dZUNdZdQ)D@NeX3E0IPz+36A`YC=t(*~*ypQ05;*0_1EdDl# za=wyI6nKjv*U^xmjTvyUgodDaNO*<|@hpkCtF(czv937wSH{gmy=BaprF`T?KR7)eE?W`%5Wz+i8sc(hrAvb$%@~S6cGQBpQ zN8Ra|Xk0{GjG8`)LUtR3Ou#L{@}q)r&9Q z=K!p4e>x`9D6`J!u*FNOXflT~vKj&Ut3x_gGMV$xxp85++v}I2ts{qAW?;PK+Y%rz z`A^V4b!C9H!iOckh+-TXEc`PTR$*OKVfEXe4zKYN8maLc)&S}Smj$}81=1D}E0RMQ zT8|I$1iW$439Q`13O)CFdLt`fNDOk&!$A*$q~KYJcob$br!J8gC`?z~@8L^X&cR=0 zpr9WrS+z*Aqqt5)*Wm`k4zV)qjkH>dKN6Qky)`U>Y`nG=vs0uzE@t!!G8rZD^Nmee ztpK2{vr~+al*z=SOwNl3%hAv{s)g#XHX?soT*>s9l2&xOk{#xY7!Vcm4Cnjqmi9T( z;`Zt#`sS@?tcVEhjZ4M98hrYM-!Xnp`DdY7K)f!odz)Ur><-68T30Ne#9yp`OZ9Kl z>tm^u%8YDSyGONqx;DM3ZJVNu$XN6@Dq3br!(ZviZ@O}X6cG#tvQ|`KftshM$ESt% z)W-;#94g3JUY zj}2^7&K{}uSxY&kwG;szS|!0wC+G6zA}PpxAnHt*d6GF|GazLqL`1S z2#feoZus6Ep?oJ8abQHvt2(jq@aswiCCpYc3d0E z4WOaaLj+J6ddUjvJrUn85vG9QJSkK`g(@u{V?fLZGk`BJ)BuU2`Zwh94xorkKAy3h zWioa~0RQw*Tx4^y(1kiwH?m?wY>JKNR1^#8GFb^$2|H1&2_)MtU~Zf!e^Ayr)H;f# z@V=7|zxtJ859O~!8MV|Oyq+tWr~#dDGM;Feyz_DHrGW{?W&Gfg)2w};O$7gE_FWWm zk`v3F?ZZAls~?^eMNUpA-u+Z~Fim-huY-lAh%{FP{2+Y`?ENWyDf_^`S(0=f(Z+9A z+vov$eAe6+ja$bDHW+pUtJtg{?b0Oz=rA1KgCKa1E_vG55CeEJrc-3iOu`rlnpj<3 z6|b7F_mARg@mU4}X_{aOr+Ks+hmw(tn$b+26?Q@h9e6_Fz{LzC_#$yBzF1U>xiKl8 z8j&Iqk0Lc11@lHUm0GOHUj8EKO^UQa25@9~fYv+WEML1_2VY$~FaqQi{`UIh1h&hB zk(NaWeF6ew0YV4_XXxF-)5dA_V2|k4!CpDQAPVRLhG#*`LxCW9@r-B_$pv0z=^pS# zE(sPjKL9NO<30%)0-`kmugFl$)HgZb+!G9%!8Tz7yy)Gdr1F}Kp&sb+h^kMNp$vNJ z>WNT;ACWUf8j<@gFLZRiD0+ztrhl+03lyfydZ%buF*4Do&69(Aqsj89y`vV9F^c$Q zgEeI86E&cL%f~2v8l_f%H}Q_(F0q(QE|}qXqY3IM-%{+nb7a{kKy4<-vso6Ihy%F| zf!eAPnis$V%HvBp=P4C>hPBtma7`3ER|I}qndVv&>RMir>^wb|v>G1EZ~R!3b9kY@^Q+TCcy@ZoKRDh?p653& zgAd9c&EhGv!?z-dEF_FZ*O+IEgTlix#(%YJUojMd7k0^JfVB8zr%9nG;m^wGamLaA~_fsJ|5|fTn$Xd1& znH#XyI6SePA2NX}D=T`Wg@$wnYJBqzzOi1sdnaGL4q|m)AImp?b3QoHTCW>_lkeb+ zgN5_Ox8Fuf?0x%fv_$N+>d;%D@+gx&bwgk`yDk(nrA}2TqxaBjcbVI08wMP4$<)hj zD7%iB6W7!?SgKZH8_3p1mIdr=r>K|On6RmJ$1`z8h~t=bo?N+EJ+~2$hM0_dgFL=w z@olelg_l4>tr7|BPP8M->H@h9bLw8=Fd1FEtENAkcW-(4&Dj|PVv z76*=3f?DjPsw`C@6gq;n7tEzp#QcA&)(YE`LA#UY^W?nsrtmsYK@jVwbk-EwuaEIg zM(FrDF!5dGrRp-JJXwR_Jlo~_10c2X8fl7m4tA+@L4o0@Y~;ZY4VT1Cw|f&~i)Snau_MKf6CE4N+zNL2{2G z$Ff^hiz2@>x<)o`JV4ZJOXK7gj@6xEv!|nDzI&%PbBwxL8#Gc{=ww;?Sut9j%s}Tf zx`(9KZq$(8lt!s^tWkVcj8&)Q%}hdFF-2V^~<)5x(o-- zC6WUf(rVznR}qR(#~zGS)MtW$5zATTgH|y}IMDhK0|TMo{+v-^E0JNDb1tn`q<8YX zNz_cQtN3|SGrex)?2C4DC2g+hRcx~HSuqM+IpPZ`K4S2(@kASlzEn*_o-Wf!bl{OD zBCmwW0x=u>%G{Wpp&En0j(MYKA5_=jS?$EGG3@;xynbBi<)UnF5GHnIG>EY>SEVZY+XgRGqmjW92ZkPBZ21$3L{ZLB#WiM2gAobu!IsR47_hSu|@Wby|le)dRc^@MA==-K1j)rheljo-7ZQHgX{* zk+RnSSv}O$BvmNMex)f?aLF-DrgX&YcA$Ndi6F<1&?_b`YsRSAxgQM zobjFKn`BVdRk6L>`sENcmK3=ud>BqA-T=REU#1p6I&ALlQ6u`7;S;$3Q6W=c|8>XI&v;Uw=8sCrKRA%04C0x%xgw$tXH-! ziy4g`@szz~882ZN^rn)8$pad;3P&e*MszZCJEo}BxmiVOejv+41Q>9fM-pm1Dsjfj zs(7XIdT9?jv|B(58|x|?LzB8=+?l~_|c>L+aSwI_e9Cs-TJ(cR%_ z@*o^zYr&SAl)&qneIEg8c?jL~RDakt6d}+VK>ST5vw|9;F)rG*CW^fW__dZHzmVD#eRN13>IW9Jblx1pn5Rhs;vgm!|0Z!FOgwlV$9NFuAqdk2s<1Y{|Q4;KoNvwgnWKH%VS|33w)*cx$6VA(nUH3$zZ5TPyQ1h32ecC(`Glm9b6iTzs zJW@M#qF0Tjj*e_EISw*ZATuEuEyWS*tnehaNHoX6`Zga=YFvzSgIbamcc2H7f{8d9 zHup3WFUsz3V%>~k_7=zN3D7|3E!j9Mwwxhu=+Lbs%Qdw@B1Wtosn0f}0!Xris+cuf3pY(_n0YZaDhFoAL6mnCZCm+MI+)&=nIQcGV~SGZ+raQskti!f4ab?22L;asDWlpiIl}K zFU<;&4XI68zW-h*RW#FAsMG6kTG~QUd{hbIH+LQ*78}~?I7ar$T_kwAfnXuwWMEGK zgIxG5FtSheQy>G=$ewX5U~@aNpzac_pVp5K_FqLI%xyBQ!T@hTkiWck7A+#~A$#rC zms~sh$WqYlW@x(^tSVKi%a8HPHkE!LMvucK4<>7qrJYJk5o$T9_TixiHS^4fb)gsS zL&6IcY)1q*_Fpu?H*i_6oq4)UFsIOQE9i= zH#RS|ke{N;IAcyk+rb>@DDCdm^0|+9gU7OdAm}&h;nCS9uQN$XsB25Y0|Gmt_(Ghb z_$iI76~(IjDxO#FG5#|*Np@$Jl`Pyco>PKb4rjrsY(|6NfjDjz#6V^$(lBH|6}YEJ z<#dTdkBj@4FPN*t+e;jrsU8K3;IMo}?2_*h=8PYpQrnySsHqID*vG?q)4?7b z|AOANowNGs>*iS*s;@tmXi0HBSMYaf?d6NLGEc(GwNLy={%*Iw+aRy)m8Y(%WRp8+ z5jq{wv}0=$QY4fvN+6qF2ZHA zjhEcu@pfkMEb|-VDp(<`<>f4<^Ith;$x--*2}5!pft29&3eRBI#+QXG=*{DdSx_PzGGNVaXEmL+Cdg1&niW4tnG`A0!Y(S1B8PW{PoKng`ruR* zyJH3^EG>-`#!2Cy%CA^hKHQ%Y)P}aCmh%2;ssA&8@>uLkkLNGj}e>hhkd6@D>(m znH2TOkX|B(*8lcVVQ?~8It?Wyl>}zt zItZn*19n_3f(G%)wYR1m`$Y~qVoRzna%nS#jQmB8-@{*6%}`vZT!HXSuQsbQ%V-{l zYeF-2ksIT7tX|~8Kt4bwhvLtOT=JyLeY6SbV>UhvKK~M$uv`+EIC08wd#>(y& zp0qy!8I~Du#Jry^``XL0fqzM5&6e1`V^MzZx}(l$?0tYs2kJK6u@CF)1M}Xa(c-X) zUn&nB%%D{X%*a0n%M!4@0J5b{=)Z5*{ddjkGRTXzu_z)nN3(s*_L#8>EjEo4LrZqH z^-D`?k2uR~eg9qI3E@s9LwkT3*M%d7p6?Bvfwp8Jww9S)Qex@QP%>O6nI2Fod#yK9 z454sXyu(xI>fm<*BJ$%6{p1l_qZN(efzVO&u%LuET4I~lG$5)2g? zjC<_UF69S~cP|DQNz0!)1BBh0nBXcQ=SEhJ(mk(FSy(65z;G%lKD}JHincC-29$1* zBc+n7G}_!EJ}MVqN#4Bsj^x4PmLDltve@*)kk5~a2Be>2P1s(F*85s6Q6(d>TTA7C zt{>Pjb_?x9m5vUts|aXka8~zL7CvcJ%h4!!Fa_yoh)^gR0jjDP*!Y_{!^5bPbx^d?Wrgqhv4o9N=Mho`X zG{!|Q$jziB3|w2_pr%7CHnQwh2E|auZpaZYw#ulGXU1Rpu=c!O0?F;X=%f~3uJ1GM zXUmNC-HWX+GvL0b=;gm=0NDtI%Bsr{^&o=s%fXY*5VNSa7F2K?Gm48J!seyfTEY6OC6;j7>(TtnF3P^Z6eJ+1}dC*-RS^j38Zz_E<>A@7wcNm zOYstVJ@Vbw@uhVZN{nE_XM>5B6wgX1!zhrg2k#IW0$1v~Wn5MO#bH@RK~~^F;!%MK zh@-y^N@94Q92)r0p#eBwSpA^Wx_$vGifLQIq&#N`N3JC&CgX- zDf%^|5G5J*Pl0a{{O2KEA3aVyR&K z0Gfh-@z&Q(&feOKiz4H;(478_acu1E|~CiGR)9XT*E zT1~aHLyc5fn{LC91|@c%R5&Bzk7L2Ji8)r_{NPhQU$h=D_!u3G4fxV7BclMG@fDv2 zK>6;jiK%nYlMN#{(slDvwj}9kvKce1?Xn*{CN`USuYH5CVMYTozC`a)gQy&xI0aox zGHZim>w@XnLS^Y{e(ee=$N?-;DdNeN=cxYb0Bt!MKcz%ci*j^US-B-~&+${84x&5= zy6@%XwbcQ-bRy$(7TV=<&kIqMQcjeG(hl0=qJ)D8RbfbRJg>*D^By^4?D>Egr(Vb; zkn!?9$1wzSQYQpJBF=k1Ko%+GHR)_JGKUz8xlnf`otiKfk8?wevt+EbmeVLdaY1f^ z0Oc~Vh#HlQF;T&T-E-i6x>mj&P45XG<)wiWmf?EUU+t?9XcT({xgOdEc{~TaoxE+M zr94V#XTk!Uo&M5kqEx~71r@FRNnN?3%iOi+S7m(fgini(j}MGP^I)(1Y!giu-khAj z>+IKGY~g*aS<61#%w|@!9Rd}6v6WWv#g-{3wNA9}W41kLX9}g(V0OH*cmLw4)6-tP z#3)H3pF7w;Y91ZuMONQ*vVUaO;zD#h0XsMTv@__XkiaKR^2*w?O_Wx!Nyx!2hKxJd zEf0E+qC9j5{b!rk;m{jp@hw`9tR3-M%qR;*eOeY-nnfYAD!kabX4pw%63e#WOAW{F z*Njmt*>}PxkzxWvSTzT=GWRcEba4B<$8f&aVQ;Mr%lJt>1?+)M`Drxju9+Xf9bC_? z2f(6*&%RqX59F`Os1M(PGMTdfS=&3XcePojD0PBqO`W46i~M3Z1ZdLlc+a3h9|~r< z3@)C5qGn=l^+-*aetR)^{+9vuY!j+dp$I%&pZg^`g5{zWaWR)`xI<;F+Jur8aWu&M zhv%Ei|A86jg7G<@jq?igc-J*T8_#1xdT(FF`R0W^EWL>Fag>(tY}U$~_?wwW@}Z)nr}*dqp) z%_J@Lf#o9)DvG>lSPsriMzuIG4xC5buC#T*rzVPriSpBsR;mjf7221VCHzy=&HxeE zY=)Ei#t$y7MhNKfNkl?@ua3`1MP|+7>Sv=G!{CO%usvWj9kE$?Sy?X$_of?)jS7iC zeHV~*2VL7~b;!Q~;Sv}<+16@k;We`wz{10th5xa%+E5PbG*0p%hP1;>>cX~pv?&1{ z{PE=rM0;!O>fbzqVM=MjX140G(9D)i1*gw)Mgxq50HfQiY;K^WTqPatKx3Q2rF3-| z!V)gREKS5jihUD?t73-S7p5aW!xi#o?2aUym`QwunTwBtYM8!TX6}aA1HFng_hO60 zH^w7jvl8(^NpC-$?LpVAB;ylJ;53)u@%5C=BjN6Y(ZJJgOj?9vUkD>=k$Nn`N1C|5 zuHt$akLXsRehODxN`NXuV_`0p`f1G>KgzEi-nZTH^f7ix<~*bu>T)dYGRBF^w1S~a z@6ojmU7K~dZ&_J}$Vs?KDcIt#lwnC;=j2Tt6v8z?cZgnIU_2vN5eGok+^71UMDq*x-7y zmhoM0zhTu>-zD)M%{>;AsSzg8Jroh!)~#?Xhr6BQgI##kc(ecWi~t_-P$|(mDs#F9 z9SxI!BB7HK>CQ$au`Q)Jq|~NYWUNfzYTI#HH$JtZ^2jI%1d1~LN`bZ7=cZBik1L6> z)EKe0i0WLioaB(G$mHc9BOI0uhr+%cU zL2}ad$obJ|o#Kdvi7fC!!z3iN{cJAn@jow=?_zl(E^>4#aqsx#l`5^z2RjRR+H}_7&DN< zW>Mvnb8z~}$Y$br0XGS2+vdbegGq1IIcFZzq??!rWvc=!7@FYK8d|WSW zTs(^HuXFL$6Weg?L23aCI+&b723;Amz(t36 z3nZ~~e5uc#Vg?^Fsh8J#WlA$El3g|$P%RQi?S3R-qy}7zu7UMyGZVQK{UsI$U=s~E z(9BubEk#S1TYvPP0u)pG-ScIH|HfnQ8Gh_O+s<9)HtC`fRYobI`<#gGHqzziP*ZDn z)cY6a{fnr1X6)FY2(Fk8818Qry0w0=UvEX@lg1Akk$V1okx;0~rYtvC>07$wsV)-# z{=8#-&QUJ)$#V|!$guw9$9N>vj*gf^M`<#Sjyz)*M@URPvxzz(`BZ@t}=G8!Q1X|!|8(8jGa+8Lv*7VV7e)FmiqY-fv< z?fxaGW}+FBF$S+lhxK=zgXU3YHBPi5xn8W2DWRJi^`qmX{YL$u^X9lEv%ajdZTW-} z(BFH*=}-(@{|0zfOt>X&+ShYU_yT0f;Wn*mymHY`dDAAnnO?(zEC0T2{HlroKY zwe<{}X|f4-En9!p*v*=pY;>K~H~L}N3&P$%Zbl<{QzykCWeF>>`if)PV1`fhW15c8 zxO*~rfF;A^T)nBwM&mL+o9B~+QGzNURbVGgJtDZ)c3qbuA8xL%uZ!ykXn{lMg=9sJ zZdL3oHC1}F-jv*FF_I_eslpI1#flJ3JZ)eXpdmU^F_|mOIBc=sfEP+YT|Tgs_1FO8 zzDTwVKxnfvCRnL6UEA2)eED*R!EJ2*M8O2FDK8`1b}1586RJ(3|PF zXV0w6z9rAJo;IylkqRXMALAqry@?{Oi_oSb>**|oXo6|HG|C%jrmlfvR;e&>Vb13a zyu7hvjjsD}gQ6gy!b4b^JN(jhZ@OI@joy0xclTA~Pt14`i%^n|hQK)Gm><;oA9f%N(H7G|| zC19z>fM#&4V5U%mD!>cfxn^p0mLexIx7G?_f1c7`-<_cR7&eHqje)O9s%#=e)`y5hZ$$}iZuaEXA!cJsyN#?}^Lsq)ZfH!LD3)_6pLB0R(Bi}Oyi?_RuE ze`)m~2sbV4bL|~u?_wYp$F1tZeGmcM*MN7&74Zg6anXGL-o;^v6HFBZMYjx^53blx34?4ZmB_Wx`=eX&&$`|1o< zC#}~dV0;YQ&4(y)9AN5H78A1XdN6{`35S}ZCwu53N9krAnS$2F%DJ4yi)Syl7|QIe zOCwLS)Qy%9<=>Dg>&}>jE8CD}ZDXxC^UR-Rpel7u5u>x216$wRT3@#+J%msLJs`Tl z^A9iR8$8;oY)DlJDFJ2}lYwjdn6>eZ~=ol*pi~f;f-pEqnEH}=j z=-D5nXx1dHibG@rEZz-cWltusFRr~CWWlA{fdV;b-*%>Io|2FvCnGj~lD?^y6G&vE zk;Aa6LCFyDQi4gzpNTEtCtrwf#Y=&4zw`#MZc91y-TEp^_S7*U1o@`bav$lljLDxl z87%!ITe$G{@lp4CzaQcDm20xfn2Ls(`N6>02}<^p*-e@+4JvkVBxQ>ivMlJ<8T1vW z=X8X(HM$QtGSJRb| zUC{~e6el>Hgff~3odT65_Dp0pvSM3gD{GuMMfKF`r|w3bSrzZb$Mj4NdS~-7-*?ap zPG1=t-+W`mB4Oqmx^9J99Xer%nq_AQj3k_6fGU`T0ELClz+4{HZbXMWnfG9*5)&v; zERh4I6V6W+9-ppgbR)v`qA2^4CnMfvnHic*ls2yt^i+j}w5Z~Y`gWpA%b_j3bkT}% zViooQHApgM_c|Ry%q$=#sIkldc<-jmgB*3W|52*{W1_9aqBx350j04PiMT{u==CKe zaVf1>`inQs`fl^IvwN`DI9i-c%`P1=y5tuyyxySS^((iRGXFR0GdlZ6jf3;urdAe2 zGwVkBptHQ4{sK>qPnt)aR`Xy_6r@^Yf3JLYdfqIF=qq4q;+DBS>tlwgra1 z8ccn>nE18z9scbHohh($W4E@Uo}hKEe74EelzP~PkV%AWm)aAP=RVV3r8~IP4ci`Z znN=AMiXXy^gq7PYtTBx34cg1oa64~Ix$h+g{g7FOQ`YNetXJWr=LPr*>jNxtdUmke zd3|vFs(ygW&JkL0BkmsX)0LG-5t^Y@_ICs-0eRor+MGRnMzyctadI zc=CUsTZ>)sp#Jw?I>)D-qvN;80;$kiT3ARyg;@C@9R@rrqzjo+KsAcUqJ%{iu~x;o z!5D0bM$EuzPVh}~G*)>zcdDEjy`DV-Vh)f+fsrlwu;>m)_+<;4a1{6` zrbmgA4iU%k0C8)R<33}9980gz>AXHVZ*)4O)GQSAZ&9m>XZ%n;I@~{k@pi-y_@YSB zG<4w~@DV56@X-jVP!yexGXbs$m{+&cDHLFQ@?0up<;6N%EEae4R75K4R1aI5z;)^* z5GslZ-R0NFLa8Qt1C-2(!g|Txe4pa0RNP@|`DwNm`izHwOh z-9n|RO7Bo+qa9I9vl_Cis~dU5a*1UsWCbs0P>W0MW9w2BIZH-zpO|NOznOS1(d5(p z8oYiMb9R9e(avMkRG83;(pVh%uHxX-AP=vmd9iB2g`Ati}_0 z3mwaVw-&p~*-Glj>zd&TBF{UBc5`2L*tlGmG0Y0^=Mp$sf7nmZT?mcBQ!T%*U9Dw^ zK*?eN@eW*^I)R@}yp|vnk3;EtXo*C%=4^ELY%{Jwi#B-xO&)Oc%DGKOlyhl- zqn$mSMb(7*#-I3Cdx{zCkc2s7d5>WJ3OEyWi+OF9`tS*3x|`3Wu}t?j>}rr?9ykq;8eNr4e*5hL0Js>l-&%{JNdxa$Veh5L=9I`g zC%>UYY>oACAFfoAK>cF60K@v^2gNi_DW!@Ep*WkbTB>O|C5w8XW^Ois+5L&Ja#pt@ zZlkJ(@oA2LQli!s<8P&~F*J5C5g#tA4+(JkX*$fHukb!x3ceg;dNbC`nXS#-cZv3; z>^RQ&FP0xin0}FV75EbJ<5(+}>{wgIH#)~l2gBE9=@e*=q+Dzc9b(>06n>QhG6oAh zH2!jYH<*TGoHf#RQ(BFJaZQ0mwhIYaT)@!CKe*Are#Zj{+hbZB zy8Uyl;$g0IOX-&J7~4VjTaG=HnMKi4CgR7Ii6$qq0(a>10t!=VgC`Z1=J+wQ=lJz} z_`c_vw0Xx+Y5sLE830yG6*jF|`9H_I1&(+B=QEe|nX{2;uHRg| z;J?XtZWi)m-G7TC9T$7LuUu?G=R3?LCqMQi&2cVXL_5#LTTYgo-~r!0b7pCNDe0OE{?(TD3(W9Mg0KRp14C=02UIVQ8uo2M%_%y zy+}n$@(W#v09(VSZK8qHS2STNia+D+o8IK2G&!!2BlbC1~AY-Myi^SBN zoT*HN#c4?1L+SA2EI^Xi!6Tjm6}3Ji|4*Frk;x5u0dp(^N)LqMI*d0!nmt|!+>WHv znZ>P`UZpWDb`0Go@hwR%k1}gyu(u?}32RxP6S#DkP|!;Ax7^mi+c8JXmGw->D3aP( zLYq~bC8SB{dU7}RCaz_58}R&aO=Pq`cs=G6Rdni%HWx8|K4t-EzUgE&>p<5?YoNS~ z<6Cmz8(zgqwSFDRw*up{01;C)38vj!tLl7EUq4536^HS;ZO5ZVoA;4edRglQFO)_8 zB#gK9Q@AZ)6z;rXW7ICYB6c-T49V3HEey;5$dfw!8WzPzD=B$bw<3k%Nx~90DUh?? zLGKfRiOg#qp63vq1@2rKwSzVg865WlHcr+mo77!zwvyTWB<4JR^*0R8zR*aUXBi5uqw1K(iTbW}=hNwQ*ICU+Oio0oUl2$%=804YPV&kj zooNB34O2m}X~{LAgG(-^w&V1tq%f09qwZZm@_;YvoFDzq`7x%O&?QRRh*xIS%hKg( zmn{QS0-Wh}*>p_@MArejF+*7>bmSYIuMI-I*c?Cfejhg6e4xu^Rqq&bMhz|2g(fChkrBTu4 zjbq7kG2w?{V`5duQ$Lb0IZ`9?sbWUDf8gn%hwcY{8Q66=4E>45 zR~f4{^=wSb5iJisw6>Kz_dag`;@O9Aqi}pL9GY+_){3HJDViVp&Q(y93DVd_ieBQ7 z7k6GrR^1%i>Xd9?-fPnMZK{z zl0$Fe499}%kywX|3ggz~sgLYxyPD?%rhAhPr4iMYY^BVq*mEd)EupKUVi8%)4BddG zB)AV{JF+bDBv$sSoIzlfPcrOC`Xd{a-P9eGKut322-7>WU%uOQ!;rUSYQKOlLZ>ao zF-0P*#U?Uh_53DA&(RqIyB5vPNp#)utyHDfVK(FVh=h8ih>GxH34Y2dJyRsxe0|!) zP|y^S5qesq2!rNV;@DCeG84klJgzBy)-j6Y|pmxhmf`|l2$qKvqP z0#mwtj$LQKE)ON4O>aW#7OD>Fn@Gcown;Ayk|lx@Mk_}n3hK>brz76|1$e;yhTLt$ z6fR~6;r+?+=@~5b9)}!2clxmy^eS*k1J(i~8UnEd%HIuBlG{exTrw!fybb$Dv?v4z zS?2S@8Ia~{YnbQel$?9b`q??Gx4sobsf9F&(9wOO69v<5rAE)J(0W=&SV|hJl)Ykh z3x!?2dyoF0wQTiQjWgTTQuW}pnpGBw^GaqT!A4V?i${haJ4;uhamW3wmJLg_i$c3y zFaO;s|9*M7eNil3Y?N+d9Z1xHZt6m^15^wnXLdNpEQTHCGRi83ho+)-C$4Puc)VF2{o2Kjc6Vk;HlJ(yTAAI+vU>%_=4Y#H4)1Zz zf+v}LktM4D#IV!K!QEs?^?N8)BKW$RD0mgOBC^}rqM%S4I+h5xCR4Zq=Zh&?+2P0! z#*{T20MX4j(pd`7fmN6L5}kHwwfpP)B4%*DYlTkiqUBD5rmtL&$)8> z0wfo@By{#n6cbWH&9J06VYtDKgv$C&=8~(#t7B9G3Q2+)?NR1If?3IkN%_cRIO?R0 zjNeji*n@cE;|*Xeyi~dlZT2Jg2GuDCp(SUC`BbAwX+WvnI+8m}MSbm6YYB~bre(!y zF4o0_yYj5j5ttb-#r!7X=X7e%vYdH#12A<8h!gM58g~It)d=nnw!W*sk`1uuAlis!LxR7$KgfbQ^xc z;rcXcrxLYFLRzY(9me^q2+2bv2kP`0log&I9c;Evu9Wm(Ca5eXXcsD7yZnMCMpYS| z92g>bTkMcPSyDiFhClgN9s|eY&wK`B1E|ND@OJFpPh?1R;7YTZMCA2MTIBe?=X>F8 z^am>W5uznjvVSJ7=-N90USJHf&g5Z)IW~YuD5F^B0D;)3^(NLin^BY18!VWvtjvo7 zWdYgx-o0*A-^%fF%_h-)fE+(b+%W7FhApAmvVVx7Xc(kj7gly=RQiTdCYwryBJCdzp+RHErT9&*!;8)6A38HMJo>G8;LHvmO&5= z*ncOUk#imJSF-yQvx0>^q_IN2PsYxK`TYlMdu!4sQaOR!-^Si0x=XOIf9Tl&bJ%Wg zmA|{Z{IW9{M={d-Mb?#`q+lGYIV~L^E_in|#S09k6^%$#aUP!=^E6Dy$(-G1EhNwK z=PY>SJ?ENkedYgKm|QrLxXlgj>o7@EClhv9Rwo^0~z|x2yPM_g#srB z&eMQWB0Q_C^PM2|+!F$DdJ7pN_^7no>l<(;M}Adw_AbD(k22R8x~Wg2vr+)WsF;AxB42A@(_5=1f&0{zdIO0Aw8jqrkVlE}F!}3-bAC+ckTlSE!WCgAS z9gfS%XeR9LaN31_tdr!Ays6{?Dg2-6?Exe}Yz7d?H}1keT4H2-e77 zE8;|jr;#A=wvuelV2na=>VOq!gw0SWrYIRt^rs{!>Q6BPVKi)AHU|safiif4V&pNY z3Q9{^ONuOx+m8VTDNdQv9N|Ragl$zeDd91o__#=M{s3#g$Kn0}r>q9#ao|NnP4nI% z%NaN!M{Y10=*Vnriy68q!lVWQL>3LSsojW(TPis|pO9GuYFVN;n~+7~G`+=C(J+`X zu&pp)2jgo_T#C0!L?}KEeTjuZ!rW>&6l4G=S!?rD{7p8Jh%eAn=L7l{J&cJYf964{ zw^{m$Zc;5~?AVhQb%NuI$&<`FssukRiq!bGDQua|_4RL6oXRc0tG?IuWKd9fxS@bF zh99f!(68fiu-UENktN!JWx(PxaF0O8%LgH*N!pI(_(r;4`2*+X7ezNBWWyIP-xp{1 zNUf}QuTG)(Vy}t@AD5;_9bFob14tcfT6}>)@sKZ;b82($d6H`Y?+nGR1|hYAb{K0` z%eEv0pAWzKwX#N6s$Z+Xe_a$W4A|UP7aLz; zA%Mxju1*h4Ppj#p+7Y=Bts%1Ao+(Qg^@F2Mi+Vp}KC(OF$#w9AB-`MP9TH<$%O_7E z+!5MIdJ$^H5Mj}ECuK9*+!Zw)_B>#2pZ_VmZG?^ew{M%zrEK<{HIGwQ%U+OVbDQEt zW?{Bvyhw@qDfgNLXFKQGPE}(U_jel`<_AiY$KEwRNW0q`@TnKwv<4!znbTDwazdsG zMOAbLVPFK>iO#@*MYUCzPhZgEg8I$j%*YG?aLJS^a^z}c3#K94xn(#$8rx?{O?O#2 z3x#gfWJ%(3N;vIgP=E-AL-Ag47t(s!0*&5akWEG6lq;J)#en}V<+|O@HT;siUxvK< zN?M5lomfn;p>ac@cMlGt@d9AjxdP)^v0ABMm_(F~$HgyHJ(=VW`^E_`uXHyrav$-@ za9;HC<2%mhlA&?}31_Rb_dko~fcaH8#Wp?wD*^l~lh~4YucZzPX=Oz|wwW z_gQ_dHN}=eWyuMN6pd8?S*t0d=k^+~y!>CVHuG63I!I{#t=$^UT%wS$xCqVF5>7hgXz%sIT5f-@B_G4LT7E}O zvD9;F9VeQ^NE&2f%wm~B#@^0M+wa5hn$OWGuQ zmwl*Rb)}k;Rg^Km3m~ncT5X6dcKa)eb6g-*9o$m>O6&C1KSM8TqTqfGDbTI!iO>;p zXG{dp&A|UaUaFeQG4Q!9TJ-AzfFZ~6|0*gc}eu*8-c7+(?4&w7H6w2_h;3|mWJa95Oa zU^QOsf*(j@fWH*kkyiThY7iJr_`R7+@+rqtqBn+(TkTdk;rc%}w)tVDvUp;lAfa@* zEI+6*im{@x;|aBKH1k#|5s>|J`Zf;H^D@R(t;$3L!vGVFC_$=&IdYJVrY-tC&ZPI8lHDpJev27yJ)6# zPsQtth%y*Rx`^VBiQ`BR_LwuXYK!8`(DH1hHf|I|Z9a_o3 zb$<#=P!kmyw2d$dwFG$grtdJD-t|@L&F}MXeOj7Em%cgDxO}v{h*+U01BBkq^#0#s zdhjoo**+PaQYE&Fgs(WKRvxiv$}r5VgunMNGoy)Bgc%=#DP{;mbyAhhkskzw$01$3 z1M|mXOG}-rJpob8METK>pS4{LRn{*|cM@FxgIO4h@6pd>rmsjjWDPVUk}8go!)&)V zpOI4Ef``MgY{bnA9q3F`L1H~3$S2{JbGn+AgWBa{-6#WS%}M_0$Td%cmWJ*6X?$Z? zY>yhqmm5V|AIVMynAz279M=|-yV< zWJX?7t|?_s7D+0hEL5U~uSy=)L%r<)k%h8ClR?>PG{!i&L#c|yl|&FTocckyJd&l^ z@}M!QJ_aoQ960d&B8oQq{-ezs7Vp@F%T9@<(Fa?6;|H$)0l-j%23T~j@43DI7@MEZ zH_Xy@fbVi|PR`$T&;qz~c)Z(01HgCBHlyynvkeoJJ`3>^uFTP!OZwA<-_VlaUu>m; zf3anG1AGw)~Sth^nKoV8ilIrxLvIamTa0rSv}Uj=_e-#5Ppm(|uADD{8%Yw&jo zoEbTr>m7wO-EL?<%zgo6nTsW#feKGpV?Tf;{)YTMb%J}eDdtR_F+l&T*EuS8dvj7g ze}@c8DAqWV!I}sM!5v)7r;P9kJ6bf49iolU^XJb?f|WW+@iH5MKoJ^6o*IK8VP+VL zKsm-RJ7jLH7DG6bV90Tz(dJx%Q?EPNW(@$!BV8t-ZnvNP+k8g;Wq9!AdAPWIcAsZc zJgeMGQ?w0HIBAwxsn)%MWHT;_bf3H8{|;n*qQEF+fi+GS94Qtp(lPry2i1d;;hi_>-Vzrt4t5!5%Fi}Gt!3e_ z$bMQY4^a%Vc^wYD5k9qkimWB7igyg34V@dWTYI)yzV;>xAuUA0@PyIUqU{U{0VC z3CJm6SvTnSD;c6eYxEBH3ID`0<`))BQ+Cm8aoe0a07d85uDF5ryHz0i3OYb~zlL)B zGEhDIfvFwBU;qq3NYDPOPv2SO>d!ZIr!>*aTf5KS7#R*)KEzD+{&a$T7~F^)%ASpM zugB4tCt~-kb9#Oxf$EU0nDtPGXr0rL3Z1sFpc3jv(l)7ZALb2@z9wgZ2?&L&moKUm z(%^1TyNE|xj;9o&Xm=Oc9ZLJ2nptS+5StfSzHQVw`cr3ruX)hopic+&qt_j_<~YP) zR_)88m2|BIMGI|F$jMMmXvv_nM(U)I#fbIXCvh`&fj-M6sjSJluw$xm=9R^BPQk#W zg{+=)dj-_dN^@>406k|d>m2a8g*{*-Bw~X)J&zQB!j9Hgl2KzZ53KKWyY7fxIt})Y zT}t6VXZW=%qk&TlP!8Qow+sW2D$0}cCLz#f+d@UkSsC#1@fW-U^|p> z;j2hw;cQ7_={(_H+(xMZ~t?N?o?J+ODkM}Za{jpkE zt5$cazqVJz<=X9C*BRlrYHug3wzo?wmuNZ#-)rq(YnN*|D9YcVu#m5^Rrrv(4L*s< zSmZDKynz2*EfN^SLTlu#Ny}zbQY-QU#e~7M8aVN|{v?=C*BDd+^}LWS@`=lAz_BHz zH)IJAgFVa--^(-Ck0jhl)TcPFu&yjcJ~|iC@MskwJu4^5&-{8Eymw_RY0A~5BlL$Q z0>Wl@+@CU^m)F6)s}m(fT9C&mhT38mcXkbuZolOD%+BxSvYdi451}L@y`r^^gEEgH z?A4wM!|al{`H zOwAZC+KgeIv4B~pKgb6$zde@`_uacN2w(hXg>(7Cyy_pGGn|?=m@d2wto`Pvm`cIJ z{|~tLKTif0-vEOi%&0{;@zOPyaxQa0&CXgP$z8!k($ZF-;vo)>pIJg3m$3p}1mULg>Q8eIo9%KO-vFtYltw*bAs*t}_PABGEuCjY>fpZj zpCLVk&n@}+Jh{E$>3@-U__I%_`BFX0-Ck-YjcaHZuA1Wzp3ic}7gcDJK`avV&Gs>o zYdY@9FcY(cZAxzTe=@Uw(W$$D=Uau%+M`?8fC4T^z2_jJ@HCzVnc3RTZ|=3SlNK6} z<*nJr^}qY*!Yu%o|IZAqv2enTt_?4{saiHt;H6CwqtD8JTHM9| z)D2>t`X5}s2VIaSf9QMK>u|BSc8=|~m0JkgKRrJ(78BaCJM_?wUneMEWC%VCU|E1( zE-asJXTH>cW*#j0l-REFY>7C!TlT<&lWT`3Yj*aya*yl!ZddGRy#Hb-`vlIVvdAR9 z@>I){IY5>RKB@UQoI296Y_u6*|;PPpR%$~ul3AMeUYQm!U{|i3y zPqjpvPSW_c|KlrWc=^q{?$G9lXFZFSy)0%Vk%>MxDRI-H&Sq5Pl8~Z$^g8`u+~M?R zwJcfw<|2I;Ig3Hb&QD1*4|Hz!OAHR&X})VVIwz;iz5RDWXHup9*fWQr;qBCJAEoMa z2F3X%bSID4OZe2ioI|Y@B1YUJ7z^tWa@r#31v(m0IXKz(DB1x*_Ck}FDDd5q z{1r|}`aof**~b8bs1KZ2H8f+?;d!KL7Q>cE{d9RiDRPr@9>hm3JA6hFd2tG<6`6Ke z4zq+@VbALWQ-U7ZoO_r`146xIL#F zYn-x({y+A=VW*z&tGDl?$4WcS!Wm(SO8F^P? za&pllqeg^}eQ``0V$>m!HbpzsG&0>pIQL7fJXAdQX>4t6E)QO4gV=Rm|1 zC_W|iAY3<<35fl#(02s3Nq7 zaRT=?U&5#xdt1;tOLzJS%6BIx&F1nFnyti->-hWW68WoTwEzr?{@syScm!+~!4A`u zCw7qGT+Y}=otfGt*)n;^WjAXSKpZ~@f&84O3`A$cPtC)82=xBzjQjl?TzkZiiUvJ@ zM4696gjL5w9E_-kHFN~(`5vdygKGinzdktHc~{2-9m9@M7w(4+`M9GSQ^>jR!trP@ zru&ErYuvx6N-g0TMW^i>daY7qw0j}Ow*q+ygA2;zM|l+R3T}hsGrAF%A$#emfowPm z>jk#Fs0tc2902&ULjGH@;8+$@#|82Dbz(N0DaXX@W1q`7=_^;J^k4kzhMkb1))lhM z^5SYTd0W<=(1i_rwKz*Fo{<(gwYTsgfn6!H>Kt##j)x$$QLByVWZ5Jq!D@4~y@ID>^4q70PLh$Gg8*+#QmUussIGi=BlLDs+=EQHQd=r(JP0x=nz znZpumMjjCHiE@aD#cfXNyO`{`la)0DYpmlB4u4^l%t-v>A4m+g4_=7XAO5}ulH<~n zcmOLv)W7Qvkwslsc>w6%RJWLnsumq@gd%tH=C4uclb>X9Ap3n+Xgh&XHHYeNS_O z3U@@U#QAGd<0Z64g~-jUUWW-3epfY0t;7veH^^xg77VUUvTqSnhv}U;za?~eACEnB z6JJ*`$rd$(qrYq?5%nG+{(BtPd}yM0W8WUL~>cqY#8xp#pkOWFWLARNA46~mCc znvq*L=rLQrKEL^04Z6-|iK ztW&|5SIGGY=D0VR7@Cz7<1z!Yl1$T{NZuTO1R0e~-f8h8+y%H>rO^Kwzgg7~Qi%(k z{xp)K|0Z%amEJto=CVI!dg^5Mtw>i4?RmV@*I7pm|Fd=nPdBcBda}D^&Ays>1$ap! zq4a%6k7qdMK^WBVR~9`D_AqWTBSAKXNwgXb%@9sYo}F9d`J0{H02zShf1JeDlha;L zOTSG$L~PO4^UcOjN4uLxuec!gW%KZ5>+R0*tMUnuv|6vD82inm)~oH^*OaLoIonzd zk7rF6nmaK(s~g(=o3A>W#g2IPkM(CVGsH#^K3o6cnT{hlF$^+rrAsC0r%%GL&`_X< zEN(u=?CsQj*mHP-HhP`OiqHkoKsE$7>_xk+vhZTn8g2uqFD^iAjSTiUle33%B&eR> zpkLdm9nCA#P}i1fCQdfxaX@E7Zhka$Ik8aN1@;{77&!2w@i34SU_6MtQN%#oR9%hm ztZby#Ham_{Hh+K2F$uMfC^c7BAFBkSvI_;m7z?2SjB;@w%i zMsbB;wLo-{e<%ah&_kxwgMCn1=JY%=NzZb#-mEVxLo_Uu3#Smn=aB?jXBC-^jx48# zq#$$U14rkm{u`oI|84niF$gcrFi_lN1?`vUEb2a5tRO+C5<5Sa_^N6{=dk`;+ys1C zWAPdQ-Z5p}-6EEMS90vs7t23{9!|5MPmQ;G=g+9hIJevd-3|9=@tuLMGlF3|yJ#Fha*`(u@Z($t2$bB(-x4 zoTz=M>*~*uC+4?4?MV#bQE@u)Dzg-G#cFGBsOl4eI^EJN!cPpK;W{HYh^M?)U0@Xd$4l8Y zVt8U>)J>e(8x@`l=DF;mj?oWvK(rAl%vIZ$?$B)`%2YJ++fnjlrusL{ij*zPOJD`l zjwDaF98;_&Qeznz*I#v>4`!AU9{R&CZ5FLpPQI`5$CX}BHN<%1h*{4+F`jh^+ zwwqZpKCK)LhVHs;PPcC4K4qs}N~(N?c}>vV?|0aPH@fs-h439Q5kTVnK)R!i`mP_; zqs!tm@yqphPqf#N-^a80iJookX7`^)n(UbJH@2^E9>jCp9+>%Tne!obLfU|^ojxcr zsl@wNS>`0(%K1(9B-rC8fJbtG0RrJ7zf7kVvjvfTs{~8f8TSVz#=elDS63c0g#6_y z9apr6Af|-^=#Y8Z*(F-19j|A1iWRPrz%b^ZPn|+I48n^+l}=acf%c9B_6Bx|Ode6T z;R1txi%4tNZF>}H%MFqwN84&yR1CBUsR1)#U+!boXIXd6+$@NnJZ~UPe(necLEb>o zP0)_-Y;+ZXhslQOv-Fm1dRGBo)7(A(~AtC5+YKC-yGkRWnQ#M^)9C@DPZ0p5Or8z>`|N0VoT=cxu zFyUq8$NZz37|Vn_Ma7A3ZqAii5K~eXeXTi4V2?wyORzQLtc3gW{?fOXwWzo{!MKlUiu<8q{<@@UFt>$^8mrF*HIk zNi0d|3m)X47sY~D3W%!sCNNQyz6$=%J@1_KYTv{5nZ8F2{GA*Oo8n8NAybN1F+o&j zsC6GP=Cge+iByq;!(am)`~iv*v6rYRewGF)`C#fTo6V_8MwRY^pgo*A9%IU6t;qXz z>;xFyu5tn@BHVV?|6E5XD-)b{!$uF4%x8`fB(D4Y*V>KCA_4w%39HBdmLz?4OU9=kYV5< zouPHg)A3vO@U1T;qWZ`qJ2U8G!wlDOCVc{Tg7pn)79<7eAVj2T-|b0j#jQV>*qzn~ zUu1oW^`XY@pW)Nm44Jk$nr_DXdxhMLUDVpv(0sCYR8zhoJr1IUg^fm;4#)d@1ssl3 z*8izr66K&@iG4iKJ!pT=^p->ap#43^aG;&+e-x`7Wn&vu-*9OP`mIsOGY;>Pj_E<) znV;-Wj>l~pdCd5b{Xp<{h=`Cqc+?v82T+1M`|PsX$FI1jV5YBNj1PksDyB;|AMhXJ zHYS7g1O3fh&%z?Ug;0hDWjF!qfu>@@(8Ex^vfU2(q2X;PR8Um53n5G*D>@^&*Lmwn z2NtNb+36@~kuy|bul`y>h3W?~zLGNqBGUOIa>ND(j&gb_9R0|>iPo_dV8{CFLef~} z~kvTqVms5fR&d7gI&FvOM3}m!B5vG`u3zSu=2W zVbG0+(KttC*&s3~{7HoW2;Pet{^`ISv2G-xI#b^lwdkgQ9`>Rsn-FU*H4a|9(18H5 zfek0sl;!@eb+K`cb^E;uR~37Y%EG6nS|pw|TDW!d!l0E?ujf@{QA}fTwSm6kuIL+1 zs&FqSc@w;c7zy)PR%-=%w7(~s&8B0G1xfGq2p<>d zB{q;*-AVS^oHEQ~aBqWP*SraRwLSx-b3Ox`pY?sE?Q7JHxxM<5we+P#D-+bi_NI!x z3p6h^>?6;h+FMGvUjv6c&Hb7WkHPh3xnE}#x}*Cwx0vgGtzTQ-hexkA54X24lj@7Z zgFOPUfIlWeR3tqTF${c2ak2WqOK_S*$S0*Q3ERFq^0c#-%+|}vOH|4F7jR?D9_U>i z8Z%#S?e5}rl<)7Tr$Hk*ad^F+0n_b~ClSF*5Y>lZ*zgaGsh>ZYR>W{(OnaRbawJ|5 zqpQ&H zwVIC_1iyPzi$+7gJ+dsF6DEUvXkgSh+*YU8BRDh4d37EuV(y`_76<@6JiS?pH|41& zi>#}hKC*4Gb0qXv=L_`1q4+%`lpb|-6Ur}6YtdjB@(U3oG3hJVsif8@zkHrXCq5|( zlPP^rlFE%7l9q^P-`{z$eRNEG<0P+Zq{btrY|tmai&H~r4w>=mMx!d2L35{N>vdK1 zN5qcClWo1H`L&*G^hYUrg7>0Ti2WU{p2lnzar1aY@m-7G#mrXvEk~O0<(^_s?9Y~J zKbA5td1xS`=w$w*IQtRv1$%19$I$T^xPgpO8@Vjftbk_2uNU(gAjbUK434nZaXkxk z!rD2K^WL+TF^wT%Z(^y&!+mcm@!;1uWT1~gR=pHpl&Y4Yp392)hq8Mc^LDH_Mv9X& zGO7&VcfLT>ANr!fzu0R@{-G`${N0E)K_>)C|I4n}?7mK(+vw;(nO6B3MH=}dNm^?` zdss6qd-?=IpUeHLs%Z7ENSi@((yIy@i&N|Mubg!GDlC1Z$}Hj!0VS!RBIFY)7)2G} zs)`DP_c2?^E0zxeqT5#-Bd^t6AV2ITjgUMIj=F!)Iy^q!DW4o~z9gW+$*^TvA$!TT zvUn|MU6+$mHnF+UkDf%j><-9qMr0UGgf@IgmP&HTlZsJ+t= z5w&g*)?}HI#X{Vs-E?ELcjkq?JO{6jcMkUX0?<9t+9hgbI2!r<8^Z!3wP3VDZ{qr4ljo8Im4W~SArF9EPr-G3?pD{lZJXjpr}E=p2j&enjE-8 zBp3U83Z{%|#b=C_-$_VBC5PQaWIJ?wE&gU};3EX^{K>q!(8$*51{mo^NHQu?3xU8e zf=s4zLr5j>3KPG{E0E%^Fj)KsC&1%wz3GAYb6pqW?IrO`5^R~%#X-A)Eb-$v--xG` zQ=UgDDvNdxm}}?;f`p!p)YL-t zOgR-btuxT*)b-4eDk8&n?~mDs1_)~*;n%3V3AJDD938*aEnF&(&-nT=J6K*`+&VPMm?;>HLdJYCSGA@buJQ{N@!v|# zZSq6OPrTSaI)0;z@RdjreODgF=Sjqv{WlazM8*VEH~4V82p7{u08VRDODzNJ`P$F1 zav?8BKeZ1Ic_WyeIUc$}gb^rcildCkZOTr}pY8b+#zVGqxQGz?yn!kbSQ|ng#N$n2 z^zyiivKI~NND^=#RaoZjxFeS&U~-36r%mf-dN*lt!YtTCO}@9+XtMML9)F8Rbzu2Nkfm zGs{ew6dgw`|8_f_A&``bLm}AjmMobZ)4D*C^NS$*a&m${7ng~u2djuLxnFz^uZt1=cSVbUS`AYH8$!v!f83= z{lJo}-tKb3s)Db+s@m1ECJ_gNm2nALQSmQzrbE}=VSmGEHdo1JB`Y_ZYXbi7$n5Jw zU#hIIF>IwFq{h^TQPiy~D<_E3u!|U%*n)WBzV`^hD>m!$DBK%y%pN1b4WU{A;T>UM zo@AC~eJs1B%SnDi-Q#sxXtNhd%X#C$1FF($b%85tW2m|!d&EZU9sLYNsH5+FLP@lv`ciq| z1J?^PRayQ>70q6qZmb%uK#x|w`F&a0$HY?e)AC2mdSiY`tUM5J_P4fQ2=xx0@dG%w zzkE7vR+h?@RK1UWw@jZ`U#^H`iSEVaF! z3!q@m7X06Af)KLH*aRGms#tD*`qUgQSDrF-cG*Rkb`e#KDiMfmzc2rC^6bacW&Q{~ zs?vX-Ci_UG>8Qz1QQ1+o={##X@ELAk#0`wkqtUQTfAF%Dv1X<6SvQCNKHck$UyNgT z>ddD+{qr`QP0{O1Cns}2HJfEcRW)@*3XiY&ze~pF7MYAJGVxnnUXofosy(6meZ6@b3xTmmWfnCrrr&nK78Jy=aeNVrC603-?ZgE2B)51 z@Vg*0L0{T~-Z;Yl&rANoX*lBJ{DKz%Cp1sY2711sIu;1a(|Nje)Dt8}bPrW>Uwr(W z^{vn91Gq_0-&?MHG(NLYa!XIGwkl5<470padHPucD>Ll{;qmzJU#)GF9b;#LibZMn z(N@S#L|V?3w2ui|fNm8Vdd7nOy!3@LTL%U=!v#PzKZ(hU?}+9PVv#;k(cX%+2x`$Y z8?BEo%_tlazCF@w;QB$L@7^dMITogsM<4VN3+u*MO!yVnUp+Zi?s@$W?7$}<>)&Kc zjAYKcNf(O!rgZ=I@YBN9;qCTqeP*E zlrf>I(ITYn8z-9XJC_a0s38II2pJ|Mku{<)y-q38=r$6rJrIM)8+XE*ye)Y|vX^4_ z_}Sk_&stl%a4EMM2OvMf0q&XO1tzi!Bf}w3#G|$~NZ_4zh{O!7-NZ|nee`Ae2a?DN zeK_(amEhJCg(*tvOtf~U7cB2d=1-};d}OT9y^!64rb&QKN&Le+nY@*2ABgCQAJY4> zG@r41Gqx{JG}=)I1EdRT(;8x4WXO4PK{F-`Zsu`&1oI%|DiFo=hH}_i5&37nUAz+u+kuwmToSdGDjd^VMqi~+d!p|&WN_?)G(=M@cV`0b? zis~#6)u)M6&WsZtPj_?De8U%4EIDxg^V4~~+xeDuhXiKn>eK=7MTx?oz!aHG;C_5@ zxV;T8T5k^yf7(1e0KRcvGWom={3X(~>zRcsa8Rz$T1jl^>Fe+`zHBGn#HsC%*CqB^ z-8$&GLZK71|KTdhx(ex8H0m4Aq)#)R59kv6+3xN+e1_Wkpv@wgSW10HDHQSVAuE0W;zgqF+;OArG3!7U(A{VqxY%zYV<0< z2)ho*+#V#)nfDHJT8%a#zit^f~mUX+* zX9Cxe47vn(jmd#jh6FcS&u`0eeo&0?4}X7bdL;}E?pbZ&C1%aH7%ob|?PM_a64J?M zyF)@D5O0Yz#-mF7QB20+{*q_nR}}--AI{P_D_!c0{Y<1GD8pJnmRky%Bmm)kcDE6^Ci#^A z%j=y+Vc(ZLzn9mX&1SlNd(!QH)stQ>lL`&|c7amNtSP4%l?jeq%^L40?GLMV9z2NM zvQg>IlStoCO<=FQQQN*bUcP&mzA}o8tyFv4tCpq~H~U|b`sLERyfQOV%PSMGQY!bv z=FU3}B?PNu2>Fu@xESyURUgB}dKJ6bAPf}}4K#3v!}+=5eSfYxZ?PpDmrp(K`xman z-$)G40C@xUjgd@LF*Q__n9-*J{k7e5G-PaIg9k^CL_G>MCaqbi(C#YLx-e@cT~Q|m z=s)@HeX6gaarqAD<$ot^Rm&1!!M~# z)_{nSofkn5ZNuu!Rneyr@2JbwztW#10W*w3Y`d&Yqdj{-ui< zh$0>JND7B=JZww$he9ApcOnD-IZMmA2cOd|kyst<;SJjz+r+4iVweP`VVQv7)~PdgZtcA*y{j2xzSjF3!+@BAsQ*j z#5H$33Tv$2su-yS<<2*$=*z}GrC;3KM5j1o18r^X?zXnyVWdmxv|=w!4(ep?I#VuD zgc6ky)VeG>)Q5qdK9mkz=^zDjwD+pD^)C?Z_`;l@jUEIc#sos^CA;rSo&Q`621b9k z{`vCt>sYxaX;A9qBb`u)B?Wt7e>lcOoOm8yVX?Zgr#<1wE5%`|;#~vZA(K05JPlOx(f>}O6?~UN?{Y?ql{~gmP+|JOIax)U}#Agiw*U)PT0odaC{J;HoasE2AlJm?-Bzvigt|{OZm0u&QiVz9* zl^?~_5H$rzHPHbAWz{0bATb2>r6irG%-&R@i6rc5CND_bV2rUom%|UvO=kt^s+rCV z&ce!Sc2H~1iq}04;0mst@2nHP6r5vpl8EYXW0pvR7H^#PWjGuoPdS(A5B#TlTv z``~@%?u+f2%VRyJc;x3ZAMu=YE{HPcY!uXQK6s$OGzxy}CnjU^+``X`%l5TuWAb(@ z{EY#fq4*Q3`HWT10py0&QRWYmbQ%@$()wOwC)+5>x%1U%6q&7rI6SqyMF=>nj?39~ zBv8F|kEyW^8qJToZWX=Q;kOT`?FF3!2fs1n|;HP*77Q|1RJ2TR# zcxGxCq=)HF3(irR5sXLdwFm7bp}U2_A}C1k7QxHn`nxAB;7XKRByw;%n-EWE{r*=q zo9551*E0s{+XK~uti~x5aiI)w8uHkn46>>Y?4{Kel0VTKMP=@zO@*GQec)`r>|}KB zX)*>Euosa#xoDGsEeH4-R<(z`!^>ef9?%wO-(r8xKCJlCy$!<~kE?xcumgCs++X?X zp8=Qg~+R=Z;$Kd&%c(*IQtFKhW_w^N2 z|Ga+Ppz%HLjlGv%;C<1R|MfO2|11BAjtZHqnvBaqobR7a5U$6+p6NS%>1Z4@MZ>(! z;R$W|$Mx@LySPmnb^9G$bdLW|irGM^r|=8O8|)^yCVPM(w|w{Ad;7tM3BsLqz6wsw zThXqv2!d(O3f{FE&)-mXWa%gFRYNgJM{y@Dg`u&}(YqI68E(%S@N^%V+{Yma(2@~c zt3Rr*-bqHX$nKVZ;lpAtC&}-u6y*N{ay{V)45GwQjYBXeao9-d#(}xiimE-TuT_Dx z$;t3Ikt7_ALhEx^e$1wHx21DZ=D&B5KgknMSQePvFnUx>%rWQw`j+SGZtPHxRZj9K zjN5+aOQ}M1(5@M(o1Kio2;lvLWySm5#Tm1JVZvU2(!lo3?Xe#QM<6!W-n_%-0_JMv zwu6|uKp(Ej9d9NBLfZ{m94g7Qi@zI$x``NZl<*0rrg#2|ejI;!a{T4V@s}sZL{E-9 zR}N*ukQR-#{>1(&OzWaf7$tp-{>eEDbuw!F zf%l2h`u05_Wf=Q8?f{AJ-9R7H9!R=1I%N#TLUfS<2bJRzCcZ7Qb8{InIqLxuCiyOY ztcID&smERW)4O(j9jBsu^(Zm;(G+-~f)7M`Jnpz!bQN1e{{#G3tFIO4M9en7ld*QC z@QX5KlYBXDxwUc`keH32>tFICF*Bm;E2czq zAq5!&?cs1Q>;XA6Wbp=Yb<^O67{|rZn8?|_F|=V6WA~qr5$&lX8jT-kEM*mg8-aaYNZI0Y%*bf7}EIy?*FK%PAf^M@O(-A-4rJ$tF>=WPwN@4 zzN75r50xtmo7!UH^^jx)6#ik2$HCBRhZlkW8+1X+3n3j3mLaf#SuHNNGa40IHY$l0 z9G;~YsnJ*dWF1afYU9o~%;jk)&ze6|-<9Q1?_b!##O=`jYrKFRrUdip6Q6E&R=>Vm zdG*nJtLvc2_raI!?4ZC5=dVkKaWX?~7Oo z-CpfU2U2^!%(8{7n_;G9xX*)3I%J&D7=B*=_3-wG;%m^PBIJ$QB*D=LZ)ERED{dEj)o@exAC2v(zePZb3*&Lo|Kpy+FXnTC z)rnu7R!*f2MdQsUGx`x+k+#Zc7DQubF{V%|#50x7N%eH5!W)GKFM*n-PUT|3ug=de z%o~8x{cO)+w>=tzM0leh>lWtkU?juRlXGe5?-pvAJC&UeD{I`0uNN;6RQl5U&P>?F zC$!MO6z}68GN~h+rHU4};MZbDs-SUEH;gBvNN%wN0?2L1SVryv z_|g|&?;F-p;3?L=Ybr~z^jXJjd)5c9dYPZP>cwAr#d(9tc6%b&vl7n15!di_ax#xzAyRAc z+>Mxf$n%IF)ta@~?5#I)(o?3M0KT)np3GIZo5&eADc4*QF)t&#Ze}@zy?k@LvwMW8 zE;rxo9v|H<1Ks5Obs2g23g)p(C7x4Obe#5h+sg$gFYazt;$=wAK4%}#g77o8E?d|Y zurg*^j+8NVe-BQ8e-2bB!fyw#-+V7zs%w!ORbzN$fO3`wCNh~kpuP6y1@1_C# z7ws>WlHFlX}{Eak8^@+Nv*=PUkbdK`dk! zya^^}2D|d4D;I{!)6_e)h9h|`m4c?$APy80)-L-ACiPY5=HN+bD}8q#Ih>PR1x z?O-aKs;nqRL(d&yiUIe%&YP~BAIOE7)J!TXjw~S?lI0K*z=LKY`57SYXkJHeGyxBt zw+@d$0mW(^zRXAfwMsb&k!RRAwdaG2+}-0|y{B#R5j#;XV@8)Xv9TeXV~5fR#1FQT z51uCS1-Y3RloK@V<`kKg!fC_)2^hpUsU~8)t7y3j}(GaW}r$ zz`xWurEE{k6}bSVq@mm~BV;jVw#O$<+)763MAMllSAo{`bG@;bmf3v&W+Sx(vOfZ*wSeBSMHe*V&Wc{|K(pO=iv%xZTcE{MP0UCLWBxGy@$jGVdp)lh)~jOmb|z zXq~)ZicAkLJ-5?3(OEm;Need3r__^{kDGyrcv^LkE2{q)ZZKhFVwQL8a2!zPcTD|b z-*M!P-@=4(M83^L)roQ#Thg+>W~f)pqU`Hr3_klkFJ*2q&3>Z6BWkfclKn-?ExCo) zn&N4tKXy(}&Fa!a)`PdC$ue8sO6qVVQ)P0 zrj&*;LxsuHmMk231H>v1hZ73}r5;DE-6`LXE}>Diuet0v&^}^zB|iX0#2>YWSU$U5 zl7-+rfRHdioFdiY`yjju?4td!Gw$W@aQS-51`k2LS7!ke5y3{kDqdI;!rTfVY9pnK z+^#oyg|03`=&No!Rdj*!=M+3L*)#U0Lj3T@IEHU|5GMl3aAS3e+ zwv=4644O|(ByIzpy_piUdI2`h$ug;HaaUx$dDA2c^{$2(+fVto&qTRIE-+`6#ZnbL zixH-(kD(f<{pHNj=iY@M5O#Yw*M-<-ui$lY=6*VFf2uEa;L_)h$qraK zyv|(t#q)NlO3k?uXL52Q^7WGw#CfV2Hy&zrD01+A#T6r#EwdV`x?SqWBgx5s{aq-=%hp4T5M4*Kji1 zKIY{fdXz@E?R8+rk9;Jzg#Cf;lw>&OEGg8;(1QvpM$JgzRE18JBFZKN^$?vuAjv84 zFf2lDKkhgWO6C61OCs}mRXUV%jq9=c#kP{S1yuKL#KOTy)X#*IQhL%3y!56Nt_af#}u!N zG2C=e{={(kIS#=@-2-hnAg6Mimq-Tb{(zk`@Q3XFqK5AG{Lu|Lnr4n1h{LP!3eR&D z$tk|Sa)&bS2K~ujA*9n@*nW?>fnkoJLPUXq=N?RhC)Vn#-`5{w@*=qU@Fc+PimK=~ zDoHqtsKiT6$CSfW1S|_BF$!5}8P74&y1Mpb+}*-VYC6F?0xdK}vkYBqis!%+jr?BJ ztTa_`DhiDur_jmC8ta)RmeT=~32cYFC6}qUGX1Nt?!nL8^j0FBnJH+X zh!ct3tty?@Mgx<6zBL`v1hG`fZwSs;?3zk0sVl3>BbsT+ z3Q~#q!Rkt#NCvEBo48_4GXH^ZSL3Geuln~7>nruOrkLIbL=AiOZT+FB*Xzkf)}WEq zqOI(~^*uyu;&=76jK);&S&fa4^bj;PD>Pqm0Is%7$z7dm4w)P)nhs$H9sq8}<=3wp z)%en4!wawh(5)L8xGrlH08!58JP>!sPLR6#!{68D=a-h2#9O{R*Au;{#yBhE0g@`< zlsz0B-c(iWs0v|Nh4m$Rh2;)+h@>>EW=++ zsqxad3CGlmy1$VcBc)GY+fWkZy&GwG2?asIqrfQdPHJYYzP18VAT#Av{0)SE%=87d zF)H%-m5xqzF}Sa0uUr=sn)0yz1)n1sk<32I%NN01Tn^wT*~q^bbE-EL+FOqk>+;h7 zxj=o=%D@suYsl%2^=4A(5*rpTz1#|YsnhaG0*bvi`$J?2f|s9e%ff-rXFMO9n|m5R)2Tr`Qhf_zgjz6 zV%5P6x--`QdHe8a=U`tf_TB%4!`rlQxc&1EH!<`+_(%tfwX%6A;QuYkwn{UgSN-?J z!_9rff58X8m)o60V`yVC+7q>hYn9vupT^bHb}cq$QVW*)@kWDe6o64OoMm%)lyxJH zRmybhaIJd1ZWgy<(&>C&!|3S!f?cNAL z8l@n0spZhef~t{3B9Y14jTB|dUCD3`t?H&+6_<`FC4r23I8%anZoG~#DSbxJ!_1rf zw%j^&yq0f`E4C3cs!cW`B|BWutaFov9rc$9H9aF=%Y<5hC>mI2`7+!6au!HH?7K^m z7IhQ?6Nb&b@M`EIAT<6>tp?Sx(|D)pr%aUQNJD{Kn>?*YewO%9ZvYSukh%a6C^FY1L(GX|~6%!`Z}>pGh+rcCD`e`}~}>_PM3M_O`g| zU1ek2eFZ*ys=YKO##38jrG;@plS7+<;V_v-}47X#0+34}~i z%JZ3QVG92Zm@ijh&jHVo0X>(gN0jC$lr957n^DkaEU#RzuJAu`exnGC}dIlQ~2*yVcjQ1dSXG_*QV^_Oa^>ZHkT4jJWUe!u7O4?VPNt821`_hEHn2fozADYA7Dj8O#8 z07s)iw>Zubdg^z4ZxmCdghnom@Rp^ojz*EEa|?-fq`88_ z5u`7^D1U>mQ43#@R-42Xlg*uN&m^;oCiD}8b~#ejPaLYA2p%K8ayuQ0!YIZ2r^Ih~ zTk*>nx+gU+)eJ3`#JQ==!M}8#AuG#JQANBGjV!hP8A@p=JfI!Xlp>l=(|L-~f;0&j z@6~kZebd3IAt#@>G=`ug9#v&&Y$WiWitadQw~&j%%T}bzH=Q$e7SgtdIo^xeQ_Uv4 zf_Ol4nKKGinf!mh5(5MMHMyd;7lfE2w8U0Y*pXF2yhEHW{YPa^rw5B;vJid{UZxwb z`HBURjdsmO3H&SBY!aWUNaLuRfyP>K@BOZcFGjl{yZMY}lWj4^7jLB$5ZEmHMt#d7 z6^d5Sr_7X86B1Mj8yQK#AeB3w+ha<4-RlAq0?a}s^P|7^-$$22xT8`Vg1W)jt8){u zSO5PxEydh>rGr82UQiI_N$$-&1fW|?Y;uO4iegh;`^}i?PoMtmGo9MfFH06KR6MT+ z@YSS>ylm6?=MwV>aT5+dkO#;q-G|_+8G~5$v6yGpCDljLsjM(NO{xy(qYQ~!&#>|+ z15h14`Mb&?m)3aj_O5xroG&-abyg@oUCy$%WVFcLK;f>pE|#8(&rb_h{L)Lp&*f~_ zqV~`qjHHK2e&5oTKJ*&OVUmGV8{l_H^YhX-0n;y zWs=9p^kaK_FP*umqAT+G`I;ftSSfXwTD#=2n!C+`N+un;=d<)BPSYLElMr{B>EuBv zaz^GAS&gV2~ zoghg0+2mt^QqoNqNv3ZZwi+D<2|iVS*pg5syn{%OJyc(xHgjDC$)7 z))V95g-8BEqfm?o7elv0J)~xoyO8Y_^*!D>Lu3reM|m?~FEk0E<5Ow&B%(%QZzAG9 zr3_&^1eqxKmJc*EM~$Gbah0TXaxs#wMJWd&n8z>Uz3|uhn{fVaZxhn!XW58nCMH@6 z{cMuoXhAnneDWBdRPKD-4-Hq8#33IHeat2n;uoLPzhAAd)E`pV7smLoKi_m0!lTB) zS3dS}-~V)ne~u(R$s!{FTI99ILw|&!RxWJts4CNET>2N66oAEEfgQ?c2A{@>U=I&& z1I=10l9U`<*rgtoOc^uFeKX?YxRI@6bYrK%kKk;QA;-Iho^j|ERf@f8g?K*3)JODz zkXw)_CsEuHn3K`2&@QQ!k z{r@F*zuvVfC`KCHa+_f*oTb@H;6ltspJsKGxOMnTI#X8{{p2}GlgH9A-hpA4uS&k+ zOFDB`8N~yR$S^Tq(s37=5WV;B>zH|3C+t)_j`>bW)1>3`?e*05JAS;nCTg$fzvp}F zM~B;)ZrYh&jQw0NVtJk8W#vq(9V62X5rqngZ-T|z-FZ&;ID4B6V{mc~h_j00Ht@SX z$K=;`Cwao=IBRDmh}Nd*+HV|en1yra#97t$J)ame?wJ}L@(V#YOd8nz$e@m7H*zVc zROOTG^`MP4+f6T%n5VZ@I;10sAyzC)oXiheHG%Um!w}K|a+=YDfmxTnLWF^!K*+F> zOZNlC>~z97&oM0*#^=pJ&nSdbdg#jb=*ERjh&!+)O$E<+Qv$sX!j>0|hBy4iaV)BM zCv>#A`+!E9y9+KF)=m^E0*W>_BO=;d79IW{g+tSxrT?=)XmiM#=AR^rmB+L0cNKmD zoE{QmLXx^t#~H=0aMeJ@>Gx&OH&T zOt-oXWs!+*RisjnFb4hM>FFoq_xjQ&qF;|C{X$k8I@sf@l?uUNH=GUUv6;t%enNc0jeh!E7eXK!8L#(AqPm!?m91?~(Fhly=(5~w1j_@&h z$Ua+=Y#f6qp?7IvDLW;To?ZtP9=aK#!w6l{!<@gQ^-xF-jDiB}5TeCkYI+WRRJ*}d zG3>f6ggb|;aOn0?F+kDpundkj9KxI9g9e42cYzObgxl$eS|2W5AGT9%6t-bM=yn?K z-qFG>H<*pUb-j4-U>QAHp$iPS&?XfRZ!wa|DFP-=DJhXGV4HRQYtB~9qpb4BX>rf} z3;wp+qV@TFo+=~w?`{%RCQjDmD!okntJ3-{9IK6@C}6Y@IVr6-=vGVf6L=xp*)V-- zS60{JV@rS38KvVb>@3Vit-@l_=K)zj4$&2l>T9f&!Dv$EG};L5OuP^}(J-ut%@yf9 zhlrygkk=kULk}NNM1U-VyywQ*;>Skgv#1e8t>K=n(Q{Sk%rr~Zx&oar;_B%2LPs4) zH5`N}^;%uCa0tTQ2U@fiaoMpAi`*V0NukN0b2#*{=Wupad-!_Y)JMc+G0mk}Y!-fy z?bjpGb){+%IExOdcsVxNQdM3dox%AxUULJaQQ}iauv;+}msAuWq>{&w6iGgtTfmDZ z?iMa-8`(%jQ}c$E;?-v}c^lDflPe}s=F(QtIT=-!^f8T(O7?A$I6Xp`?Kq3ZU&4_G z@g-mAHdAZiBblGg=iV6&X%nsu$_4c^TZhHt`eQm$lmdEJX78;bm;c-wxxjKrtvWW* zzJy~(N0q4PO9C%}Dk$PI_0Ci+txTQK_#syhWmKRZ@VPI^33mNp_~L`x z8zVp#QV51E3yekx7s%km?7W;u|2k^z9c;bX-DX^OIAsK3o|zG}m_q+tc5q!1v-J|M zmjG!%mcM-LWVJj+k2!;OsN^)+mSC~0=+>1`berdefpT&JL`Rny&D%{W@4YrbCI{CcCIvonNK$Pzaey5D~DgUb69qZJ71KI)4 zBPYivE47?35wM=tKucd{c_%GT!3A;jRdA=HIG1?{=cXLLxi4_=m`y7}6GfURR=N5; zkV9*$z&d79L!mCRAzV*L7K`pmqo%A@0KRWdimsCPM

    {e-j`1EtC9GY7@1p0dl$ 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 z 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�^y_XsTCOhwFg!pH!5F0s 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

    @lu+iXn>&hV;m6(RdKgx949RH-oNQ{R*3o1(aS} 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�(1b4~SO+ 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

    2_ZtTuSii9KaC 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 _{=%22EVzA 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

    ZEKbH1q(>F$>!#cAtjGz2 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 z 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 z%0D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

    #wcxdv^kd)X$U`V25;xsirFG+xK!aYK4w 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

    EEb_-@zQ!g{#rzx_? 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 literal 0 HcmV?d00001 diff --git a/src/CLI/klish/patches/klish-2.1.4/clish/shell/shell_libxml2.c.diff b/src/CLI/klish/patches/klish-2.1.4/clish/shell/shell_libxml2.c.diff new file mode 100644 index 0000000000..c9bb5cc847 --- /dev/null +++ b/src/CLI/klish/patches/klish-2.1.4/clish/shell/shell_libxml2.c.diff @@ -0,0 +1,102 @@ +diff --git a/clish/shell/shell_libxml2.c b/clish/shell/shell_libxml2.c +index 7acca05..0d51607 100644 +--- a/clish/shell/shell_libxml2.c ++++ b/clish/shell/shell_libxml2.c +@@ -2,7 +2,7 @@ + * ------------------------------------------------------ + * shell_roxml.c + * +- * This file implements the means to read an XML encoded file ++ * This file implements the means to read an XML encoded file + * and populate the CLI tree based on the contents. It implements + * the clish_xml API using roxml + * ------------------------------------------------------ +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + #include "xmlapi.h" + + #ifdef HAVE_LIB_LIBXSLT +@@ -69,7 +70,7 @@ static inline clish_xmlnode_t *node_to_xmlnode(xmlNode *node) + int clish_xmldoc_start(void) + { + #ifdef HAVE_LIB_LIBXSLT +- /* The XSLT example contain these settings but I doubt ++ /* The XSLT example contain these settings but I doubt + * it's really necessary. + */ + /* xmlSubstituteEntitiesDefault(1); +@@ -91,7 +92,8 @@ int clish_xmldoc_stop(void) + clish_xmldoc_t *clish_xmldoc_read(const char *filename) + { + xmlDoc *doc; +- doc = xmlReadFile(filename, NULL, 0); ++ doc = xmlReadFile(filename, NULL, 1026); ++ xmlXIncludeProcess(doc); + return doc_to_xmldoc(doc); + } + +@@ -131,15 +133,15 @@ int clish_xmlnode_get_type(clish_xmlnode_t *node) + if (node) { + xmlNode *n = xmlnode_to_node(node); + switch (n->type) { +- case XML_ELEMENT_NODE: ++ case XML_ELEMENT_NODE: + return CLISH_XMLNODE_ELM; +- case XML_TEXT_NODE: ++ case XML_TEXT_NODE: + return CLISH_XMLNODE_TEXT; +- case XML_COMMENT_NODE: ++ case XML_COMMENT_NODE: + return CLISH_XMLNODE_COMMENT; +- case XML_PI_NODE: ++ case XML_PI_NODE: + return CLISH_XMLNODE_PI; +- case XML_ATTRIBUTE_NODE: ++ case XML_ATTRIBUTE_NODE: + return CLISH_XMLNODE_ATTR; + default: + break; +@@ -169,7 +171,7 @@ clish_xmlnode_t *clish_xmlnode_parent(clish_xmlnode_t *node) + return NULL; + } + +-clish_xmlnode_t *clish_xmlnode_next_child(clish_xmlnode_t *parent, ++clish_xmlnode_t *clish_xmlnode_next_child(clish_xmlnode_t *parent, + clish_xmlnode_t *curchild) + { + xmlNode *child; +@@ -208,11 +210,11 @@ char *clish_xmlnode_fetch_attr(clish_xmlnode_t *node, + a = a->next; + } + } +- ++ + return NULL; + } + +-int clish_xmlnode_get_content(clish_xmlnode_t *node, char *content, ++int clish_xmlnode_get_content(clish_xmlnode_t *node, char *content, + unsigned int *contentlen) + { + xmlNode *n; +@@ -258,7 +260,7 @@ int clish_xmlnode_get_content(clish_xmlnode_t *node, char *content, + } + } + +-int clish_xmlnode_get_name(clish_xmlnode_t *node, char *name, ++int clish_xmlnode_get_name(clish_xmlnode_t *node, char *name, + unsigned int *namelen) + { + int rlen; +@@ -276,7 +278,7 @@ int clish_xmlnode_get_name(clish_xmlnode_t *node, char *name, + *name = 0; + n = xmlnode_to_node(node); + rlen = strlen((char*)n->name) + 1; +- ++ + if (rlen <= *namelen) { + snprintf(name, *namelen, "%s", (char*)n->name); + name[*namelen - 1] = '\0'; diff --git a/src/CLI/klish/patches/scripts/patchmake.sh b/src/CLI/klish/patches/scripts/patchmake.sh new file mode 100755 index 0000000000..1dddfcaa06 --- /dev/null +++ b/src/CLI/klish/patches/scripts/patchmake.sh @@ -0,0 +1,190 @@ +#!/bin/bash +# +# This script walks through all files in a directory and patches / copies them to the +# requested destination directory. +# If the file name has .diff suffix, it is patched. Otherwise the file is copied + +CLEAN_ALL="no" +CLEAN="no" +PATCH="no" +SKIP_PATCH="no" +MAKE_CLEAN="no" +MAKE_SKIP="no" + +TMP_VAR="" + +echo "## Executing `pwd`/$0" + +pre_exec(){ + if [ -z "$CODE_VER" ]; then + echo "## Specify the klish version in x.x.x format" + exit -1 + fi + TMP_SRC_PATH2="./klish-$CODE_VER" + TMP_SRC_PATH2="./klish-$CODE_VER" + +} + + +while [[ $# -gt 0 ]] +do + opt="$1" + shift + + case $opt in + #Removes the temporary directory and start the process of sync, patch and make. + -c|--clean) + CLEAN="yes" + ;; + + #Removes the temporary directory only and exits. All other options are ignored. + -C|--clean-all) + CLEAN_ALL="yes" + ;; + + #Displays the help for the patchmake.sh script. + -h|--help) + echo -ne "\rVariables:\n" + echo -ne "\rVER - Set the code version\n" + echo -ne "\rDSP - Set the .diff files path\n" + echo -ne "\rTSP - Set the source path to which the code need to extracted\n" + echo -ne "\rTWP - Set the code work path where the source will be copied and patched with .diff files\n" + echo -ne "\r\nOptions:\n" + echo -ne "\r-c, --clean\n\tRemoves the temporary directory for current version and start the process of sync, patch and make.\n\n" + echo -ne "\r-C, --clean-all\n\tRemoves the temporary directory of all version and exits. All other options are ignored.\n\n" + echo -ne "\r-h, --help\n\tDisplays the help for the make.sh script.\n\n" + echo -ne "\r-m, --make-clean\n\tDoes the make for \"clean\" target before building the actual target.\n\n" + echo -ne "\r-M, --skip-make\n\tThe make for the actual target is skipped. Ignored when used along with option -P --skip-patch\n\n." + echo -ne "\r-p, --patch-only\n\tThe script exits after patching the .diff files. Ignored when used along with option -P, --skip-patch.\n\n" + echo -ne "\r-P, --skip-patch\n\tThe patching of the .diff files is alone skipped. Used when required to build the target without any patches.\n\n" + exit 0 + ;; + + #Does the make for "clean" target before building the actual target. + -m|--make-clean) + MAKE_CLEAN="yes" + ;; + + #The make for the actual target is skipped. + -M|--skip-make) + MAKE_SKIP="yes" + ;; + + #The script exits after patching the .diff files. + -p|--patch-only) + PATCH="yes" + ;; + + #The patching of the .diff files is alone skipped. + -P|--skip-patch) + SKIP_PATCH="yes" + ;; + + #The source version to be compiled + VER=[0-9].[0-9].[0-9]) + CODE_VER=`echo $opt | awk -F'=' '{print $2}'` + ;; + + #Temporary source path + TSP=*) + TMP_SRC_PATH=`echo $opt | awk -F'=' '{print $2}'` + ;; + + #Temporary work path + TWP=*) + TMP_PATH=`echo $opt | awk -F'=' '{print $2}'` + ;; + + #Diff files path + DSP=*) + DIFF_SRC_PATH=`echo $opt | awk -F'=' '{print $2}'` + ;; + + #Unknown input + *) + echo "Unknown option or input $opt" + exit -1 + ;; + esac +done + +if [ "$TMP_SRC_PATH" == "" ]; then + echo "Temporary source path 'TSP' not set" + exit -1 +fi +if [ "$TMP_PATH" == "" ]; then + echo "Temporary work path 'TWP' not set" + TWP=${TSP} +fi +if [ "$DIFF_SRC_PATH" == "" ]; then + echo "Diff file(s) path 'DSP' not set" + exit -1 +fi +if [ "$CODE_VER" == "" ]; then + echo "Code version not set" + exit -1 +fi + +#Handling of clean only +if [ "$CLEAN_ALL" == "yes" ]; then + echo "## Removing $TMP_PATH directory" + rm -rf $TMP_PATH + exit 0 +fi + +pre_exec + +#Handling of clean option +if [ "$CLEAN" == "yes" ]; then + echo "## Cleaning the existing files in $TMP_PATH/$TMP_SRC_PATH2" + rm -rf $TMP_PATH/$TMP_SRC_PATH2 +fi + +mkdir -p $TMP_PATH + +#Handling of skipping patch +if [ ! "$SKIP_PATCH" == "yes" ]; then + if [ ! -f "$TMP_PATH/$TMP_SRC_PATH2/##patched##" ]; then + + #Copying the actual source files into the temporary directory + cp -r $TMP_SRC_PATH/$TMP_SRC_PATH2 $TMP_PATH + + #Getting the list of files + echo "## Preparing the .diff file list..." + TMP_VAR=`pwd` + cd $DIFF_SRC_PATH/$TMP_SRC_PATH2 + files=`find . -type f` + cd $TMP_VAR + + #Applying the patch or copying the newly created files + echo "## Applying the patch from $DIFF_SRC_PATH/$TMP_SRC_PATH2" | tee "$TMP_PATH/$TMP_SRC_PATH2/##patchlog##" + for file in $files + do + #Copying the files directly into the temporary source directory if is not a .diff file + TMP_VAR=`dirname $file` + if [ "${file##*.}" != "diff" ]; then + #Creating new directories if doesn't exist already and then copying the files + echo "copying $DIFF_SRC_PATH/$TMP_SRC_PATH2/$file $TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR" | tee -a "$TMP_PATH/$TMP_SRC_PATH2/##patchlog##" + test -d "$TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR" || mkdir -p "$TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR" && cp $DIFF_SRC_PATH/$TMP_SRC_PATH2/$file $TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR + fi + + #Patching the .diff files + TMP_VAR="${file%.*}" + if [ -f "$TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR" ]; then + patch $TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR $DIFF_SRC_PATH/$TMP_SRC_PATH2/$file -o $TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR.tmp | tee -a "$TMP_PATH/$TMP_SRC_PATH2/##patchlog##" + echo "moving $TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR.tmp -> $TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR" | tee -a "$TMP_PATH/$TMP_SRC_PATH2/##patchlog##" + cp $TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR.tmp $TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR + rm $TMP_PATH/$TMP_SRC_PATH2/$TMP_VAR.tmp + fi + done + touch "$TMP_PATH/$TMP_SRC_PATH2/##patched##" + else + echo "## Patching diff files is skipped -- already patched" + fi + if [ "$PATCH" == "yes" ]; then + exit + fi +else + echo "## Patching diff files is skipped -- user input" +fi + diff --git a/src/CLI/renderer/Makefile b/src/CLI/renderer/Makefile new file mode 100644 index 0000000000..7da49f4995 --- /dev/null +++ b/src/CLI/renderer/Makefile @@ -0,0 +1,6 @@ +.PHONY: install +all: + @echo "nothing to install for now" + +clean: + @echo "nothing to clean for now" diff --git a/src/CLI/renderer/scripts/__init__.py b/src/CLI/renderer/scripts/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/CLI/renderer/scripts/acl_jinja2.py b/src/CLI/renderer/scripts/acl_jinja2.py new file mode 100755 index 0000000000..6f7b20f35c --- /dev/null +++ b/src/CLI/renderer/scripts/acl_jinja2.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +from jinja2 import Template +import os +acl_out = {'openconfig_aclacl': {'acl_sets': {'acl_set': [{'acl_entries': {'acl_entry': [{'actions': {'config': {'forwarding_action': 'DROP', + 'log_action': None}, + 'state': {'forwarding_action': 'DROP', + 'log_action': None}}, + 'config': {'description': None, + 'sequence_id': 66}, + 'input_interface': None, + 'ipv4': {'config': {'destination_address': '2.2.2.0/24', + 'dscp': None, + 'hop_limit': None, + 'protocol': '6', + 'source_address': '1.1.1.0/24'}, + 'state': {'destination_address': '2.2.2.0/24', + 'dscp': None, + 'hop_limit': None, + 'protocol': '6', + 'source_address': '1.1.1.0/24'}}, + 'ipv6': None, + 'l2': None, + 'sequence_id': 66, + 'state': {'description': None, + 'matched_octets': 0, + 'matched_packets': 0, + 'sequence_id': 66}, + 'transport': {'config': {'destination_port': '200', + 'source_port': '100', + 'tcp_flags': None}, + 'state': {'destination_port': '200', + 'source_port': '100', + 'tcp_flags': None}}}]}, + 'config': {'description': None, + 'name': 'TEST', + 'type': 'ACL_IPV4'}, + 'name': 'TEST', + 'state': {'description': None, + 'name': 'TEST', + 'type': 'ACL_IPV4'}, + 'type': 'ACL_IPV4'}]}, + 'interfaces': None, + 'state': None}} + + + + +#!/usr/bin/env/python + +from jinja2 import Environment, FileSystemLoader + +# Capture our current directory +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) + +def acl_show(): + # Create the jinja2 environment. + # Notice the use of trim_blocks, which greatly helps control whitespace. + j2_env = Environment(loader=FileSystemLoader(THIS_DIR), + trim_blocks=True) + print (j2_env.get_template('acl_show.j2').render(acl_out=acl_out)) + +if __name__ == '__main__': + acl_show() diff --git a/src/CLI/renderer/scripts/render_cli.py b/src/CLI/renderer/scripts/render_cli.py new file mode 100755 index 0000000000..b2bc829904 --- /dev/null +++ b/src/CLI/renderer/scripts/render_cli.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python +from jinja2 import Template, Environment, FileSystemLoader +import os +import json +import sys +import gc +import select +from rpipe_utils import pipestr + + +# Capture our current directory +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) + +global line_count +global ctrl_rfd + +def render_init(fd): + global ctrlc_rfd + + ctrlc_rd_fd_num = int(fd) + try: + ctrlc_rfd = os.fdopen(ctrlc_rd_fd_num, 'r') + except IOError as e: + sys.stdout.write("Received error : " + str(e)) + gc.collect() + return None + +def cli_getch(): + # Disable canonical mode of input stream + # Set min bytes as 1 and read operation as blocking + fd = sys.stdin.fileno() + c = None + + #global ctrc_rfd + #fds = [fd, ctrlc_rfd] + fds = [fd] + try: + read_fds, write_fds, excep_fds = select.select(fds, [], []) + """ + # Return immediately for Ctrl-C interrupt + if ctrlc_rfd in read_fds: + return 'q' + """ + + c = os.read(fd, 1) + except KeyboardInterrupt: + return 'q' + except select.error as e: + if e[0] == 4: # Interrupted system call + return 'q' + else: + sys.stdout.write("Received error : " + str(e)) + return c + +def _write(string, disable_page=False): + """ + This function would take care of complete pagination logic, + like printing --more--, accepting SPACE, ENTER, q, CTRL-C + and act accordingly + """ + global line_count + + page_len_local = 25 + terminal = sys.stdout + # set length as 0 for prints without pagination + if disable_page is True: + page_len_local = 0 + if len(string) != 0: + terminal.write(string + '\n') + if page_len_local == 0: + return False + line_count = line_count + 1 + if line_count == page_len_local: + terminal.write("--more--") + while 1: + terminal.flush() + c = cli_getch() + terminal.flush() + # End of text (ascii value 3) is returned while pressing Ctrl-C + # key when CLISH executes commands from non-TTY + # Example : clish_source plugin + if c == 'q' or ord(c) == 3: + terminal.write('\x1b[2K'+'\x1b[0G') + line_count = 0 + #self.is_stopped = True + return True + elif c == ' ': + line_count = 0 + terminal.write('\x1b[2K'+'\x1b[0G') + break + # Carriage return (\r) is returned while pressing ENTER + # key when CLISH executes commands from non-TTY + # Example : clish_source plugin + elif c == '\n' or c == '\r': + #line_count = page_len_local - 1 + line_count = 0 + terminal.write('\x1b[2K'+'\x1b[0G') + terminal.flush() + break + return False + +def write(t_str): + global line_count + line_count = 0 + q = False + + render_init(0) + if t_str != "": + pipelst = pipestr().read(); + for s_str in t_str.split('\n'): + if pipelst: + if pipelst.process_pipes(s_str): + q = _write(s_str, pipelst.is_page_disabled()) + else: + q = _write(s_str) + if q: + break + + +def show_cli_output(template_file, response): + # Create the jinja2 environment. + # Notice the use of trim_blocks, which greatly helps control whitespace. + + template_path = os.path.abspath(os.path.join(THIS_DIR, "../render-templates")) + + j2_env = Environment(loader=FileSystemLoader(template_path),extensions=['jinja2.ext.do']) + j2_env.trim_blocks = True + j2_env.lstrip_blocks = True + j2_env.rstrip_blocks = True + + if response: + t_str = (j2_env.get_template(template_file).render(json_output=response)) + write(t_str) diff --git a/src/CLI/renderer/scripts/rpipe_utils.py b/src/CLI/renderer/scripts/rpipe_utils.py new file mode 100644 index 0000000000..d2377c536f --- /dev/null +++ b/src/CLI/renderer/scripts/rpipe_utils.py @@ -0,0 +1,382 @@ +#!/usr/bin/env python + +import re +import os +from time import gmtime, strftime + +class pipestr: + """ + pipestr class + For passing the pipestr from the actioner to the renderer + """ + def __init__(self): + pass + + def write(self, argv): + pipe_str = '' + has_pipe = False + for arg in argv: + if has_pipe: + pipe_str += (arg + ' ') + if arg == '|': + has_pipe = True + f = open("pipestr.txt", "w") + if len(pipe_str) > 0: + pipe_str = pipe_str[:-1] + f.write(pipe_str) + f.close() + + def read(self): + pipe_lst = pipelst() + f = open('pipestr.txt', "r") + pipe_str = f.readline() + f.close() + if len(pipe_str) > 0: + if pipe_lst.build_pipes(pipe_str) != 0: + print("error bulding pipe") + return None + return pipe_lst + +class pipelst: + """ + pipelst class + """ + def __init__(self): + # List of pipe objects corresponds to pipe string + self.pipes = [] + self.disable_page = False + + ## + # @brief Preprocess the pipe string and build the pipe objects list + # for later use + # + # @param pipe_str The string following the '|' symbol in the command line + # + # @return None + def build_pipes(self, pipe_str): + """validate pipe string and build pipe objects""" + splitlist = [] + pipe_obj = None + + if pipe_str is None: + return 0 + + # 'save skip-header' is internally triggered for 'show diff' + #if not pipe_str.startswith("save ") and show_batch_obj_g.is_obj_set(): + # if -1 == show_batch_obj_g.pipe_action(pipe_str): + # return -1 + # pipe_str = pipe_str + show_batch_obj_g.get_pipe_str() + + # Check for 'no-more' and disble pagination + if "no-more" in pipe_str: + self.disable_page = True + + splitlist = [x.strip() for x in pipe_str.split(" | ")] + for cmd in splitlist: + tmplist = cmd.split(' ', 1) + if len(tmplist) > 1: + match_str = tmplist[1].lstrip() + match_str = re.sub(r'^"|"$', '', match_str) + else: + continue + + pipe_cmd = tmplist[0].lower() + if pipe_cmd == "grep": + try : + pipe_obj = rpipe_grep(match_str) + except : + return -1 + elif pipe_cmd == "except": + try : + pipe_obj = rpipe_except(match_str) + except : + return -1 + elif pipe_cmd == "find": + try : + pipe_obj = rpipe_find(match_str) + except : + return -1 + elif pipe_cmd == "save": + # Check additional options + skip_header = False + write_mode = 'w' + file_name = match_str + if ' ' in match_str: + match_str_parts = match_str.split(' ') + file_name = match_str_parts[0] + save_option = match_str_parts[1].lower() + # skip-header is used for 'show diff' + if save_option == "skip-header": + skip_header = True + elif save_option == "append": + write_mode = 'a' + try : + pipe_obj = rpipe_save(file_name, write_mode, pipe_str, skip_header) + except : + return -1 + else: + pass + + if pipe_obj != None : + self.pipes.append(pipe_obj) + + return 0 + + ## + # @brief process the pipe objects list against the string + # + # @param string to be processed + # + # @return True/False + def process_pipes(self, string): + """process pipe objects against the string""" + pipe_result = False + print_content = True + + pipe_list = list(self.pipes) + for pipeobj in pipe_list: + pipe_result = pipeobj.pipe_action(string) + if pipe_result == False: + print_content = False + break + # Remove the pipe if needed (for find) + if pipeobj.can_be_removed() == True: + self.pipes.remove(pipeobj) + # Get the status whether can be printed or not + # For save, console print is not necessary + print_content = pipeobj.can_be_printed() + + return print_content + + ## + # @brief destroy the pipe objects + # + # @return None + def destroy_pipes(self): + """destroys pipe objects""" + self.pipes = [] + # enable pagination + self.disable_page = False + return + + ## + # @brief print the pipe objects + # + # @return None + def print_pipes(self): + """dump pipe objects""" + for pipeobj in self.pipes: + print pipeobj + return + + def is_page_disabled(self): + """returns the status of pagination enabled/disabled""" + return self.disable_page + + def __del__(self): + self.destroy_pipes() + +class rpipe_grep: + """ + grep wrapper class + """ + def __init__(self, match_str): + self.remove_pipe = False + self.print_content = True + self.pipe_str = "grep " + match_str + flags = None + if match_str.endswith(" ignore-case"): + flags = re.I + match_str = match_str.rsplit(' ', 1)[0] + try : + if flags is None: + self.regexp = re.compile(r'(.*?)' + match_str + '(.*?)') + else: + self.regexp = re.compile(r'(.*?)' + match_str + '(.*?)', flags) + except Exception, error : + print '%Error: ' + str(error) + raise + + def pipe_action(self, string): + if self.regexp.search(string) != None: + return True + else: + return False + + def can_be_removed(self): + return self.remove_pipe + + def can_be_printed(self): + return self.print_content + + def get_pipe_str(self): + return self.pipe_str + + def __del__(self): + self.regexp = "" + +class rpipe_except: + """ + except wrapper class + """ + def __init__(self, match_str): + self.remove_pipe = False + self.print_content = True + self.pipe_str = "except " + match_str + flags = None + if match_str.endswith(" ignore-case"): + flags = re.I + match_str = match_str.rsplit(' ', 1)[0] + try : + if flags is None: + self.regexp = re.compile(r'(.*?)' + match_str + '(.*?)') + else: + self.regexp = re.compile(r'(.*?)' + match_str + '(.*?)', flags) + except Exception, error : + print '%Error: ' + str(error) + raise + + def pipe_action(self, string): + if self.regexp.search(string) == None: + return True + else: + return False + + def can_be_removed(self): + return self.remove_pipe + + def can_be_printed(self): + return self.print_content + + def get_pipe_str(self): + return self.pipe_str + + def __del__(self): + self.regexp = "" + +class rpipe_find: + """ + find wrapper class + """ + def __init__(self, match_str): + self.remove_pipe = True + self.print_content = True + self.pipe_str = "find " + match_str + flags = None + if match_str.endswith(" ignore-case"): + flags = re.I + match_str = match_str.rsplit(' ', 1)[0] + try : + if flags is None: + self.regexp = re.compile(r'(.*?)' + match_str + '(.*?)') + else: + self.regexp = re.compile(r'(.*?)' + match_str + '(.*?)', flags) + except Exception, error : + print '%Error: ' + str(error) + raise + + def pipe_action(self, string): + if self.regexp.search(string) != None: + return True + else: + return False + + def can_be_removed(self): + return self.remove_pipe + + def can_be_printed(self): + return self.print_content + + def get_pipe_str(self): + return self.pipe_str + + def __del__(self): + self.regexp = "" + +class rpipe_save: + """ + save wrapper class + """ + def __init__(self, file_path, file_mode, cmd_str, skip_header=False): + self.remove_pipe = False + self.print_content = False + self.pipe_str = "save " + file_path + self.fd = None + if os.path.isabs(file_path) is True: + if os.path.exists(file_path) is True: + file_dir = os.path.dirname(file_path) + file_name = os.path.basename(file_path) + if file_name != "": + try: + self.fd = open(file_path, file_mode) + except IOError: + print 'Error: cannot create regular file ', \ + '%s : No such file or Directory' % file_path + else: + print "File name not present in %s" % file_path + else: + file_dir = os.path.dirname(file_path) + file_name = os.path.basename(file_path) + if os.path.isdir(file_dir) is True: + try: + self.fd = open(file_path, file_mode) + except IOError: + print 'Error: cannot create regular file ', \ + '%s : No such file or Directory' % file_path + else: + print '%s is not a Valid filepath' % file_path + else: + # For relative path, store the result in user's home + file_path = os.path.expanduser('~') + '/' + file_path + try: + self.fd = open(file_path, file_mode) + except IOError: + print 'Error: cannot create regular file ', \ + '%s : No such file or Directory' % file_path + # Save computed file name for future reference + self.file_path = file_path + # Write header in file + if skip_header is False: + self.write_header(cmd_str) + + def pipe_action(self, string): + # Print error when fd is not valid due to some reasons + if self.fd == None: + return False + + try: + if len(string) != 0: + self.fd.write(string + '\n') + self.fd.flush() + except IOError: + print 'Error: Write into file %s failed' % self.file_path + self.fd.close() + return True + + def can_be_removed(self): + return self.remove_pipe + + def can_be_printed(self): + return self.print_content + + def get_pipe_str(self): + return self.pipe_str + + def write_header(self, cmd_str): + if self.fd != None: + try: + self.fd.write('\n' + "! ===================================" + + "=====================================" + '\n' + + "! Started saving show command output at " + + strftime("%d/%m, %Y, %H:%M:%S", gmtime()) + + " for command:" + '\n! ' + cmd_str + '\n' + + "! ===================================" + + "=====================================" + '\n') + except IOError: + print 'Error: Write into file %s failed' % self.file_path + self.fd.close() + + def __del__(self): + if self.fd != None: + self.fd.close() + diff --git a/src/CLI/renderer/templates/acl_show.j2 b/src/CLI/renderer/templates/acl_show.j2 new file mode 100644 index 0000000000..3a70dedef9 --- /dev/null +++ b/src/CLI/renderer/templates/acl_show.j2 @@ -0,0 +1,4 @@ +{% set acl_sets = acl_out['openconfig_aclacl']['acl_sets']['acl_set'] %} + {% for acl_set in acl_sets %} + Name: {{ acl_set['state']['description'] }} + {% endfor %} diff --git a/src/CLI/renderer/templates/lldp_neighbor_show.j2 b/src/CLI/renderer/templates/lldp_neighbor_show.j2 new file mode 100755 index 0000000000..16c5134783 --- /dev/null +++ b/src/CLI/renderer/templates/lldp_neighbor_show.j2 @@ -0,0 +1,29 @@ +{{'-----------------------------------------------------------'}} +{{'LLDP Neighbors'.ljust(20)}} +{{'-----------------------------------------------------------'}} +{% for neigh in json_output %} +{% set value = neigh['neighbors']['neighbor'][0] %} +{{'Interface:'}}{{' '}}{{value['id']}}{{',via:'}}{{' LLDP'}} +{{' Chassis:'}} +{{' ChassisID: '}}{{value['state']['chassis_id']}} +{{' SysName: '}}{{value['state']['system_name']}} +{% set desc = value['state']['system_description'].split('\r\n')[1:] %} +{{' SysDescr: '}}{{value['state']['system_description'].split('\r\n')[0]}} +{% for v in desc %} +{{' '}}{{v}} +{% endfor %} +{% for cap in value['capabilities']['capability'] %} +{% if cap['state']['enabled'] == true %} +{% set en = 'ON' %} +{% endif %} +{% if cap['state']['enabled'] == false %} +{% set en = 'OFF' %} +{% endif %} +{{' Capability: '}}{{cap['name'].split(':')[1]}}{{', '}}{{en}} +{% endfor %} +{{' Port'}} +{{' PortID: '}}{{value['state']['port_id']}} +{{' PortDescr: '}}{{value['state']['port_description']}} +{{'-----------------------------------------------------------'}} +{% endfor %} + diff --git a/src/CLI/renderer/templates/lldp_show.j2 b/src/CLI/renderer/templates/lldp_show.j2 new file mode 100644 index 0000000000..1f8eaf71d5 --- /dev/null +++ b/src/CLI/renderer/templates/lldp_show.j2 @@ -0,0 +1,18 @@ +{{'------------------------------------------------------------------------------------------------------'}} +{{'LocalPort'.ljust(20)}}{{'RemoteDevice'.ljust(20)}}{{'RemotePortID'.ljust(20)}}{{'Capability'.ljust(20)}} {{'RemotePortDescr'}} +{{'-------------------------------------------------------------------------------------------------------'}} +{% set cap_dict = {'openconfig-lldp-types:REPEATER' : 'O','openconfig-lldp-types:MAC_BRIDGE' : 'B' , 'openconfig-lldp-types:ROUTER' : 'R'} %} +{% for neigh in json_output %} +{% set capabilities = neigh['neighbors']['neighbor'][0]['capabilities']['capability'] %} +{% set cap_list = [] %} +{% for cap in capabilities %} +{% if cap['state']['name'] in cap_dict %} +{% if cap['state']['enabled'] == true %} +{% do cap_list.append(cap_dict[cap['state']['name']]) %} +{% endif %} +{% endif %} +{% endfor %} +{% set value = neigh['neighbors']['neighbor'][0] %} +{{value['id'].ljust(20)}}{{value['state']['system_name'].ljust(20)}}{{value['state']['port_id'].ljust(20)}}{{(cap_list | join() | string).ljust(20)}}{{value['state']['port_description'].ljust(20)}} +{% endfor %} + diff --git a/src/CLI/renderer/templates/platform_show.j2 b/src/CLI/renderer/templates/platform_show.j2 new file mode 100644 index 0000000000..cd18d406ad --- /dev/null +++ b/src/CLI/renderer/templates/platform_show.j2 @@ -0,0 +1,7 @@ +{{'-----------------------------------------------------------'}} +{{'Attribute'.ljust(20)}} {{'Value/State'}} +{{'-----------------------------------------------------------'}} +{% for key,value in json_output.items() %} +{{key.ljust(20)}}:{{value}} +{% endfor %} + diff --git a/src/CLI/renderer/templates/show_access_group.j2 b/src/CLI/renderer/templates/show_access_group.j2 new file mode 100644 index 0000000000..a51bc8aa16 --- /dev/null +++ b/src/CLI/renderer/templates/show_access_group.j2 @@ -0,0 +1,40 @@ +{% if json_output %} +{% for key in json_output %} + {# This condition checks if the JSON response has data from the acl/interface list #} + {% if "interface" in key %} + {% for interface in json_output[key] %} + {% set if_id = interface["id"] %} + {% if interface["ingress_acl_sets"] %} + {% set idirection = "ingress" %} + {% endif %} + {% if interface["egress_acl_sets"] %} + {% set edirection = "egress" %} + {% endif %} + {% if idirection %} + {% set ing_acl_sets = idirection + "_acl_sets" %} + {% set ing_acl_set = idirection + "_acl_set" %} + {% set ing_acl_set_list = interface[ing_acl_sets][ing_acl_set] %} + {% for ing_acl_set in ing_acl_set_list %} + {% set i_acl_name = ing_acl_set["set_name"] %} + {% if idirection == "ingress" %} + {% set idirection = "Ingress" %} + {% endif %} + {{- idirection }} IP access-list {{ i_acl_name }} on {{ if_id }} + {% endfor %} + {% endif %} + {% if edirection %} + {% set eg_acl_sets = edirection + "_acl_sets" %} + {% set eg_acl_set = edirection + "_acl_set" %} + {% set eg_acl_set_list = interface[eg_acl_sets][eg_acl_set] %} + {% for eg_acl_set in eg_acl_set_list %} + {% set e_acl_name = eg_acl_set["set_name"] %} + {% if edirection == "egress" %} + {% set edirection = "Egress" %} + {% endif %} + {{- edirection }} IP access-list {{ e_acl_name }} on {{ if_id }} + {% endfor %} + {% endif %} + {% endfor %} + {% endif %} +{% endfor %} +{% endif %} diff --git a/src/CLI/renderer/templates/show_access_list.j2 b/src/CLI/renderer/templates/show_access_list.j2 new file mode 100644 index 0000000000..46c90199a0 --- /dev/null +++ b/src/CLI/renderer/templates/show_access_list.j2 @@ -0,0 +1,74 @@ +{% macro traverse_acl_entry(acl_entry_list) -%} + {% for seq in acl_entry_list %} + {% set response_list = [] %} + {# Get sequence id #} + {% set seqid = seq["sequence_id"] %} + {% set _list = response_list.append( seqid ) %} + {# Get forwarding action #} + {% set fwd_action = seq["actions"]["config"]["forwarding_action"] %} + {%- if "ACCEPT" in fwd_action %} + {% set fwd_action = "permit" %} + {%- endif %} + {%- if "DROP" in fwd_action %} + {% set fwd_action = "deny" %} + {%- endif %} + {% set _list = response_list.append( fwd_action ) %} + {# Get protocol #} + {% set proto = seq["ipv4"]["state"]["protocol"].split(':')[1].split('_')[1]|lower %} + {% set _list = response_list.append( proto ) %} + {# Get Source IP #} + {% set src_ip = seq["ipv4"]["state"]["source_address"] %} + {% set _list = response_list.append( src_ip ) %} + {# include src port number if available #} + {%- if seq["transport"] %} + {%- if seq["transport"]["config"]["source_port"] %} + {% set src_port = "eq " + seq["transport"]["config"]["source_port"] %} + {% set _list = response_list.append( src_port ) %} + {%- endif %} + {%- endif %} + {# Get Destination IP #} + {% set dstn_ip = seq["ipv4"]["state"]["destination_address"] %} + {% set _list = response_list.append( dstn_ip ) %} + {# include dstn port number if available #} + {%- if seq["transport"] %} + {%- if seq["transport"]["config"]["destination_port"] %} + {% set dstn_port = "eq " + seq["transport"]["config"]["destination_port"] %} + {% set _list = response_list.append( dstn_port ) %} + {%- endif %} + {%- if seq["transport"]["config"]["tcp_flags"] %} + {% for var in seq["transport"]["config"]["tcp_flags"] %} + {% set flag = var.split(':')[1].split('_')[1]|lower %} + {% set _list = response_list.append( flag ) %} + {% endfor %} + {%- endif %} + {%- endif %} + {%- if seq["ipv4"]["state"]["dscp"] %} + {% set _list = response_list.append( "dscp "+seq["ipv4"]["state"]["dscp"]|string ) %} + {%- endif %} + {{- " " }} {{ response_list|join(' ') }} + {% endfor %} +{%- endmacro %} +{% for key in json_output %} + {# This condition checks if the JSON response has data from the acl-entry list #} + {% if "acl_entry" in key -%} + {% set acl_entry = json_output[key] -%} + {{ traverse_acl_entry(acl_entry) }} + {%- endif %} +{% endfor %} +{% for acl_sets in json_output -%} + {% if "acl_set" in acl_sets -%} + {# This condition checks if the JSON response has data from the acl-sets container output -#} + {% for acl_set in json_output[acl_sets] %} + {% if acl_set["state"] -%} + ip access-list {{ acl_set["state"]["name"] }} + {% set acl_entry_list = acl_set["acl_entries"] %} + {% if acl_entry_list -%} + {% for each in acl_entry_list -%} + {% set acl_entry = acl_entry_list[each] -%} + {{ traverse_acl_entry(acl_entry) }} + {%- endfor %} + {%- endif %} + {%- endif %} + {% endfor %} + {%- endif %} +{%- endfor %} diff --git a/src/CLI/renderer/templates/show_interface.j2 b/src/CLI/renderer/templates/show_interface.j2 new file mode 100644 index 0000000000..8e50d6fc74 --- /dev/null +++ b/src/CLI/renderer/templates/show_interface.j2 @@ -0,0 +1,125 @@ +{% set vars = {'ipv4': ""} %} +{% set vars = {'ipv6': ""} %} +{% set vars = {'name': ""} %} +{% set vars = {'admin_state': ""} %} +{% set vars = {'oper_state': ""} %} +{% set vars = {'index': ""} %} +{% set vars = {'description':""} %} +{% set vars = {'mtu': ""} %} +{% set vars = {'ipv4_src_pfx': ""} %} +{% set vars = {'ipv6_src_pfx': ""} %} +{% set vars = {'mode4': "not-set"} %} +{% set vars = {'mode6': "not-set"} %} +{% set vars = {'speed': ""} %} +{% set vars = {'in_pkts':""} %} +{% set vars = {'in_octets':""} %} +{% set vars = {'in_multi':""} %} +{% set vars = {'in_broad':""} %} +{% set vars = {'in_uni':""} %} +{% set vars = {'in_errors':""} %} +{% set vars = {'in_discards':""} %} +{% set vars = {'out_pkts':""} %} +{% set vars = {'out_octets':""} %} +{% set vars = {'out_multi':""} %} +{% set vars = {'out_broad':""} %} +{% set vars = {'out_uni':""} %} +{% set vars = {'out_errors':""} %} +{% set vars = {'out_discards':""} %} +{% if json_output -%} +{% for key_json in json_output %} +{% set interface_list = json_output[key_json]["interface"] %} +{% for interface in interface_list %} + {% for key in interface %} + {% if "ethernet" in key %} + {% if vars.update({'speed':interface[key]["state"]["port-speed"]|replace("openconfig-if-ethernet:SPEED_", "")}) %}{% endif %} + {% endif %} + {% if "state" in key %} + {% if vars.update({'name':interface[key]["name"]}) %}{% endif %} + {% if vars.update({'admin_state':interface[key]["admin-status"]}) %}{% endif %} + {% if vars.update({'oper_state':interface[key]["oper-status"]}) %}{% endif %} + {% if vars.update({'index':interface[key]["ifindex"]}) %}{% endif %} + {% if vars.update({'description':interface[key]["description"]}) %}{% endif %} + {% if vars.update({'mtu':interface[key]["mtu"]}) %}{% endif %} + {% endif %} + {% if "counters" in interface["state"] %} + {% if vars.update({'in_pkts':interface["state"]["counters"]["in-pkts"]}) %}{% endif %} + {% if vars.update({'in_octets':interface["state"]["counters"]["in-octets"]}) %}{% endif %} + {% if vars.update({'in_multi':interface["state"]["counters"]["in-multicast-pkts"]}) %}{% endif %} + {% if vars.update({'in_broad':interface["state"]["counters"]["in-broadcast-pkts"]}) %}{% endif %} + {% if vars.update({'in_uni':interface["state"]["counters"]["in-unicast-pkts"]}) %}{% endif %} + {% if vars.update({'in_errors':interface["state"]["counters"]["in-errors"]}) %}{% endif %} + {% if vars.update({'in_discards':interface["state"]["counters"]["in-discards"]}) %}{% endif %} + {% if vars.update({'out_pkts':interface["state"]["counters"]["out-pkts"]}) %}{% endif %} + {% if vars.update({'out_octets':interface["state"]["counters"]["out-octets"]}) %}{% endif %} + {% if vars.update({'out_multi':interface["state"]["counters"]["out-multicast-pkts"]}) %}{% endif %} + {% if vars.update({'out_broad':interface["state"]["counters"]["out-broadcast-pkts"]}) %}{% endif %} + {% if vars.update({'out_uni':interface["state"]["counters"]["out-unicast-pkts"]}) %}{% endif %} + {% if vars.update({'out_errors':interface["state"]["counters"]["in-errors"]}) %}{% endif %} + {% if vars.update({'out_discards':interface["state"]["counters"]["out-discards"]}) %}{% endif %} + {% endif %} + {% if "subinterfaces" in key %} + {% for subinterface in interface[key] %} + {% set subif_list = interface[key][subinterface] %} + {% for subif in subif_list %} + {% if vars.update({'ipv4':"IPV4"}) %}{% endif %} + {% if vars.update({'ipv6':"IPV6"}) %}{% endif %} + {% if subif["openconfig-if-ip:ipv4"] %} + {% set ip_list = subif["openconfig-if-ip:ipv4"]["addresses"]["address"] %} + {% set ip_all = [] %} + {% for ip in ip_list %} + {% set ipfx = ip["state"]["ip"] + "/" + ip["state"]["prefix-length"]|string() %} + {{ ip_all.append(ipfx)|default("", True)}} + {% if vars.update({'mode4':"MANUAL"}) %}{% endif %} + {% endfor %} + {% if vars.update({'ipv4_src_pfx':ip_all|join(',')}) %}{% endif %} + {% else %} + {% if vars.update({'ipv4_src_pfx':""}) %}{% endif %} + {% if vars.update({'mode4':"not-set"}) %}{% endif %} + {% endif %} + {% if subif["openconfig-if-ip:ipv6"] %} + {% set ip_list = subif["openconfig-if-ip:ipv6"]["addresses"]["address"] %} + {% set ipv6_all = [] %} + {% for ip in ip_list %} + {% set ipfx = ip["state"]["ip"] + "/" + ip["state"]["prefix-length"]|string() %} + {{ ipv6_all.append(ipfx)|default("", True)}} + {% if vars.update({'mode6':"MANUAL"}) %}{% endif %} + {% endfor %} + {% if vars.update({'ipv6_src_pfx':ipv6_all|join(',')}) %}{% endif %} + {% else %} + {% if vars.update({'ipv6_src_pfx':""}) %}{% endif %} + {% if vars.update({'mode6':"not-set"}) %}{% endif %} + {% endif %} + {% endfor %} + {% endfor %} + {% endif %} + {% endfor %} +{% if 'Ethernet' in vars.name %} +{{ vars.name }} is {{ vars.admin_state|lower() }}, line protocol is {{vars.oper_state|lower() }} +Hardware is Eth +Interface index is {{ vars.index }} +{% if vars.description %} +Description: {{ vars.description }} +{% endif %} +{% if vars.ipv4_src_pfx %} +{{ vars.ipv4 }} address is {{ vars.ipv4_src_pfx }} +{% endif %} +Mode of {{ vars.ipv4 }} address assignment: {{ vars.mode4 }} +{% if vars.ipv6_src_pfx %} +{{ vars.ipv6 }} address is {{ vars.ipv6_src_pfx }} +{% endif %} +Mode of {{ vars.ipv6 }} address assignment: {{ vars.mode6 }} +IP MTU {{ vars.mtu }} bytes +LineSpeed {{ vars.speed }}, Auto-negotiation off +Input statistics: + {{vars.in_pkts}} packets, {{vars.in_octets}} octets + {{vars.in_multi}} Multicasts, {{vars.in_broad}} Broadcasts, {{vars.in_uni}} Unicasts + {{vars.in_errors}} error, {{vars.in_discards}} discarded +Output statistics: + {{vars.out_pkts}} packets, {{vars.out_octets}} octets + {{vars.out_multi}} Multicasts, {{vars.out_broad}} Broadcasts, {{vars.out_uni}} Unicasts + {{vars.out_errors}} error, {{vars.out_discards}} discarded + +{% endif %} +{% endfor %} +{% endfor %} +{% endif %} diff --git a/src/CLI/renderer/templates/show_interface_counters.j2 b/src/CLI/renderer/templates/show_interface_counters.j2 new file mode 100644 index 0000000000..0abdbce778 --- /dev/null +++ b/src/CLI/renderer/templates/show_interface_counters.j2 @@ -0,0 +1,39 @@ +{% set vars = {'name': ""} %} +{% set vars = {'oper_state': ""} %} +{% set vars = {'in_packets': ""} %} +{% set vars = {'in_errors': ""} %} +{% set vars = {'in_discards': ""} %} +{% set vars = {'out_packets': ""} %} +{% set vars = {'out_errors': ""} %} +{% set vars = {'out_discards': ""} %} +{% if json_output -%} +------------------------------------------------------------------------------------------------ +{{'%-15s'|format("Interface")}}{{'%-10s'|format("State")}}{{'%-10s'|format("RX_OK")}}{{'%-10s'|format("RX_ERR")}}{{'%-10s'|format("RX_DRP")}}{{'%-10s'|format("TX_OK")}}{{'%-10s'|format("TX_ERR")}}{{'%-10s'|format("TX_DRP")}} +------------------------------------------------------------------------------------------------ +{% for key_json in json_output %} +{% set interface_list = json_output[key_json]["interface"] %} +{% for interface in interface_list %} + {% for key in interface %} + {% if "state" in key %} + {% if vars.update({'name':interface[key]["name"]}) %}{% endif %} + {% if interface[key]["oper-status"] =='DOWN' %} + {% if vars.update({'oper_state':'D'}) %}{% endif %} + {% else %} + {% if vars.update({'oper_state':'U'}) %}{% endif %} + {% endif %} + {% endif %} + {% if "counters" in interface["state"] %} + {% if vars.update({'in_packets':interface["state"]["counters"]["in-pkts"]}) %}{% endif %} + {% if vars.update({'in_errors':interface["state"]["counters"]["in-errors"]}) %}{% endif %} + {% if vars.update({'in_discards':interface["state"]["counters"]["in-discards"]}) %}{% endif %} + {% if vars.update({'out_packets':interface["state"]["counters"]["out-pkts"]}) %}{% endif %} + {% if vars.update({'out_errors':interface["state"]["counters"]["out-errors"]}) %}{% endif %} + {% if vars.update({'out_discards':interface["state"]["counters"]["out-discards"]}) %}{% endif %} + {% endif %} + {% endfor %} +{% if 'Ethernet' in vars.name %} +{{'%-15s'|format(vars.name)}}{{'%-10s'|format(vars.oper_state)}}{{'%-10s'|format(vars.in_packets)}}{{'%-10s'|format(vars.in_errors)}}{{'%-10s'|format(vars.in_discards)}}{{'%-10s'|format(vars.out_packets)}}{{'%-10s'|format(vars.out_errors)}}{{'%-10s'|format(vars.out_discards)}} +{% endif %} +{% endfor %} +{% endfor %} +{% endif %} diff --git a/src/CLI/renderer/templates/show_interface_id.j2 b/src/CLI/renderer/templates/show_interface_id.j2 new file mode 100644 index 0000000000..b4b4b32eed --- /dev/null +++ b/src/CLI/renderer/templates/show_interface_id.j2 @@ -0,0 +1,121 @@ +{% set vars = {'ipv4': ""} %} +{% set vars = {'ipv6': ""} %} +{% set vars = {'name': ""} %} +{% set vars = {'admin_state': ""} %} +{% set vars = {'oper_state': ""} %} +{% set vars = {'index': ""} %} +{% set vars = {'description':""} %} +{% set vars = {'mtu': ""} %} +{% set vars = {'ipv4_src_pfx': ""} %} +{% set vars = {'ipv6_src_pfx': ""} %} +{% set vars = {'mode4': "not-set"} %} +{% set vars = {'mode6': "not-set"} %} +{% set vars = {'speed': ""} %} +{% set vars = {'in_pkts':""} %} +{% set vars = {'in_octets':""} %} +{% set vars = {'in_multi':""} %} +{% set vars = {'in_broad':""} %} +{% set vars = {'in_uni':""} %} +{% set vars = {'in_errors':""} %} +{% set vars = {'in_discards':""} %} +{% set vars = {'out_pkts':""} %} +{% set vars = {'out_octets':""} %} +{% set vars = {'out_multi':""} %} +{% set vars = {'out_broad':""} %} +{% set vars = {'out_uni':""} %} +{% set vars = {'out_errors':""} %} +{% set vars = {'out_discards':""} %} +{% if json_output -%} +{% for interfaces in json_output %} +{% set interface_list = json_output[interfaces] %} +{% for interface in interface_list %} + {% for key in interface %} + {% if "ethernet" in key %} + {% if vars.update({'speed':interface[key]["state"]["port-speed"]|replace("openconfig-if-ethernet:SPEED_", "")}) %}{% endif %} + {% endif %} + {% if "state" in key %} + {% if vars.update({'name':interface[key]["name"]}) %}{% endif %} + {% if vars.update({'admin_state':interface[key]["admin-status"]}) %}{% endif %} + {% if vars.update({'oper_state':interface[key]["oper-status"]}) %}{% endif %} + {% if vars.update({'index':interface[key]["ifindex"]}) %}{% endif %} + {% if vars.update({'description':interface[key]["description"]}) %}{% endif %} + {% if vars.update({'mtu':interface[key]["mtu"]}) %}{% endif %} + {% if vars.update({'in_pkts':interface[key]["counters"]["in-pkts"]}) %}{% endif %} + {% if vars.update({'in_octets':interface[key]["counters"]["in-octets"]}) %}{% endif %} + {% if vars.update({'in_multi':interface[key]["counters"]["in-multicast-pkts"]}) %}{% endif %} + {% if vars.update({'in_broad':interface[key]["counters"]["in-broadcast-pkts"]}) %}{% endif %} + {% if vars.update({'in_uni':interface[key]["counters"]["in-unicast-pkts"]}) %}{% endif %} + {% if vars.update({'in_errors':interface[key]["counters"]["in-errors"]}) %}{% endif %} + {% if vars.update({'in_discards':interface[key]["counters"]["in-discards"]}) %}{% endif %} + {% if vars.update({'out_pkts':interface[key]["counters"]["out-pkts"]}) %}{% endif %} + {% if vars.update({'out_octets':interface[key]["counters"]["out-octets"]}) %}{% endif %} + {% if vars.update({'out_multi':interface[key]["counters"]["out-multicast-pkts"]}) %}{% endif %} + {% if vars.update({'out_broad':interface[key]["counters"]["out-broadcast-pkts"]}) %}{% endif %} + {% if vars.update({'out_uni':interface[key]["counters"]["out-unicast-pkts"]}) %}{% endif %} + {% if vars.update({'out_errors':interface[key]["counters"]["in-errors"]}) %}{% endif %} + {% if vars.update({'out_discards':interface[key]["counters"]["out-discards"]}) %}{% endif %} + {% endif %} + {% if "subinterfaces" in key %} + {% for subinterface in interface[key] %} + {% set subif_list = interface[key][subinterface] %} + {% for subif in subif_list %} + {% if vars.update({'ipv4':"IPV4"}) %}{% endif %} + {% if vars.update({'ipv6':"IPV6"}) %}{% endif %} + {% if subif["openconfig-if-ip:ipv4"] %} + {% set ip_list = subif["openconfig-if-ip:ipv4"]["addresses"]["address"] %} + {% set ip_all = [] %} + {% for ip in ip_list %} + {% set ipfx = ip["state"]["ip"] + "/" + ip["state"]["prefix-length"]|string() %} + {{ ip_all.append(ipfx)|default("", True)}} + {% if vars.update({'mode4':"MANUAL"}) %}{% endif %} + {% endfor %} + {% if vars.update({'ipv4_src_pfx':ip_all|join(',')}) %}{% endif %} + {% else %} + {% if vars.update({'mode4':"not-set"}) %}{% endif %} + {% endif %} + {% if subif["openconfig-if-ip:ipv6"] %} + {% set ip_list = subif["openconfig-if-ip:ipv6"]["addresses"]["address"] %} + {% set ipv6_all = [] %} + {% for ip in ip_list %} + {% set ipfx = ip["state"]["ip"] + "/" + ip["state"]["prefix-length"]|string() %} + {{ ipv6_all.append(ipfx)|default("", True)}} + {% if vars.update({'mode6':"MANUAL"}) %}{% endif %} + {% endfor %} + {% if vars.update({'ipv6_src_pfx':ipv6_all|join(',')}) %}{% endif %} + {% else %} + {% if vars.update({'mode6':"not-set"}) %}{% endif %} + {% endif %} + {% endfor %} + {% endfor %} + {% endif %} + {% endfor %} +{% if vars.name %} +{{ vars.name }} is {{ vars.admin_state|lower() }}, line protocol is {{vars.oper_state|lower() }} +Hardware is Eth + +Interface index is {{ vars.index }} +{% if vars.description %} +Description: {{ vars.description }} +{% endif %} +{% if vars.ipv4_src_pfx %} +{{ vars.ipv4 }} address is {{ vars.ipv4_src_pfx }} +{% endif %} +Mode of {{ vars.ipv4 }} address assignment: {{ vars.mode4 }} +{% if vars.ipv6_src_pfx %} +{{ vars.ipv6 }} address is {{ vars.ipv6_src_pfx }} +{% endif %} +Mode of {{ vars.ipv6 }} address assignment: {{ vars.mode6 }} +IP MTU {{ vars.mtu }} bytes +LineSpeed {{ vars.speed }}, Auto-negotiation off +Input statistics: + {{vars.in_pkts}} packets, {{vars.in_octets}} octets + {{vars.in_multi}} Multicasts, {{vars.in_broad}} Broadcasts, {{vars.in_uni}} Unicasts + {{vars.in_errors}} error, {{vars.in_discards}} discarded +Output statistics: + {{vars.out_pkts}} packets, {{vars.out_octets}} octets + {{vars.out_multi}} Multicasts, {{vars.out_broad}} Broadcasts, {{vars.out_uni}} Unicasts + {{vars.out_errors}} error, {{vars.out_discards}} discarded +{%- endif %} +{% endfor %} +{% endfor %} +{% endif %} diff --git a/src/CLI/renderer/templates/show_interface_status.j2 b/src/CLI/renderer/templates/show_interface_status.j2 new file mode 100644 index 0000000000..c706bd53cd --- /dev/null +++ b/src/CLI/renderer/templates/show_interface_status.j2 @@ -0,0 +1,36 @@ +{% set vars = {'name': ""} %} +{% set vars = {'admin_state': ""} %} +{% set vars = {'oper_state': ""} %} +{% set vars = {'description': ""} %} +{% set vars = {'mtu': ""} %} +{% set vars = {'speed': ""} %} +{% if json_output -%} +------------------------------------------------------------------------------------------ +{{'%-20s'|format("Name")}}{{'%-20s'|format("Description")}}{{'%-15s'|format("Admin")}}{{'%-15s'|format("Oper")}}{{'%-15s'|format("Speed")}}{{'%-15s'|format("MTU")}} +------------------------------------------------------------------------------------------ +{% for key_json in json_output %} +{% set interface_list = json_output[key_json]["interface"] %} +{% for interface in interface_list %} + {% for key in interface %} + {% if "ethernet" in key %} + {% if vars.update({'speed':interface[key]["state"]["port-speed"]|replace("openconfig-if-ethernet:SPEED_", "")}) %}{% endif %} + {% endif %} + {% if "state" in key %} + {% if vars.update({'name':interface[key]["name"]}) %}{% endif %} + {% if vars.update({'admin_state':interface[key]["admin-status"]}) %}{% endif %} + {% if vars.update({'oper_state':interface[key]["oper-status"]}) %}{% endif %} + {% if vars.update({'mtu':interface[key]["mtu"]}) %}{% endif %} + {% if interface[key]["description"] != "" %} + {% if vars.update({'description':interface[key]["description"]}) %}{% endif %} + {%else %} + {% if vars.update({'description':"-"}) %}{% endif %} + {% endif %} + {% endif %} + {% endfor %} +{% if 'Ethernet' in vars.name %} +{{'%-20s'|format(vars.name)}}{{'%-20s'|format(vars.description)}}{{'%-15s'|format(vars.admin_state|lower())}}{{'%-15s'|format(vars.oper_state|lower())}}{{'%-15s'|format(vars.speed)}}{{'%-15s'|format(vars.mtu)}} +{% endif %} +{% endfor %} +{% endfor %} +{% endif %} + diff --git a/src/CLI/renderer/templates/system_cpu_show.j2 b/src/CLI/renderer/templates/system_cpu_show.j2 new file mode 100644 index 0000000000..61028dbd45 --- /dev/null +++ b/src/CLI/renderer/templates/system_cpu_show.j2 @@ -0,0 +1,12 @@ +{{'----------------------------------------------------------------------'}} +{{'CPU'.ljust(20)}}{{'%KERNEL'.ljust(20)}}{{'%USER'.ljust(20)}}{{'%IDLE'}} +{{'----------------------------------------------------------------------'}} +{% for cpu in json_output %} + {% if (cpu['index'] != '0') %} + {% set index = (cpu['index'] | string) %} + {% else %} + {% set index = (('total') | string) %} + {% endif %} +{{('CPU-'+ index).ljust(20)}} {{(cpu['state']['kernel']['instant'] | string).ljust(20)}} {{(cpu['state']['user']['instant'] | string).ljust(20)}} {{(cpu['state']['idle']['instant'] | string)}} +{% endfor %} + diff --git a/src/CLI/renderer/templates/system_processes_show.j2 b/src/CLI/renderer/templates/system_processes_show.j2 new file mode 100755 index 0000000000..c3960df150 --- /dev/null +++ b/src/CLI/renderer/templates/system_processes_show.j2 @@ -0,0 +1,9 @@ +{% set just_var = 10 %} +{{'--------------------------------------------------------------------------'}} +{{'PID'.ljust(just_var)}}{{'%CPU'.ljust(just_var)}}{#{{'CPU-TICKS-USER'.ljust(just_var)}}{{'CPU-TICKS-SYSTEM'.ljust(just_var)}}#}{{'%MEMORY'.ljust(just_var)}}{{'MEM-USAGE(Bytes)'.ljust(just_var)}}{#{{'START-TIME'.ljust(just_var)}}{{'UP-TIME'.ljust(just_var)}}#}{{'NAME'.rjust(just_var)}} +{{'--------------------------------------------------------------------------'}} +{% for process in json_output %} +{%set name = (process['state']['name'] | string).split(' ')%} +{{(process['pid'] | string).ljust(just_var)}} {{(process['state']['cpu_utilization'] | string).ljust(just_var)}} {#{{(process['state']['cpu_usage_user'] | string).ljust(just_var)}} {{(process['state']['cpu_usage_system'] | string).ljust(just_var)}}#} {{(process['state']['memory_utilization'] | string).ljust(just_var)}} {{(process['state']['memory_usage'] | string).ljust(just_var)}} {#{{(process['state']['start_time'] | string).ljust(10)}} {{(process['state']['uptime'] | string).ljust(just_var)}}#} {{name[0]}} +{% endfor %} + diff --git a/src/CLI/renderer/templates/system_show.j2 b/src/CLI/renderer/templates/system_show.j2 new file mode 100755 index 0000000000..cd18d406ad --- /dev/null +++ b/src/CLI/renderer/templates/system_show.j2 @@ -0,0 +1,7 @@ +{{'-----------------------------------------------------------'}} +{{'Attribute'.ljust(20)}} {{'Value/State'}} +{{'-----------------------------------------------------------'}} +{% for key,value in json_output.items() %} +{{key.ljust(20)}}:{{value}} +{% endfor %} + diff --git a/src/cvl/Makefile b/src/cvl/Makefile new file mode 100644 index 0000000000..3a61dd8a4b --- /dev/null +++ b/src/cvl/Makefile @@ -0,0 +1,79 @@ +################################################################################ +# # +# Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or # +# its subsidiaries. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# # +################################################################################ + +all: precheck deps schema tests +GO?=/usr/local/go/bin/go +SRC_FILES=$(shell find . -name '*.go' | grep -v '_test.go' | grep -v '/tests/') +TEST_FILES=$(wildcard *_test.go) +TOP_DIR := $(abspath ../..) +GOFLAGS:= +BUILD_DIR:=build +GO_DOWNLOAD_PATH:=$(BUILD_GOPATH) +CVL_PKG=$(TOP_DIR)/pkg/linux_amd64/cvl.a + +CVL_TEST_DIR = $(TOP_DIR)/build/tests/cvl +CVL_TEST_BIN = $(CVL_TEST_DIR)/cvl.test + +ifdef DEBUG + GOFLAGS += -gcflags="all=-N -l" +endif + +precheck: + $(shell mkdir -p $(BUILD_DIR)) + +deps: $(BUILD_DIR)/.deps $(CVL_PKG) $(CVL_TEST_BIN) + + +$(BUILD_DIR)/.deps: + touch $@ + +$(CVL_PKG): + @echo "Building $@" + GOPATH=$(GOPATH) $(GO) build -v $(GOFLAGS) cvl + GOPATH=$(GOPATH) $(GO) install cvl + +$(CVL_TEST_BIN): $(TEST_FILES) $(SRC_FILES) + GOPATH=$(GOPATH) $(GO) test -c -cover -coverpkg=cvl,cvl/internal/util,cvl/internal/yparser cvl -o $@ + cp -r testdata $(@D)/ + +install: + GOPATH=$(GO_DEP_PATH) $(GO) install + +schema: + make -C schema + +tests: + make -C tests + +gotest: + make -C schema + make -C testdata/schema + cp schema/*.yin testdata/schema + CVL_CFG_FILE=$(abspath .)/conf/cvl_cfg.json CVL_SCHEMA_PATH=$(abspath .)/testdata/schema GOPATH=$(GOPATH) tests/run_test.sh + +clean: + make -C tests clean + rm -rf $(CVL_PKG) + rm -rf $(CVL_TEST_DIR) + +cleanall: + rm -rf $(BUILD_DIR) + rm -rf $(CVL_PKG) + rm -rf $(CVL_TEST_DIR) + diff --git a/src/cvl/README.md b/src/cvl/README.md new file mode 100644 index 0000000000..9445cb22a8 --- /dev/null +++ b/src/cvl/README.md @@ -0,0 +1,62 @@ +1. Install latest version of pyang tool. + +2. Install libyang from https://github.com/CESNET/libyang along with its dependency. + +3. Run 'make' from top level 'cvl' directory. + +4. Refer to top level makefile rules for compiling individual targets. + +5. 'schema' directory should contain all .yin files + +6. On the target the 'schema' directory needs to be present in the same directory where application executable file is present. + + +Debugging Info: +=============== + +Below steps need to be done to enable CVL logging. + +1. Find the CVL json config file in mgmt-framework docker in switch at "/usr/sbin/cvl_cfg.json" . + +2. Change the logging flags from "false" to "true" as below: + + { + "TRACE_CACHE": "true", + "TRACE_LIBYANG": "true", + "TRACE_YPARSER": "true", + "TRACE_CREATE": "true", + "TRACE_UPDATE": "true", + "TRACE_DELETE": "true", + "TRACE_SEMANTIC": "true", + "TRACE_SYNTAX": "true", + "__comment1__": "Set LOGTOSTDER to 'true' to log on standard error", + "LOGTOSTDERR": "true", + "__comment2__": "Display log upto INFO level", + "STDERRTHRESHOLD": "INFO", + "__comment3__": "Display log upto INFO level 8", + "VERBOSITY": "8", + "SKIP_VALIDATION": "false", + "SKIP_SEMANTIC_VALIDATION": "false" + } +3. Below environment variables need to be set at the end in /usr/bin/rest-server.sh in mgmt-framework docker. + + export CVL_DEBUG=1 + export CVL_CFG_FILE=/usr/sbin/cvl_cfg.json + + Note : CVL_CFG_FILE enviroment variable can point to other location also. + +4. CVL Traces can be enabled both with restart and without mgmt-framework docker restart . + + With Restart: + ============ + Restart mgmt-framework docker after which updated cvl_cfg.json file will be read. + + Without Restart: + =============== + Issue SIGUSR2 to rest process(kill -SIGUSR2 , to read changed cvl_cfg.json with logging enabled. + +5. After following above steps, CVL traces can be seen in syslog file in host container at /var/log/syslog. + +6. To disable CVL traces , disable the fields in cvl_cfg.json file and then perform same steps as in Step 4. + + diff --git a/src/cvl/conf/cvl_cfg.json b/src/cvl/conf/cvl_cfg.json new file mode 100644 index 0000000000..1445bf3029 --- /dev/null +++ b/src/cvl/conf/cvl_cfg.json @@ -0,0 +1,20 @@ +{ + "TRACE_CACHE": "false", + "TRACE_LIBYANG": "false", + "TRACE_YPARSER": "false", + "TRACE_CREATE": "false", + "TRACE_UPDATE": "false", + "TRACE_DELETE": "false", + "TRACE_SEMANTIC": "false", + "TRACE_SYNTAX": "false", + "__comment1__": "Log trace data when error occurs", + "TRACE_ONERROR": "true", + "__comment2__": "Set LOGTOSTDER to 'true' to log on standard error", + "LOGTOSTDERR": "false", + "__comment3__": "Display log upto INFO level", + "STDERRTHRESHOLD": "ERROR", + "__comment4__": "Display log upto INFO level 8", + "VERBOSITY": "0", + "SKIP_VALIDATION": "false", + "SKIP_SEMANTIC_VALIDATION": "false" +} diff --git a/src/cvl/cvl.go b/src/cvl/cvl.go new file mode 100644 index 0000000000..375435acaf --- /dev/null +++ b/src/cvl/cvl.go @@ -0,0 +1,1864 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package cvl +import ( + "fmt" + "os" + "strings" + "regexp" + "time" + log "github.com/golang/glog" + "encoding/json" + "github.com/go-redis/redis" + "github.com/antchfx/xmlquery" + "github.com/antchfx/jsonquery" + "cvl/internal/yparser" + . "cvl/internal/util" + "sync" + "flag" + "runtime" +) + +//DB number +const ( + APPL_DB uint8 = 0 + iota + ASIC_DB + COUNTERS_DB + LOGLEVEL_DB + CONFIG_DB + PFC_WD_DB + FLEX_COUNTER_DB = PFC_WD_DB + STATE_DB + SNMP_OVERLAY_DB + INVALID_DB +) + +const DEFAULT_CACHE_DURATION uint16 = 300 /* 300 sec */ +const MAX_BULK_ENTRIES_IN_PIPELINE int = 50 + +var reLeafRef *regexp.Regexp = nil +var reHashRef *regexp.Regexp = nil +var reSelKeyVal *regexp.Regexp = nil +var reLeafInXpath *regexp.Regexp = nil + +var cvlInitialized bool +var dbNameToDbNum map[string]uint8 + +//map of lua script loaded +var luaScripts map[string]*redis.Script + +//var tmpDbCache map[string]interface{} //map of table storing map of key-value pair + //m["PORT_TABLE] = {"key" : {"f1": "v1"}} +//Important schema information to be loaded at bootup time +type modelTableInfo struct { + dbNum uint8 + modelName string + redisTableName string //To which Redis table it belongs to, used for 1 Redis to N Yang List + module *yparser.YParserModule + keys []string + redisKeyDelim string + redisKeyPattern string + mapLeaf []string //for 'mapping list' + leafRef map[string][]string //for storing all leafrefs for a leaf in a table, + //multiple leafref possible for union + mustExp map[string]string + tablesForMustExp map[string]CVLOperation +} + + +/* CVL Error Structure. */ +type CVLErrorInfo struct { + TableName string /* Table having error */ + ErrCode CVLRetCode /* CVL Error return Code. */ + CVLErrDetails string /* CVL Error Message details. */ + Keys []string /* Keys of the Table having error. */ + Value string /* Field Value throwing error */ + Field string /* Field Name throwing error . */ + Msg string /* Detailed error message. */ + ConstraintErrMsg string /* Constraint error message. */ + ErrAppTag string +} + +type CVL struct { + redisClient *redis.Client + yp *yparser.YParser + tmpDbCache map[string]interface{} //map of table storing map of key-value pair + requestCache map[string]map[string][]CVLEditConfigData //Cache of validated data, + //might be used as dependent data in next request + batchLeaf string + chkLeafRefWithOthCache bool +} + +type modelNamespace struct { + prefix string + ns string +} + +type modelDataInfo struct { + modelNs map[string]modelNamespace //model namespace + tableInfo map[string]*modelTableInfo //redis table to model name and keys + redisTableToYangList map[string][]string //Redis table to all YANG lists when it is not 1:1 mapping + allKeyDelims map[string]bool +} + +//Struct for storing global DB cache to store DB which are needed frequently like PORT +type dbCachedData struct { + root *yparser.YParserNode //Root of the cached data + startTime time.Time //When cache started + expiry uint16 //How long cache should be maintained in sec +} + +//Global data cache for redis table +type cvlGlobalSessionType struct { + db map[string]dbCachedData + pubsub *redis.PubSub + stopChan chan int //stop channel to stop notification listener + cv *CVL + mutex *sync.Mutex +} +var cvg cvlGlobalSessionType + +//Single redis client for validation +var redisClient *redis.Client + +//Stores important model info +var modelInfo modelDataInfo + +type keyValuePairStruct struct { + key string + values []string +} + +func TRACE_LOG(level log.Level, tracelevel CVLTraceLevel, fmtStr string, args ...interface{}) { + TRACE_LEVEL_LOG(level, tracelevel, fmtStr, args...) +} + +func CVL_LOG(level CVLLogLevel, fmtStr string, args ...interface{}) { + CVL_LEVEL_LOG(level, fmtStr, args...) +} + +//package init function +func init() { + if (os.Getenv("CVL_SCHEMA_PATH") != "") { + CVL_SCHEMA = os.Getenv("CVL_SCHEMA_PATH") + "/" + } + + if (os.Getenv("CVL_DEBUG") != "") { + SetTrace(true) + } + + ConfigFileSyncHandler() + + cvlCfgMap := ReadConfFile() + + if (cvlCfgMap != nil) { + if (strings.Compare(cvlCfgMap["LOGTOSTDERR"], "true") == 0) { + flag.Set("logtostderr", "true") + flag.Set("stderrthreshold", cvlCfgMap["STDERRTHRESHOLD"]) + flag.Set("v", cvlCfgMap["VERBOSITY"]) + } + + CVL_LOG(INFO ,"Current Values of CVL Configuration File %v", cvlCfgMap) + } + + //regular expression for leafref and hashref finding + reLeafRef = regexp.MustCompile(`.*[/]([a-zA-Z]*:)?(.*)[/]([a-zA-Z]*:)?(.*)`) + reHashRef = regexp.MustCompile(`\[(.*)\|(.*)\]`) + reSelKeyVal = regexp.MustCompile("=[ ]*['\"]?([0-9_a-zA-Z]+)['\"]?|(current[(][)])") + reLeafInXpath = regexp.MustCompile("(.*[:/]{1})([a-zA-Z0-9_-]+)([^a-zA-Z0-9_-]*)") + + Initialize() + + cvg.db = make(map[string]dbCachedData) + + //Global session keeps the global cache + cvg.cv, _ = ValidationSessOpen() + //Create buffer channel of length 1 + cvg.stopChan = make(chan int, 1) + //Initialize mutex + cvg.mutex = &sync.Mutex{} + + _, err := redisClient.ConfigSet("notify-keyspace-events", "AKE").Result() + if err != nil { + CVL_LOG(ERROR ,"Could not enable notification error %s", err) + } + + dbCacheSet(false, "PORT", 0) +} + +func Debug(on bool) { + yparser.Debug(on) +} + +//Get attribute value of xml node +func getXmlNodeAttr(node *xmlquery.Node, attrName string) string { + for _, attr := range node.Attr { + if (attrName == attr.Name.Local) { + return attr.Value + } + } + + return "" +} + +//Store useful schema data during initialization +func storeModelInfo(modelFile string, module *yparser.YParserModule) { //such model info can be maintained in C code and fetched from there + f, err := os.Open(CVL_SCHEMA + modelFile) + root, err := xmlquery.Parse(f) + + if err != nil { + return + } + f.Close() + + //model is derived from file name + tokens := strings.Split(modelFile, ".") + modelName := tokens[0] + + //Store namespace + modelNs := modelNamespace{} + + nodes := xmlquery.Find(root, "//module/namespace") + if (nodes != nil) { + modelNs.ns = nodes[0].Attr[0].Value + } + + nodes = xmlquery.Find(root, "//module/prefix") + if (nodes != nil) { + modelNs.prefix = nodes[0].Attr[0].Value + } + + modelInfo.modelNs[modelName] = modelNs + + //Store metadata present in each list. + //Each list represent one Redis table in general. + //However when one Redis table is mapped to multiple + //YANG lists need to store the information in redisTableToYangList map + nodes = xmlquery.Find(root, "//module/container/container/list") + if (nodes == nil) { + return + } + + //number list under one table container i.e. ACL_TABLE container + //has only one ACL_TABLE_LIST list + for _, node := range nodes { + //for each list, remove "_LIST" suffix + tableName := node.Attr[0].Value + if (strings.HasSuffix(tableName, "_LIST")) { + tableName = tableName[0:len(tableName) - len("_LIST")] + } + tableInfo := modelTableInfo{modelName: modelName} + //Store Redis table name + tableInfo.redisTableName = node.Parent.Attr[0].Value + //Store the reference for list node to be used later + listNode := node + node = node.FirstChild + //Default database is CONFIG_DB since CVL works with config db mainly + tableInfo.module = module + tableInfo.dbNum = CONFIG_DB + //default delim '|' + tableInfo.redisKeyDelim = "|" + modelInfo.allKeyDelims[tableInfo.redisKeyDelim] = true + + fieldCount := 0 + + //Check for meta data in schema + for node != nil { + switch node.Data { + case "db-name": + tableInfo.dbNum = dbNameToDbNum[node.Attr[0].Value] + fieldCount++ + case "key": + tableInfo.keys = strings.Split(node.Attr[0].Value," ") + fieldCount++ + keypattern := []string{tableName} + + /* Create the default key pattern of the form Table Name|{key1}|{key2}. */ + for _ , key := range tableInfo.keys { + keypattern = append(keypattern, fmt.Sprintf("{%s}",key)) + } + + tableInfo.redisKeyPattern = strings.Join(keypattern, tableInfo.redisKeyDelim) + + case "key-delim": + tableInfo.redisKeyDelim = node.Attr[0].Value + fieldCount++ + //store all possible key delims + modelInfo.allKeyDelims[tableInfo.redisKeyDelim] = true + case "key-pattern": + tableInfo.redisKeyPattern = node.Attr[0].Value + fieldCount++ + case "map-leaf": + tableInfo.mapLeaf = strings.Split(node.Attr[0].Value," ") + fieldCount++ + } + node = node.NextSibling + } + + //Find and store all leafref under each table + /* + if (listNode == nil) { + //Store the tableInfo in global data + modelInfo.tableInfo[tableName] = tableInfo + + continue + } + */ + + //If container has more than one list, it means one Redis table is mapped to + //multiple lists, store the info in redisTableToYangList + allLists := xmlquery.Find(listNode.Parent, "/list") + if len(allLists) > 1 { + yangList := modelInfo.redisTableToYangList[tableInfo.redisTableName] + yangList = append(yangList, tableName) + //Update the map + modelInfo.redisTableToYangList[tableInfo.redisTableName] = yangList + } + + leafRefNodes := xmlquery.Find(listNode, "//type[@name='leafref']") + if (leafRefNodes == nil) { + //Store the tableInfo in global data + modelInfo.tableInfo[tableName] = &tableInfo + + continue + } + + tableInfo.leafRef = make(map[string][]string) + for _, leafRefNode := range leafRefNodes { + if (leafRefNode.Parent == nil || leafRefNode.FirstChild == nil) { + continue + } + + //Get the leaf/leaf-list name holding this leafref + //Note that leaf can have union of leafrefs + leafName := "" + for node := leafRefNode.Parent; node != nil; node = node.Parent { + if (node.Data == "leaf" || node.Data == "leaf-list") { + leafName = getXmlNodeAttr(node, "name") + break + } + } + + //Store the leafref path + if (leafName != "") { + tableInfo.leafRef[leafName] = append(tableInfo.leafRef[leafName], + getXmlNodeAttr(leafRefNode.FirstChild, "value")) + } + } + + //Find all 'must' expression and store the against its parent node + mustExps := xmlquery.Find(listNode, "//must") + if (mustExps == nil) { + //Update the tableInfo in global data + modelInfo.tableInfo[tableName] = &tableInfo + continue + } + + tableInfo.mustExp = make(map[string]string) + for _, mustExp := range mustExps { + if (mustExp.Parent == nil) { + continue + } + parentName := "" + for node := mustExp.Parent; node != nil; node = node.Parent { + //assuming must exp is at leaf or list level + if (node.Data == "leaf" || node.Data == "leaf-list" || + node.Data == "list") { + parentName = getXmlNodeAttr(node, "name") + break + } + } + if (parentName != "") { + tableInfo.mustExp[parentName] = getXmlNodeAttr(mustExp, "condition") + } + } + + //Update the tableInfo in global data + modelInfo.tableInfo[tableName] = &tableInfo + + } +} + +//Find the tables names in must expression, these tables data need to be fetched +//during semantic validation +func addTableNamesForMustExp() { + + for tblName, tblInfo := range modelInfo.tableInfo { + if (tblInfo.mustExp == nil) { + continue + } + + tblInfo.tablesForMustExp = make(map[string]CVLOperation) + + for _, mustExp := range tblInfo.mustExp { + var op CVLOperation = OP_NONE + //Check if 'must' expression should be executed for a particular operation + if (strings.Contains(mustExp, + "/scommon:operation/scommon:operation != CREATE") == true) { + op = op | OP_CREATE + } else if (strings.Contains(mustExp, + "/scommon:operation/scommon:operation != UPDATE") == true) { + op = op | OP_UPDATE + } else if (strings.Contains(mustExp, + "/scommon:operation/scommon:operation != DELETE") == true) { + op = op | OP_DELETE + } + + //store the current table if aggregate function like count() is used + /*if (strings.Contains(mustExp, "count") == true) { + tblInfo.tablesForMustExp[tblName] = op + }*/ + + //check which table name is present in the must expression + for tblNameSrch, _ := range modelInfo.tableInfo { + if (tblNameSrch == tblName) { + continue + } + //Table name should appear like "../VLAN_MEMBER/tagging_mode' or ' + // "/prt:PORT/prt:ifname" + re := regexp.MustCompile(fmt.Sprintf(".*[/]([a-zA-Z]*:)?%s[\\[/]", tblNameSrch)) + matches := re.FindStringSubmatch(mustExp) + if (len(matches) > 0) { + //stores the table name + tblInfo.tablesForMustExp[tblNameSrch] = op + } + } + } + + //update map + modelInfo.tableInfo[tblName] = tblInfo + } +} + +//Split key into table prefix and key +func splitRedisKey(key string) (string, string) { + + var foundIdx int = -1 + //Check with all key delim + for keyDelim, _ := range modelInfo.allKeyDelims { + foundIdx = strings.Index(key, keyDelim) + if (foundIdx >= 0) { + //Matched with key delim + break + } + } + + if (foundIdx < 0) { + //No matches + return "", "" + } + + tblName := key[:foundIdx] + + if _, exists := modelInfo.tableInfo[tblName]; exists == false { + //Wrong table name + return "", "" + } + + prefixLen := foundIdx + 1 + + return tblName, key[prefixLen:] +} + +//Get the YANG list name from Redis key +//This just returns same YANG list name as Redis table name +//when 1:1 mapping is there. For one Redis table to +//multiple YANG list, it returns appropriate YANG list name +//INTERFACE:Ethernet12 returns ==> INTERFACE +//INTERFACE:Ethernet12:1.1.1.0/32 ==> INTERFACE_IPADDR +func getRedisKeyToYangList(tableName, key string) string { + mapArr, exists := modelInfo.redisTableToYangList[tableName] + + if exists == false { + //1:1 mapping case + return tableName + } + + //As of now determine the mapping based on number of keys + var foundIdx int = -1 + numOfKeys := 1 //Assume only one key initially + for keyDelim, _ := range modelInfo.allKeyDelims { + foundIdx = strings.Index(key, keyDelim) + if (foundIdx >= 0) { + //Matched with key delim + keyComps := strings.Split(key, keyDelim) + numOfKeys = len(keyComps) + break + } + } + + //Check which list has number of keys as 'numOfKeys' + for i := 0; i < len(mapArr); i++ { + tblInfo, exists := modelInfo.tableInfo[mapArr[i]] + if exists == true { + if (len(tblInfo.keys) == numOfKeys) { + //Found the YANG list matching the number of keys + return mapArr[i] + } + } + } + + //No matches + return tableName +} + +//Convert Redis key to Yang keys, if multiple key components are there, +//they are separated based on Yang schema +func getRedisToYangKeys(tableName string, redisKey string)[]keyValuePairStruct{ + keyNames := modelInfo.tableInfo[tableName].keys + //First split all the keys components + keyVals := strings.Split(redisKey, modelInfo.tableInfo[tableName].redisKeyDelim) //split by DB separator + //Store patterns for each key components by splitting using key delim + keyPatterns := strings.Split(modelInfo.tableInfo[tableName].redisKeyPattern, + modelInfo.tableInfo[tableName].redisKeyDelim) //split by DB separator + + /* TBD. Workaround for optional keys in INTERFACE Table. + Code will be removed once model is finalized. */ + if ((tableName == "INTERFACE") && (len(keyNames) != len(keyVals))) { + keyVals = append(keyVals, "0.0.0.0/0") + + } else if (len(keyNames) != len(keyVals)) { + return nil //number key names and values does not match + } + + mkeys := []keyValuePairStruct{} + //For each key check the pattern and store key/value pair accordingly + for idx, keyName := range keyNames { + + //check if key-pattern contains specific key pattern + if (keyPatterns[idx+1] == fmt.Sprintf("({%s},)*", keyName)) { // key pattern is "({key},)*" i.e. repeating keys seperated by ',' + repeatedKeys := strings.Split(keyVals[idx], ",") + mkeys = append(mkeys, keyValuePairStruct{keyName, repeatedKeys}) + + } else if (keyPatterns[idx+1] == fmt.Sprintf("{%s}", keyName)) { //no specific key pattern - just "{key}" + + //Store key/value mapping + mkeys = append(mkeys, keyValuePairStruct{keyName, []string{keyVals[idx]}}) + } + } + + return mkeys +} + + +//Add child node to a parent node +func(c *CVL) addChildNode(tableName string, parent *yparser.YParserNode, name string) *yparser.YParserNode { + + //return C.lyd_new(parent, modelInfo.tableInfo[tableName].module, C.CString(name)) + return c.yp.AddChildNode(modelInfo.tableInfo[tableName].module, parent, name) +} + +//Check for path resolution +func (c *CVL) checkPathForTableEntry(tableName string, currentValue string, cfgData *CVLEditConfigData, mustExpStk []string, token string) ([]string, string, CVLRetCode) { + + n := len(mustExpStk) - 1 + xpath := "" + + if (token == ")") { + for n = len(mustExpStk) - 1; mustExpStk[n] != "("; n = len(mustExpStk) - 1 { + //pop until "(" + xpath = mustExpStk[n] + xpath + mustExpStk = mustExpStk[:n] + } + } else if (token == "]") { + //pop until "[" + for n = len(mustExpStk) - 1; mustExpStk[n] != "["; n = len(mustExpStk) - 1 { + xpath = mustExpStk[n] + xpath + mustExpStk = mustExpStk[:n] + } + } + + mustExpStk = mustExpStk[:n] + targetTbl := "" + //Search the table name in xpath + for tblNameSrch, _ := range modelInfo.tableInfo { + if (tblNameSrch == tableName) { + continue + } + //Table name should appear like "../VLAN_MEMBER/tagging_mode' or ' + // "/prt:PORT/prt:ifname" + //re := regexp.MustCompile(fmt.Sprintf(".*[/]([a-zA-Z]*:)?%s[\\[/]", tblNameSrch)) + tblSrchIdx := strings.Index(xpath, fmt.Sprintf("/%s_LIST", tblNameSrch)) //no preifx + if (tblSrchIdx < 0) { + tblSrchIdx = strings.Index(xpath, fmt.Sprintf(":%s_LIST", tblNameSrch)) //with prefix + } + if (tblSrchIdx < 0) { + continue + } + + tblSrchIdxEnd := strings.Index(xpath[tblSrchIdx+len(tblNameSrch)+1:], "[") + if (tblSrchIdxEnd < 0) { + tblSrchIdxEnd = strings.Index(xpath[tblSrchIdx+len(tblNameSrch)+1:], "/") + } + + if (tblSrchIdxEnd >= 0) { //match found + targetTbl = tblNameSrch + break + } + } + + //No match with table found, could be just keys like 'aclname='TestACL1' + //just return the same + if (targetTbl == "") { + return mustExpStk, xpath, CVL_SUCCESS + } + + tableKey := targetTbl + //Add the keys + keyNames := modelInfo.tableInfo[tableKey].keys + + //Form the Redis Key to fetch the entry + for idx, keyName := range keyNames { + //Key value is string/numeric literal, extract the same + keySrchIdx := strings.Index(xpath, keyName) + if (keySrchIdx < 0 ) { + continue + } + + matches := reSelKeyVal.FindStringSubmatch(xpath[keySrchIdx+len(keyName):]) + if (len(matches) > 1) { + if (matches[1] == "current()") { + //replace with current field value + tableKey = tableKey + "*" + modelInfo.tableInfo[tableName].redisKeyDelim + currentValue + } else { + //Use literal + tableKey = tableKey + "*" + modelInfo.tableInfo[tableName].redisKeyDelim + matches[1] + } + + if (idx != len(keyNames) - 1) { + tableKey = tableKey + "|*" + } + } + } + + //Fetch the entries + redisTableKeys, err:= redisClient.Keys(tableKey).Result() + + if (err !=nil || len (redisTableKeys) > 1) { //more than one entry is returned, can't proceed further + //Just add all the entries for caching + for _, redisTableKey := range redisTableKeys { + c.addTableEntryToCache(splitRedisKey(redisTableKey)) + } + + return mustExpStk, "", CVL_SUCCESS + } + + for _, redisTableKey := range redisTableKeys { + + var entry map[string]string + + if tmpEntry, mergeNeeded := c.fetchDataFromRequestCache(splitRedisKey(redisTableKey)); (tmpEntry == nil || mergeNeeded == true) { + //If data is not available in validated cache fetch from Redis DB + entry, err = redisClient.HGetAll(redisTableKey).Result() + + if (mergeNeeded) { + mergeMap(entry, tmpEntry) + } + } + + //Get the entry fields from Redis + if (entry != nil) { + //Just add all the entries for caching + c.addTableEntryToCache(splitRedisKey(redisTableKey)) + + leafInPath := "" + index := strings.LastIndex(xpath, "/") + if (index >= 0) { + + matches := reLeafInXpath.FindStringSubmatch(xpath[index:]) + if (len(matches) > 2) { //should return atleasts two subgroup and entire match + leafInPath = matches[2] + } else { + //No leaf requested in xpath selection + return mustExpStk, "", CVL_SUCCESS + } + + index = strings.Index(xpath, "=") + tblIndex := strings.Index(xpath, targetTbl) + if (index >= 0 && tblIndex >=0) { + + if leafVal, existing := entry[leafInPath + "@"]; existing == true { + //Get the field value referred in the xpath + if (index < tblIndex) { + // case like - [ifname=../../ACL_TABLE[aclname=current()] + return mustExpStk, xpath[:index+1] + leafVal, CVL_SUCCESS + } else { + // case like - [ifname=current()] + return mustExpStk, leafVal, CVL_SUCCESS + } + } else { + + if (index < tblIndex) { + return mustExpStk, xpath[:index+1] + entry[leafInPath], CVL_SUCCESS + } else { + return mustExpStk, entry[leafInPath], CVL_SUCCESS + } + } + } + } + } + } + + return mustExpStk, "", CVL_FAILURE +} + +//Add specific entries by looking at must expression +//Must expression may need single or multiple entries +//It can be within same table or across multiple tables +//Node-set function such count() can be quite expensive and +//should be avoided through this function +func (c *CVL) addTableEntryForMustExp(cfgData *CVLEditConfigData, tableName string) CVLRetCode { + if (modelInfo.tableInfo[tableName].mustExp == nil) { + return CVL_SUCCESS + } + + for fieldName, mustExp := range modelInfo.tableInfo[tableName].mustExp { + + currentValue := "" // Current value for current() function + + //Get the current() field value from the entry being created/updated/deleted + keyValuePair := getRedisToYangKeys(tableName, cfgData.Key[len(tableName)+1:]) + + //Try to get the current() from the 'key' provided + if (keyValuePair != nil) { + for _, keyValItem := range keyValuePair { + if (keyValItem.key == fieldName) { + currentValue = keyValItem.values[0] + } + } + } + + //current() value needs to be fetched from other field + if (currentValue == "") { + if (cfgData.VOp == OP_CREATE) { + if (tableName != fieldName) { //must expression is not at list level + currentValue = cfgData.Data[fieldName] + if (currentValue == "") { + currentValue = cfgData.Data[fieldName + "@"] + } + } + } else if (cfgData.VOp == OP_UPDATE || cfgData.VOp == OP_DELETE) { + //fetch the entry to get current() value + c.clearTmpDbCache() + entryKey := cfgData.Key[len(tableName)+1:] + c.tmpDbCache[tableName] = map[string]interface{}{entryKey: nil} + + if (c.fetchTableDataToTmpCache(tableName, + map[string]interface{}{entryKey: nil}) > 0) { + mapTable := c.tmpDbCache[tableName] + if fields, existing := mapTable.(map[string]interface{})[entryKey]; existing == true { + currentValue = fmt.Sprintf("%v", fields.(map[string]interface{})[fieldName]) + } + } + } + } + + mustExpStk := []string{} //Use the string slice as stack + mustExpStr := "(" + mustExp + ")" + strLen := len(mustExpStr) + strTmp := "" + //Parse the xpath expression and fetch Redis entry by looking at xpath, + // any xpath function call is ignored except current(). + for i := 0; i < strLen; i++ { + switch mustExpStr[i] { + case '(': + if (mustExpStr[i+1] == ')') { + strTmp = strTmp + "()" + if index := strings.Index(strTmp, "current()"); index >= 0 { + strTmp = strTmp[:index] + currentValue + } + i = i + 1 + continue + } + if (strTmp != "") { + mustExpStk = append(mustExpStk, strTmp) + } + mustExpStk = append(mustExpStk, "(") + strTmp = "" + case ')': + if (strTmp != "") { + mustExpStk = append(mustExpStk, strTmp) + } + strTmp = "" + //Check Path - pop until ')' + mustExpStk, evalPath,_ := c.checkPathForTableEntry(tableName, currentValue, cfgData, + mustExpStk, ")") + if (evalPath != "") { + mustExpStk = append(mustExpStk, evalPath) + } + mustExpStk = append(mustExpStk, ")") + case '[': + if (strTmp != "") { + mustExpStk = append(mustExpStk, strTmp) + } + mustExpStk = append(mustExpStk, "[") + strTmp = "" + case ']': + if (strTmp != "") { + mustExpStk = append(mustExpStk, strTmp) + } + //Check Path - pop until = or '[' + mustExpStk, evalPath,_ := c.checkPathForTableEntry(tableName, currentValue, cfgData, + mustExpStk, "]") + if (evalPath != "") { + mustExpStk = append(mustExpStk, "[" + evalPath + "]") + } + strTmp = "" + default: + strTmp = fmt.Sprintf("%s%c", strTmp, mustExpStr[i]) + } + } + + //Get the redis data for accumulated keys and add them to session cache + depData := c.fetchDataToTmpCache() //fetch data to temp cache for temporary validation + + if (depData != nil) { + if (Tracing == true) { + TRACE_LOG(INFO_API, TRACE_CACHE, "Adding entries for 'must' expression : %s", c.yp.NodeDump(depData)) + } + } else { + //Could not fetch any entry from Redis after xpath evaluation + return CVL_FAILURE + } + + if errObj := c.yp.CacheSubtree(false, depData); errObj.ErrCode != yparser.YP_SUCCESS { + return CVL_FAILURE + } + + } //for each must expression + + return CVL_SUCCESS +} + +//Add all other table data for validating all 'must' exp for tableName +func (c *CVL) addTableDataForMustExp(op CVLOperation, tableName string) CVLRetCode { + if (modelInfo.tableInfo[tableName].mustExp == nil) { + return CVL_SUCCESS + } + + for mustTblName, mustOp := range modelInfo.tableInfo[tableName].tablesForMustExp { + //First check if must expression should be executed for the given operation + if (mustOp != OP_NONE) && ((mustOp & op) == OP_NONE) { + //must to be excuted for particular operation, but current operation + //is not the same one + continue + } + + //Check in global cache first and merge to session cache + if topNode, _ := dbCacheGet(mustTblName); topNode != nil { + var errObj yparser.YParserError + //If global cache has the table, add to the session validation + TRACE_LOG(INFO_API, TRACE_CACHE, "Adding global cache to session cache for table %s", tableName) + if errObj = c.yp.CacheSubtree(true, topNode); errObj.ErrCode != yparser.YP_SUCCESS { + return CVL_SYNTAX_ERROR + } + } else { //Put the must table in global table and add to session cache + cvg.cv.chkLeafRefWithOthCache = true + dbCacheSet(false, mustTblName, 100*DEFAULT_CACHE_DURATION) //Keep the cache for default duration + cvg.cv.chkLeafRefWithOthCache = false + + if topNode, ret := dbCacheGet(mustTblName); topNode != nil { + var errObj yparser.YParserError + //If global cache has the table, add to the session validation + TRACE_LOG(INFO_API, TRACE_CACHE, "Global cache created, add the data to session cache for table %s", tableName) + if errObj = c.yp.CacheSubtree(true, topNode); errObj.ErrCode != yparser.YP_SUCCESS { + return CVL_SYNTAX_ERROR + } + } else if (ret == CVL_SUCCESS) { + TRACE_LOG(INFO_API, TRACE_CACHE, "Global cache empty, no data in Redis for table %s", tableName) + return CVL_SUCCESS + } else { + CVL_LOG(ERROR ,"Could not create global cache for table %s", mustTblName) + return CVL_ERROR + } + + + /* + tableKeys, err:= redisClient.Keys(mustTblName + + modelInfo.tableInfo[mustTblName].redisKeyDelim + "*").Result() + + if (err != nil) { + continue + } + + for _, tableKey := range tableKeys { + tableKey = tableKey[len(mustTblName+ modelInfo.tableInfo[mustTblName].redisKeyDelim):] //remove table prefix + if (c.tmpDbCache[mustTblName] == nil) { + c.tmpDbCache[mustTblName] = map[string]interface{}{tableKey: nil} + } else { + tblMap := c.tmpDbCache[mustTblName] + tblMap.(map[string]interface{})[tableKey] =nil + c.tmpDbCache[mustTblName] = tblMap + } + } + */ + } + } + + return CVL_SUCCESS +} + +func (c *CVL) addTableEntryToCache(tableName string, redisKey string) { + if (tableName == "" || redisKey == "") { + return + } + + if (c.tmpDbCache[tableName] == nil) { + c.tmpDbCache[tableName] = map[string]interface{}{redisKey: nil} + } else { + tblMap := c.tmpDbCache[tableName] + tblMap.(map[string]interface{})[redisKey] =nil + c.tmpDbCache[tableName] = tblMap + } +} + +//Check delete constraint for leafref if key/field is deleted +func (c *CVL) checkDeleteConstraint(cfgData []CVLEditConfigData, + tableName, keyVal, field string) CVLRetCode { + var leafRefs []tblFieldPair + if (field != "") { + //Leaf or field is getting deleted + leafRefs = c.findUsedAsLeafRef(tableName, field) + } else { + //Entire entry is getting deleted + leafRefs = c.findUsedAsLeafRef(tableName, modelInfo.tableInfo[tableName].keys[0]) + } + + //The entry getting deleted might have been referred from multiple tables + //Return failure if at-least one table is using this entry + for _, leafRef := range leafRefs { + TRACE_LOG(INFO_API, (TRACE_DELETE | TRACE_SEMANTIC), "Checking delete constraint for leafRef %s/%s", leafRef.tableName, leafRef.field) + //Check in dependent data first, if the referred entry is already deleted + leafRefDeleted := false + for _, cfgDataItem := range cfgData { + if (cfgDataItem.VType == VALIDATE_NONE) && + (cfgDataItem.VOp == OP_DELETE ) && + (strings.HasPrefix(cfgDataItem.Key, (leafRef.tableName + modelInfo.tableInfo[leafRef.tableName].redisKeyDelim + keyVal + modelInfo.tableInfo[leafRef.tableName].redisKeyDelim))) { + //Currently, checking for one entry is being deleted in same session + //We should check for all entries + leafRefDeleted = true + break + } + } + + if (leafRefDeleted == true) { + continue //check next leafref + } + + //Else, check if any referred enrty is present in DB + var nokey []string + refKeyVal, err := luaScripts["find_key"].Run(redisClient, nokey, leafRef.tableName, + modelInfo.tableInfo[leafRef.tableName].redisKeyDelim, leafRef.field, keyVal).Result() + if (err == nil && refKeyVal != "") { + CVL_LOG(ERROR, "Delete will violate the constraint as entry %s is referred in %s", tableName, refKeyVal) + + return CVL_SEMANTIC_ERROR + } + } + + + return CVL_SUCCESS +} + +//Add the data which are referring this key +func (c *CVL) updateDeleteDataToCache(tableName string, redisKey string) { + if _, existing := c.tmpDbCache[tableName]; existing == false { + return + } else { + tblMap := c.tmpDbCache[tableName] + if _, existing := tblMap.(map[string]interface{})[redisKey]; existing == true { + delete(tblMap.(map[string]interface{}), redisKey) + c.tmpDbCache[tableName] = tblMap + } + } +} + +//Find which all tables (and which field) is using given (tableName/field) +// as leafref +//Use LUA script to find if table has any entry for this leafref + +type tblFieldPair struct { + tableName string + field string +} + +func (c *CVL) findUsedAsLeafRef(tableName, field string) []tblFieldPair { + + var tblFieldPairArr []tblFieldPair + + for tblName, tblInfo := range modelInfo.tableInfo { + if (tableName == tblName) { + continue + } + if (len(tblInfo.leafRef) == 0) { + continue + } + + for fieldName, leafRefs := range tblInfo.leafRef { + found := false + //Find leafref by searching table and field name + for _, leafRef := range leafRefs { + if ((strings.Contains(leafRef, tableName) == true) && + (strings.Contains(leafRef, field) == true)) { + tblFieldPairArr = append(tblFieldPairArr, + tblFieldPair{tblName, fieldName}) + //Found as leafref, no need to search further + found = true + break + } + } + + if (found == true) { + break + } + } + } + + return tblFieldPairArr +} + +//Add leafref entry for caching +//It has to be recursive in nature, as there can be chained leafref +func (c *CVL) addLeafRef(config bool, tableName string, name string, value string) { + + if (config == false) { + return + } + + //Check if leafRef entry is there for this field + if (len(modelInfo.tableInfo[tableName].leafRef[name]) > 0) { //array of leafrefs for a leaf + for _, leafRef := range modelInfo.tableInfo[tableName].leafRef[name] { + + //Get reference table name from the path and the leaf name + matches := reLeafRef.FindStringSubmatch(leafRef) + + //We have the leafref table name and the leaf name as well + if (matches != nil && len(matches) == 5) { //whole + 4 sub matches + refTableName := matches[2] + redisKey := value + + //Check if leafref dependency can also be met from 'must' table + if (c.chkLeafRefWithOthCache == true) { + found := false + for mustTbl, _ := range modelInfo.tableInfo[tableName].tablesForMustExp { + if mustTbl == refTableName { + found = true + break + } + } + if (found == true) { + //Leafref data will be available from must table dep data, skip this leafref entry + continue + } + } + + //only key is there, value wil be fetched and stored here, + //if value can't fetched this entry will be deleted that time + //Strip "_LIST" suffix + refRedisTableName := refTableName[0:len(refTableName) - len("_LIST")] + if (c.tmpDbCache[refRedisTableName] == nil) { + c.tmpDbCache[refRedisTableName] = map[string]interface{}{redisKey: nil} + } else { + tblMap := c.tmpDbCache[refRedisTableName] + _, exist := tblMap.(map[string]interface{})[redisKey] + if (exist == false) { + tblMap.(map[string]interface{})[redisKey] = nil + c.tmpDbCache[refRedisTableName] = tblMap + } + } + } + } + } +} + + +func (c *CVL) addChildLeaf(config bool, tableName string, parent *yparser.YParserNode, name string, value string) { + + /* If there is no value then assign default space string. */ + if len(value) == 0 { + value = " " + } + + //Batch leaf creation + c.batchLeaf = c.batchLeaf + name + "#" + value + "#" + //Check if this leaf has leafref, + //If so add the add redis key to its table so that those + // details can be fetched for dependency validation + + c.addLeafRef(config, tableName, name, value) +} + + +func (c *CVL) checkFieldMap(fieldMap *map[string]string) map[string]interface{} { + fieldMapNew := map[string]interface{}{} + + for field, value := range *fieldMap { + if (field == "NULL") { + continue + } else if (field[len(field)-1:] == "@") { + //last char @ means it is a leaf-list/array of fields + field = field[:len(field)-1] //strip @ + //split the values seprated using ',' + strArr := strings.Split(value, ",") + //fieldMapNew[field] = strings.Split(value, ",") + arrMap := make([]interface{}, 0)//len(strArr)) + for _, strArrItem := range strArr { + arrMap = append(arrMap, strArrItem) + } + fieldMapNew[field] = arrMap//make([]interface{}, len(strArr)) + } else { + fieldMapNew[field] = value + } + } + + return fieldMapNew +} + +//Merge 'src' map to 'dest' map of map[string]string type +func mergeMap(dest map[string]string, src map[string]string) { + for key, data := range src { + dest[key] = data + } +} + +// Fetch dependent data from validated data cache, +// Returns the data and flag to indicate that if requested data +// is found in update request, the data should be merged with Redis data +func (c *CVL) fetchDataFromRequestCache(tableName string, key string) (map[string]string, bool) { + cfgDataArr := c.requestCache[tableName][key] + if (cfgDataArr != nil) { + for _, cfgReqData := range cfgDataArr { + //Delete request doesn't have depedent data + if (cfgReqData.VOp == OP_CREATE) { + return cfgReqData.Data, false + } else if (cfgReqData.VOp == OP_UPDATE) { + return cfgReqData.Data, true + } + } + } + + return nil, false +} + +//Fetch given table entries using pipeline +func (c *CVL) fetchTableDataToTmpCache(tableName string, dbKeys map[string]interface{}) int { + + TRACE_LOG(INFO_API, TRACE_CACHE, "\n%v, Entered fetchTableDataToTmpCache", time.Now()) + + totalCount := len(dbKeys) + if (totalCount == 0) { + //No entry to be fetched + return 0 + } + + entryFetched := 0 + bulkCount := 0 + bulkKeys := []string{} + for dbKey, val := range dbKeys { //for all keys + + if (val != nil) { //skip entry already fetched + mapTable := c.tmpDbCache[tableName] + delete(mapTable.(map[string]interface{}), dbKey) //delete entry already fetched + totalCount = totalCount - 1 + if(bulkCount != totalCount) { + //If some entries are remaining go back to 'for' loop + continue + } + } else { + //Accumulate entries to be fetched + bulkKeys = append(bulkKeys, dbKey) + bulkCount = bulkCount + 1 + } + + if(bulkCount != totalCount) && ((bulkCount % MAX_BULK_ENTRIES_IN_PIPELINE) != 0) { + //If some entries are remaining and bulk bucket is not filled, + //go back to 'for' loop + continue + } + + mCmd := map[string]*redis.StringStringMapCmd{} + + pipe := redisClient.Pipeline() + + for _, dbKey := range bulkKeys { + + redisKey := tableName + modelInfo.tableInfo[tableName].redisKeyDelim + dbKey + //Check in validated cache first and add as dependent data + if entry, mergeNeeded := c.fetchDataFromRequestCache(tableName, dbKey); (entry != nil) { + c.tmpDbCache[tableName].(map[string]interface{})[dbKey] = entry + entryFetched = entryFetched + 1 + //Entry found in validated cache, so skip fetching from Redis + //if merging is not required with Redis DB + if (mergeNeeded == false) { + continue + } + } + + //Otherwise fetch it from Redis + mCmd[dbKey] = pipe.HGetAll(redisKey) //write into pipeline + if mCmd[dbKey] == nil { + CVL_LOG(ERROR, "Failed pipe.HGetAll('%s')", redisKey) + } + } + + _, err := pipe.Exec() + if err != nil { + CVL_LOG(ERROR, "Failed to fetch details for table %s", tableName) + return 0 + } + pipe.Close() + bulkKeys = nil + + mapTable := c.tmpDbCache[tableName] + + for key, val := range mCmd { + res, err := val.Result() + if (err != nil || len(res) == 0) { + //no data found, don't keep blank entry + delete(mapTable.(map[string]interface{}), key) + continue + } + //exclude table name and delim + keyOnly := key + + if (mapTable.(map[string]interface{})[keyOnly] != nil) { + tmpFieldMap := (mapTable.(map[string]interface{})[keyOnly]).(map[string]string) + //merge with validated cache data + mergeMap(res, tmpFieldMap) + fieldMap := c.checkFieldMap(&res) + mapTable.(map[string]interface{})[keyOnly] = fieldMap + } else { + fieldMap := c.checkFieldMap(&res) + mapTable.(map[string]interface{})[keyOnly] = fieldMap + } + + entryFetched = entryFetched + 1 + } + + runtime.Gosched() + } + + TRACE_LOG(INFO_API, TRACE_CACHE,"\n%v, Exiting fetchTableDataToTmpCache", time.Now()) + + return entryFetched +} + +//populate redis data to cache +func (c *CVL) fetchDataToTmpCache() *yparser.YParserNode { + TRACE_LOG(INFO_API, TRACE_CACHE, "\n%v, Entered fetchToTmpCache", time.Now()) + + entryToFetch := 0 + var root *yparser.YParserNode = nil + var errObj yparser.YParserError + + for entryToFetch = 1; entryToFetch > 0; { //Force to enter the loop for first time + //Repeat until all entries are fetched + entryToFetch = 0 + for tableName, dbKeys := range c.tmpDbCache { //for each table + entryToFetch = entryToFetch + c.fetchTableDataToTmpCache(tableName, dbKeys.(map[string]interface{})) + } //for each table + + //If no table entry delete the table itself + for tableName, dbKeys := range c.tmpDbCache { //for each table + if (len(dbKeys.(map[string]interface{})) == 0) { + delete(c.tmpDbCache, tableName) + continue + } + } + + if (entryToFetch == 0) { + //No more entry to fetch + break + } + + if (Tracing == true) { + jsonDataBytes, _ := json.Marshal(c.tmpDbCache) + jsonData := string(jsonDataBytes) + TRACE_LOG(INFO_API, TRACE_CACHE, "Top Node=%v\n", jsonData) + } + + data, err := jsonquery.ParseJsonMap(&c.tmpDbCache) + + if (err != nil) { + return nil + } + + //Build yang tree for each table and cache it + for jsonNode := data.FirstChild; jsonNode != nil; jsonNode=jsonNode.NextSibling { + TRACE_LOG(INFO_API, TRACE_CACHE, "Top Node=%v\n", jsonNode.Data) + //Visit each top level list in a loop for creating table data + topNode, _ := c.generateTableData(true, jsonNode) + if (root == nil) { + root = topNode + } else { + if root, errObj = c.yp.MergeSubtree(root, topNode); errObj.ErrCode != yparser.YP_SUCCESS { + return nil + } + } + } + } // until all dependent data is fetched + + if root != nil && Tracing == true { + dumpStr := c.yp.NodeDump(root) + TRACE_LOG(INFO_DETAIL, TRACE_CACHE, "Dependent Data = %v\n", dumpStr) + } + + TRACE_LOG(INFO_API, TRACE_CACHE, "\n%v, Exiting fetchToTmpCache", time.Now()) + return root +} + + +func (c *CVL) clearTmpDbCache() { + for key, _ := range c.tmpDbCache { + delete(c.tmpDbCache, key) + } +} + +func (c *CVL) generateTableFieldsData(config bool, tableName string, jsonNode *jsonquery.Node, +parent *yparser.YParserNode) CVLRetCode { + + //Traverse fields + for jsonFieldNode := jsonNode.FirstChild; jsonFieldNode!= nil; + jsonFieldNode = jsonFieldNode.NextSibling { + //Add fields as leaf to the list + if (jsonFieldNode.Type == jsonquery.ElementNode && + jsonFieldNode.FirstChild != nil && + jsonFieldNode.FirstChild.Type == jsonquery.TextNode) { + + if (len(modelInfo.tableInfo[tableName].mapLeaf) == 2) {//mapping should have two leaf always + //Values should be stored inside another list as map table + listNode := c.addChildNode(tableName, parent, tableName) //Add the list to the top node + c.addChildLeaf(config, tableName, + listNode, modelInfo.tableInfo[tableName].mapLeaf[0], + jsonFieldNode.Data) + + c.addChildLeaf(config, tableName, + listNode, modelInfo.tableInfo[tableName].mapLeaf[1], + jsonFieldNode.FirstChild.Data) + + } else { + //check if it is hash-ref, then need to add only key from "TABLE|k1" + hashRefMatch := reHashRef.FindStringSubmatch(jsonFieldNode.FirstChild.Data) + + if (hashRefMatch != nil && len(hashRefMatch) == 3) { + /*if (strings.HasPrefix(jsonFieldNode.FirstChild.Data, "[")) && + (strings.HasSuffix(jsonFieldNode.FirstChild.Data, "]")) && + (strings.Index(jsonFieldNode.FirstChild.Data, "|") > 0) {*/ + + c.addChildLeaf(config, tableName, + parent, jsonFieldNode.Data, + hashRefMatch[2]) //take hashref key value + } else { + c.addChildLeaf(config, tableName, + parent, jsonFieldNode.Data, + jsonFieldNode.FirstChild.Data) + } + } + + } else if (jsonFieldNode.Type == jsonquery.ElementNode && + jsonFieldNode.FirstChild != nil && + jsonFieldNode.FirstChild.Type == jsonquery.ElementNode) { + //Array data e.g. VLAN members + for arrayNode:=jsonFieldNode.FirstChild; arrayNode != nil; + + arrayNode = arrayNode.NextSibling { + c.addChildLeaf(config, tableName, + parent, jsonFieldNode.Data, + arrayNode.FirstChild.Data) + } + } + } + + return CVL_SUCCESS +} + +func (c *CVL) generateTableData(config bool, jsonNode *jsonquery.Node)(*yparser.YParserNode, CVLErrorInfo) { + var cvlErrObj CVLErrorInfo + + tableName := fmt.Sprintf("%s",jsonNode.Data) + c.batchLeaf = "" + + //Every Redis table is mapped as list within a container, + //E.g. ACL_RULE is mapped as + // container ACL_RULE { list ACL_RULE_LIST {} } + var topNode *yparser.YParserNode + + // Add top most conatiner e.g. 'container sonic-acl {...}' + if _, exists := modelInfo.tableInfo[tableName]; exists == false { + return nil, cvlErrObj + } + topNode = c.yp.AddChildNode(modelInfo.tableInfo[tableName].module, + nil, modelInfo.tableInfo[tableName].modelName) + + //Add the container node for each list + //e.g. 'container ACL_TABLE { list ACL_TABLE_LIST ...} + listConatinerNode := c.yp.AddChildNode(modelInfo.tableInfo[tableName].module, + topNode, tableName) + + //Traverse each key instance + for jsonNode = jsonNode.FirstChild; jsonNode != nil; jsonNode = jsonNode.NextSibling { + + //For each field check if is key + //If it is key, create list as child of top container + // Get all key name/value pairs + if yangListName := getRedisKeyToYangList(tableName, jsonNode.Data); yangListName!= "" { + tableName = yangListName + } + keyValuePair := getRedisToYangKeys(tableName, jsonNode.Data) + keyCompCount := len(keyValuePair) + totalKeyComb := 1 + var keyIndices []int + + //Find number of all key combinations + //Each key can have one or more key values, which results in nk1 * nk2 * nk2 combinations + idx := 0 + for i,_ := range keyValuePair { + totalKeyComb = totalKeyComb * len(keyValuePair[i].values) + keyIndices = append(keyIndices, 0) + } + + for ; totalKeyComb > 0 ; totalKeyComb-- { + //Get the YANG list name from Redis table name + //Ideally they are same except when one Redis table is split + //into multiple YANG lists + + //Add table i.e. create list element + listNode := c.addChildNode(tableName, listConatinerNode, tableName + "_LIST") //Add the list to the top node + + //For each key combination + //Add keys as leaf to the list + for idx = 0; idx < keyCompCount; idx++ { + c.addChildLeaf(config, tableName, + listNode, keyValuePair[idx].key, + keyValuePair[idx].values[keyIndices[idx]]) + } + + //Get all fields under the key field and add them as children of the list + c.generateTableFieldsData(config, tableName, jsonNode, listNode) + + //Check which key elements left after current key element + var next int = keyCompCount - 1 + for ((next > 0) && ((keyIndices[next] +1) >= len(keyValuePair[next].values))) { + next-- + } + //No more combination possible + if (next < 0) { + break + } + + keyIndices[next]++ + + //Reset indices for all other key elements + for idx = next+1; idx < keyCompCount; idx++ { + keyIndices[idx] = 0 + } + + TRACE_LOG(INFO_API, TRACE_CACHE, "Starting batch leaf creation - %s\n", c.batchLeaf) + //process batch leaf creation + if errObj := c.yp.AddMultiLeafNodes(modelInfo.tableInfo[tableName].module, listNode, c.batchLeaf); errObj.ErrCode != yparser.YP_SUCCESS { + cvlErrObj = CreateCVLErrObj(errObj) + return nil, cvlErrObj + } + c.batchLeaf = "" + } + } + + return topNode, cvlErrObj +} + +func (c *CVL) translateToYang(jsonMap *map[string]interface{}) (*yparser.YParserNode, CVLErrorInfo) { + + var cvlErrObj CVLErrorInfo + //Parse the map data to json tree + data, _ := jsonquery.ParseJsonMap(jsonMap) + var root *yparser.YParserNode + root = nil + var errObj yparser.YParserError + + for jsonNode := data.FirstChild; jsonNode != nil; jsonNode=jsonNode.NextSibling { + TRACE_LOG(INFO_API, TRACE_LIBYANG, "Top Node=%v\n", jsonNode.Data) + //Visit each top level list in a loop for creating table data + topNode, cvlErrObj := c.generateTableData(true, jsonNode) + + if topNode == nil { + cvlErrObj.ErrCode = CVL_SYNTAX_ERROR + return nil, cvlErrObj + } + + if (root == nil) { + root = topNode + } else { + if root, errObj = c.yp.MergeSubtree(root, topNode); errObj.ErrCode != yparser.YP_SUCCESS { + return nil, cvlErrObj + } + } + } + + return root, cvlErrObj +} + +//Validate config - syntax and semantics +func (c *CVL) validate (data *yparser.YParserNode) CVLRetCode { + + depData := c.fetchDataToTmpCache() + /* + if (depData != nil) { + if (0 != C.lyd_merge_to_ctx(&data, depData, C.LYD_OPT_DESTRUCT, ctx)) { + TRACE_LOG(1, "Failed to merge status data\n") + } + } + + if (0 != C.lyd_data_validate(&data, C.LYD_OPT_CONFIG, ctx)) { + fmt.Println("Validation failed\n") + return CVL_SYNTAX_ERROR + }*/ + + TRACE_LOG(INFO_DATA, TRACE_LIBYANG, "\nValidate1 data=%v\n", c.yp.NodeDump(data)) + errObj := c.yp.ValidateData(data, depData) + if yparser.YP_SUCCESS != errObj.ErrCode { + return CVL_FAILURE + } + + return CVL_SUCCESS +} + +func CreateCVLErrObj(errObj yparser.YParserError) CVLErrorInfo { + + cvlErrObj := CVLErrorInfo { + TableName : errObj.TableName, + ErrCode : CVLRetCode(errObj.ErrCode), + CVLErrDetails : cvlErrorMap[CVLRetCode(errObj.ErrCode)], + Keys : errObj.Keys, + Value : errObj.Value, + Field : errObj.Field, + Msg : errObj.Msg, + ConstraintErrMsg : errObj.ErrTxt, + ErrAppTag : errObj.ErrAppTag, + } + + + return cvlErrObj + +} + +//Perform syntax checks +func (c *CVL) validateSyntax(data *yparser.YParserNode) (CVLErrorInfo, CVLRetCode) { + var cvlErrObj CVLErrorInfo + TRACE_LOG(INFO_DATA, TRACE_LIBYANG, "Validating syntax \n....") + + if errObj := c.yp.ValidateSyntax(data); errObj.ErrCode != yparser.YP_SUCCESS { + + retCode := CVLRetCode(errObj.ErrCode) + + cvlErrObj = CVLErrorInfo { + TableName : errObj.TableName, + ErrCode : CVLRetCode(errObj.ErrCode), + CVLErrDetails : cvlErrorMap[retCode], + Keys : errObj.Keys, + Value : errObj.Value, + Field : errObj.Field, + Msg : errObj.Msg, + ConstraintErrMsg : errObj.ErrTxt, + ErrAppTag : errObj.ErrAppTag, + } + + + + return cvlErrObj, retCode + } + + return cvlErrObj, CVL_SUCCESS +} + +//Perform semantic checks +func (c *CVL) validateSemantics(data *yparser.YParserNode, appDepData *yparser.YParserNode) (CVLErrorInfo, CVLRetCode) { + var cvlErrObj CVLErrorInfo + + if (SkipSemanticValidation() == true) { + return cvlErrObj, CVL_SUCCESS + } + + //Get dependent data from + depData := c.fetchDataToTmpCache() //fetch data to temp cache for temporary validation + + if (Tracing == true) { + TRACE_LOG(INFO_API, TRACE_SEMANTIC, "Validating semantics data=%s\n depData =%s\n, appDepData=%s\n....", c.yp.NodeDump(data), c.yp.NodeDump(depData), c.yp.NodeDump(appDepData)) + } + + if errObj := c.yp.ValidateSemantics(data, depData, appDepData); errObj.ErrCode != yparser.YP_SUCCESS { + + retCode := CVLRetCode(errObj.ErrCode) + + cvlErrObj = CVLErrorInfo { + TableName : errObj.TableName, + ErrCode : CVLRetCode(errObj.ErrCode), + CVLErrDetails : cvlErrorMap[retCode], + Keys : errObj.Keys, + Value : errObj.Value, + Field : errObj.Field, + Msg : errObj.Msg, + ConstraintErrMsg : errObj.ErrTxt, + ErrAppTag : errObj.ErrAppTag, + } + + + + return cvlErrObj, retCode + } + + return cvlErrObj ,CVL_SUCCESS +} + +//Add config data item to accumulate per table +func (c *CVL) addCfgDataItem(configData *map[string]interface{}, + cfgDataItem CVLEditConfigData) (string, string){ + var cfgData map[string]interface{} + cfgData = *configData + + tblName, key := splitRedisKey(cfgDataItem.Key) + if (tblName == "" || key == "") { + //Bad redis key + return "", "" + } + + if (cfgDataItem.VOp == OP_DELETE) { + //Don't add data it is delete operation + return tblName, key + } + + if _, existing := cfgData[tblName]; existing { + fieldsMap := cfgData[tblName].(map[string]interface{}) + fieldsMap[key] = c.checkFieldMap(&cfgDataItem.Data) + } else { + fieldsMap := make(map[string]interface{}) + fieldsMap[key] = c.checkFieldMap(&cfgDataItem.Data) + cfgData[tblName] = fieldsMap + } + + return tblName, key +} + +//Get table entry from cache for redis key +func dbCacheEntryGet(tableName, key string) (*yparser.YParserNode, CVLRetCode) { + //First check if the table is cached + topNode, _ := dbCacheGet(tableName) + + + if (topNode != nil) { + //Convert to Yang keys + keyValuePair := getRedisToYangKeys(tableName, key) + + //Find if the entry is cached + keyCompStr := "" + for _, keyValItem := range keyValuePair { + keyCompStr = keyCompStr + fmt.Sprintf("[%s='%s']", + keyValItem.key, keyValItem.values[0]) + } + + entryNode := yparser.FindNode(topNode, fmt.Sprintf("//%s:%s/%s%s", + modelInfo.tableInfo[tableName].modelName, + modelInfo.tableInfo[tableName].modelName, + tableName, keyCompStr)) + + if (entryNode != nil) { + return entryNode, CVL_SUCCESS + } + } + + return nil, CVL_ERROR +} + +//Get the data from global cache +func dbCacheGet(tableName string) (*yparser.YParserNode, CVLRetCode) { + + TRACE_LOG(INFO_ALL, TRACE_CACHE, "Updating global cache for table %s", tableName) + dbCacheTmp, existing := cvg.db[tableName] + + if (existing == false) { + return nil, CVL_FAILURE //not even empty cache present + } + + if (dbCacheTmp.root != nil) { + if (dbCacheTmp.expiry != 0) { + //If cache is destroyable (i.e. expiry != 0), check if it has already expired. + //If not expired update the time stamp + if (time.Now().After(dbCacheTmp.startTime.Add(time.Second * time.Duration(dbCacheTmp.expiry)))) { + //Cache expired, clear the cache + dbCacheClear(tableName) + + return nil, CVL_ERROR + } + + //Since the cache is used actively, update the timestamp + dbCacheTmp.startTime = time.Now() + cvg.db[tableName] = dbCacheTmp + } + + return dbCacheTmp.root, CVL_SUCCESS + } else { + return nil, CVL_SUCCESS // return success for no entry in Redis db and hencec empty cache + } +} + +//Get the table data from redis and cache it in yang node format +//expiry =0 never expire the cache +func dbCacheSet(update bool, tableName string, expiry uint16) CVLRetCode { + + cvg.mutex.Lock() + + //Get the data from redis and save it + tableKeys, err:= redisClient.Keys(tableName + + modelInfo.tableInfo[tableName].redisKeyDelim + "*").Result() + + if (err != nil) { + cvg.mutex.Unlock() + return CVL_FAILURE + } + + TRACE_LOG(INFO_ALL, TRACE_CACHE, "Building global cache for table %s", tableName) + + tablePrefixLen := len(tableName + modelInfo.tableInfo[tableName].redisKeyDelim) + for _, tableKey := range tableKeys { + tableKey = tableKey[tablePrefixLen:] //remove table prefix + if (cvg.cv.tmpDbCache[tableName] == nil) { + cvg.cv.tmpDbCache[tableName] = map[string]interface{}{tableKey: nil} + } else { + tblMap := cvg.cv.tmpDbCache[tableName] + tblMap.(map[string]interface{})[tableKey] =nil + cvg.cv.tmpDbCache[tableName] = tblMap + } + } + + cvg.db[tableName] = dbCachedData{startTime:time.Now(), expiry: expiry, + root: cvg.cv.fetchDataToTmpCache()} + + if (Tracing == true) { + TRACE_LOG(INFO_ALL, TRACE_CACHE, "Cached Data = %v\n", cvg.cv.yp.NodeDump(cvg.db[tableName].root)) + } + + cvg.mutex.Unlock() + + //install keyspace notification for updating the cache + if (update == false) { + installDbChgNotif() + } + + + return CVL_SUCCESS +} + +//Receive all updates for all tables on a single channel +func installDbChgNotif() { + if (len(cvg.db) > 1) { //notif running for at least one table added previously + cvg.stopChan <- 1 //stop active notification + } + + subList := make([]string, 0) + for tableName, _ := range cvg.db { + subList = append(subList, + fmt.Sprintf("__keyspace@%d__:%s%s*", modelInfo.tableInfo[tableName].dbNum, + tableName, modelInfo.tableInfo[tableName].redisKeyDelim)) + + } + + //Listen on multiple channels + cvg.pubsub = redisClient.PSubscribe(subList...) + + go func() { + keySpacePrefixLen := len("__keyspace@4__:") + + notifCh := cvg.pubsub.Channel() + for { + select { + case <-cvg.stopChan: + //stop this routine + return + case msg:= <-notifCh: + //Handle update + tbl, key := splitRedisKey(msg.Channel[keySpacePrefixLen:]) + if (tbl != "" && key != "") { + dbCacheUpdate(tbl, key, msg.Payload) + } + } + } + }() +} + +func dbCacheUpdate(tableName, key, op string) CVLRetCode { + TRACE_LOG(INFO_ALL, TRACE_CACHE, "Updating global cache for table %s with key %s", tableName, key) + + //Find the node + //Delete the entry in yang tree + + cvg.mutex.Lock() + + node, _:= dbCacheEntryGet(tableName, key) + if (node != nil) { + //unlink and free the node + cvg.cv.yp.FreeNode(node) + } + + //Clear json map cache if any + cvg.cv.clearTmpDbCache() + + tableKeys := []string {key} + switch op { + case "hset", "hmset", "hdel": + //Get the entry from DB + for _, tableKey := range tableKeys { + cvg.cv.tmpDbCache[tableName] = map[string]interface{}{tableKey: nil} + } + + //Get the translated Yang tree + topNode := cvg.cv.fetchDataToTmpCache() + + //Merge the subtree with existing yang tree + var errObj yparser.YParserError + if (cvg.db[tableName].root != nil) { + if topNode, errObj = cvg.cv.yp.MergeSubtree(cvg.db[tableName].root, topNode); errObj.ErrCode != yparser.YP_SUCCESS { + cvg.mutex.Unlock() + return CVL_ERROR + } + } + + //Update DB map + db := cvg.db[tableName] + db.root = topNode + cvg.db[tableName] = db + + case "del": + //NOP, already deleted the entry + } + + cvg.mutex.Unlock() + + return CVL_SUCCESS +} + +//Clear cache data for given table +func dbCacheClear(tableName string) CVLRetCode { + cvg.cv.yp.FreeNode(cvg.db[tableName].root) + delete(cvg.db, tableName) + + TRACE_LOG(INFO_ALL, TRACE_CACHE, "Clearing global cache for table %s", tableName) + + return CVL_SUCCESS +} + diff --git a/src/cvl/cvl_api.go b/src/cvl/cvl_api.go new file mode 100644 index 0000000000..52b2316396 --- /dev/null +++ b/src/cvl/cvl_api.go @@ -0,0 +1,514 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package cvl + +import ( + "fmt" + "encoding/json" + "github.com/go-redis/redis" + "path/filepath" + "cvl/internal/yparser" + . "cvl/internal/util" +) + +type CVLValidateType uint +const ( + VALIDATE_NONE CVLValidateType = iota //Data is used as dependent data + VALIDATE_SYNTAX //Syntax is checked and data is used as dependent data + VALIDATE_SEMANTICS //Semantics is checked + VALIDATE_ALL //Syntax and Semantics are checked +) + +type CVLOperation uint +const ( + OP_NONE CVLOperation = 0 //Used to just validate the config without any operation + OP_CREATE = 1 << 0//For Create operation + OP_UPDATE = 1 << 1//For Update operation + OP_DELETE = 1 << 2//For Delete operation +) + +var cvlErrorMap = map[CVLRetCode]string { + CVL_SUCCESS : "Config Validation Success", + CVL_SYNTAX_ERROR : "Config Validation Syntax Error", + CVL_SEMANTIC_ERROR : "Config Validation Semantic Error", + CVL_SYNTAX_MISSING_FIELD : "Required Field is Missing", + CVL_SYNTAX_INVALID_FIELD : "Invalid Field Received", + CVL_SYNTAX_INVALID_INPUT_DATA : "Invalid Input Data Received", + CVL_SYNTAX_MULTIPLE_INSTANCE : "Multiple Field Instances Received", + CVL_SYNTAX_DUPLICATE : "Duplicate Instances Received", + CVL_SYNTAX_ENUM_INVALID : "Invalid Enum Value Received", + CVL_SYNTAX_ENUM_INVALID_NAME : "Invalid Enum Value Received", + CVL_SYNTAX_ENUM_WHITESPACE : "Enum name with leading/trailing whitespaces Received", + CVL_SYNTAX_OUT_OF_RANGE : "Value out of range/length/pattern (data)", + CVL_SYNTAX_MINIMUM_INVALID : "min-elements constraint not honored", + CVL_SYNTAX_MAXIMUM_INVALID : "max-elements constraint not honored", + CVL_SEMANTIC_DEPENDENT_DATA_MISSING : "Dependent Data is missing", + CVL_SEMANTIC_MANDATORY_DATA_MISSING : "Mandatory Data is missing", + CVL_SEMANTIC_KEY_ALREADY_EXIST : "Key already existing.", + CVL_SEMANTIC_KEY_NOT_EXIST : "Key does not exist.", + CVL_SEMANTIC_KEY_DUPLICATE : "Duplicate key received", + CVL_SEMANTIC_KEY_INVALID : "Invalid Key Received", + CVL_INTERNAL_UNKNOWN : "Internal Unknown Error", + CVL_ERROR : "Generic Error", + CVL_NOT_IMPLEMENTED : "Error Not Implemented", + CVL_FAILURE : "Generic Failure", +} + +//Error code +type CVLRetCode int +const ( + CVL_SUCCESS CVLRetCode = iota + CVL_ERROR + CVL_NOT_IMPLEMENTED + CVL_INTERNAL_UNKNOWN + CVL_FAILURE + CVL_SYNTAX_ERROR = CVLRetCode(yparser.YP_SYNTAX_ERROR) + CVL_SEMANTIC_ERROR = CVLRetCode(yparser.YP_SEMANTIC_ERROR) + CVL_SYNTAX_MISSING_FIELD = CVLRetCode(yparser.YP_SYNTAX_MISSING_FIELD) + CVL_SYNTAX_INVALID_FIELD = CVLRetCode(yparser.YP_SYNTAX_INVALID_FIELD) /* Invalid Field */ + CVL_SYNTAX_INVALID_INPUT_DATA = CVLRetCode(yparser.YP_SYNTAX_INVALID_INPUT_DATA) /*Invalid Input Data */ + CVL_SYNTAX_MULTIPLE_INSTANCE = CVLRetCode(yparser.YP_SYNTAX_MULTIPLE_INSTANCE) /* Multiple Field Instances */ + CVL_SYNTAX_DUPLICATE = CVLRetCode(yparser.YP_SYNTAX_DUPLICATE) /* Duplicate Fields */ + CVL_SYNTAX_ENUM_INVALID = CVLRetCode(yparser.YP_SYNTAX_ENUM_INVALID) /* Invalid enum value */ + CVL_SYNTAX_ENUM_INVALID_NAME = CVLRetCode(yparser.YP_SYNTAX_ENUM_INVALID_NAME) /* Invalid enum name */ + CVL_SYNTAX_ENUM_WHITESPACE = CVLRetCode(yparser.YP_SYNTAX_ENUM_WHITESPACE) /* Enum name with leading/trailing whitespaces */ + CVL_SYNTAX_OUT_OF_RANGE = CVLRetCode(yparser.YP_SYNTAX_OUT_OF_RANGE) /* Value out of range/length/pattern (data) */ + CVL_SYNTAX_MINIMUM_INVALID = CVLRetCode(yparser.YP_SYNTAX_MINIMUM_INVALID) /* min-elements constraint not honored */ + CVL_SYNTAX_MAXIMUM_INVALID = CVLRetCode(yparser.YP_SYNTAX_MAXIMUM_INVALID) /* max-elements constraint not honored */ + CVL_SEMANTIC_DEPENDENT_DATA_MISSING = CVLRetCode(yparser.YP_SEMANTIC_DEPENDENT_DATA_MISSING) /* Dependent Data is missing */ + CVL_SEMANTIC_MANDATORY_DATA_MISSING = CVLRetCode(yparser.YP_SEMANTIC_MANDATORY_DATA_MISSING) /* Mandatory Data is missing */ + CVL_SEMANTIC_KEY_ALREADY_EXIST = CVLRetCode(yparser.YP_SEMANTIC_KEY_ALREADY_EXIST) /* Key already existing. */ + CVL_SEMANTIC_KEY_NOT_EXIST = CVLRetCode(yparser.YP_SEMANTIC_KEY_NOT_EXIST) /* Key is missing. */ + CVL_SEMANTIC_KEY_DUPLICATE = CVLRetCode(yparser.YP_SEMANTIC_KEY_DUPLICATE) /* Duplicate key. */ + CVL_SEMANTIC_KEY_INVALID = CVLRetCode(yparser.YP_SEMANTIC_KEY_INVALID) +) + +//Strcture for key and data in API +type CVLEditConfigData struct { + VType CVLValidateType //Validation type + VOp CVLOperation //Operation type + Key string //Key format : "PORT|Ethernet4" + Data map[string]string //Value : {"alias": "40GE0/28", "mtu" : 9100, "admin_status": down} +} + +func Initialize() CVLRetCode { + if (cvlInitialized == true) { + //CVL has already been initialized + return CVL_SUCCESS + } + + //Scan schema directory to get all schema files + modelFiles, err := filepath.Glob(CVL_SCHEMA + "/*.yin") + if err != nil { + CVL_LOG(FATAL ,"Could not read schema %v", err) + } + + yparser.Initialize() + + modelInfo.modelNs = make(map[string]modelNamespace) //redis table to model name + modelInfo.tableInfo = make(map[string]*modelTableInfo) //model namespace + modelInfo.allKeyDelims = make(map[string]bool) //all key delimiter + modelInfo.redisTableToYangList = make(map[string][]string) //Redis table to Yang list map + dbNameToDbNum = map[string]uint8{"APPL_DB": APPL_DB, "CONFIG_DB": CONFIG_DB} + + /* schema */ + for _, modelFilePath := range modelFiles { + _, modelFile := filepath.Split(modelFilePath) + + TRACE_LOG(INFO_DEBUG, TRACE_LIBYANG, "Parsing schema file %s ...\n", modelFilePath) + var module *yparser.YParserModule + if module, _ = yparser.ParseSchemaFile(modelFilePath); module == nil { + + CVL_LOG(FATAL,fmt.Sprintf("Unable to parse schema file %s", modelFile)) + return CVL_ERROR + } + + storeModelInfo(modelFile, module) + } + + //Add all table names to be fetched to validate 'must' expression + addTableNamesForMustExp() + + //Initialize redis Client + + redisClient = redis.NewClient(&redis.Options{ + Addr: ":6379", + Password: "", // no password set + DB: int(CONFIG_DB), // use APP DB + }) + + if (redisClient == nil) { + CVL_LOG(FATAL, "Unable to connect with Redis Config DB") + return CVL_ERROR + } + + //Load lua script into redis + loadLuaScript() + + cvlInitialized = true + + return CVL_SUCCESS +} + +func Finish() { + yparser.Finish() +} + +func ValidationSessOpen() (*CVL, CVLRetCode) { + cvl := &CVL{} + cvl.tmpDbCache = make(map[string]interface{}) + cvl.requestCache = make(map[string]map[string][]CVLEditConfigData) + cvl.yp = &yparser.YParser{} + + if (cvl == nil || cvl.yp == nil) { + return nil, CVL_FAILURE + } + + return cvl, CVL_SUCCESS +} + +func ValidationSessClose(c *CVL) CVLRetCode { + c.yp.DestroyCache() + c = nil + + return CVL_SUCCESS +} + +func (c *CVL) ValidateStartupConfig(jsonData string) CVLRetCode { + //Check config data syntax + //Finally validate + return CVL_NOT_IMPLEMENTED +} + +func (c *CVL) ValidateIncrementalConfig(jsonData string) CVLRetCode { + //Check config data syntax + //Fetch the depedent data + //Merge config and dependent data + //Finally validate + c.clearTmpDbCache() + var v interface{} + + b := []byte(jsonData) + if err := json.Unmarshal(b, &v); err != nil { + return CVL_SYNTAX_ERROR + } + + var dataMap map[string]interface{} = v.(map[string]interface{}) + + root, _ := c.translateToYang(&dataMap) + if root == nil { + return CVL_SYNTAX_ERROR + + } + + //Add and fetch entries if already exists in Redis + for tableName, data := range dataMap { + for key, _ := range data.(map[string]interface{}) { + c.addTableEntryToCache(tableName, key) + } + } + + existingData := c.fetchDataToTmpCache() + + //Merge existing data for update syntax or checking duplicate entries + var errObj yparser.YParserError + if (existingData != nil) { + if root, errObj = c.yp.MergeSubtree(root, existingData); + errObj.ErrCode != yparser.YP_SUCCESS { + return CVL_ERROR + } + } + + //Clear cache + c.clearTmpDbCache() + + //Add tables for 'must' expression + for tableName, _ := range dataMap { + c.addTableDataForMustExp(OP_NONE, tableName) + } + + //Perform validation + if _, cvlRetCode := c.validateSemantics(root, nil); cvlRetCode != CVL_SUCCESS { + return cvlRetCode + } + + return CVL_SUCCESS +} + +//Validate data for operation +func (c *CVL) ValidateConfig(jsonData string) CVLRetCode { + c.clearTmpDbCache() + var v interface{} + + b := []byte(jsonData) + if err := json.Unmarshal(b, &v); err == nil { + var value map[string]interface{} = v.(map[string]interface{}) + root, _ := c.translateToYang(&value) + //if ret == CVL_SUCCESS && root != nil { + if root == nil { + return CVL_FAILURE + + } + + if (c.validate(root) != CVL_SUCCESS) { + return CVL_FAILURE + } + + } + + return CVL_SUCCESS +} + +//Validate config data based on edit operation - no marshalling in between +func (c *CVL) ValidateEditConfig(cfgData []CVLEditConfigData) (CVLErrorInfo, CVLRetCode) { + var cvlErrObj CVLErrorInfo + + if (SkipValidation() == true) { + + return cvlErrObj, CVL_SUCCESS + } + + c.clearTmpDbCache() + + //Step 1: Get requested dat first + //add all dependent data to be fetched from Redis + requestedData := make(map[string]interface{}) + + for _, cfgDataItem := range cfgData { + if (VALIDATE_ALL != cfgDataItem.VType) { + continue + } + + //Add config data item to be validated + tbl,key := c.addCfgDataItem(&requestedData, cfgDataItem) + + //Add to request cache + reqTbl, exists := c.requestCache[tbl] + if (exists == false) { + //Create new table key data + reqTbl = make(map[string][]CVLEditConfigData) + } + cfgDataItemArr, _ := reqTbl[key] + cfgDataItemArr = append(cfgDataItemArr, cfgDataItem) + reqTbl[key] = cfgDataItemArr + c.requestCache[tbl] = reqTbl + + //Invalid table name or invalid key separator + if key == "" { + cvlErrObj.ErrCode = CVL_SYNTAX_ERROR + cvlErrObj.CVLErrDetails = cvlErrorMap[cvlErrObj.ErrCode] + return cvlErrObj, CVL_SYNTAX_ERROR + } + + switch cfgDataItem.VOp { + case OP_CREATE: + if (c.addTableEntryForMustExp(&cfgDataItem, tbl) != CVL_SUCCESS) { + c.addTableDataForMustExp(cfgDataItem.VOp, tbl) + } + + case OP_UPDATE: + //Get the existing data from Redis to cache, so that final validation can be done after merging this dependent data + if (c.addTableEntryForMustExp(&cfgDataItem, tbl) != CVL_SUCCESS) { + c.addTableDataForMustExp(cfgDataItem.VOp, tbl) + } + c.addTableEntryToCache(tbl, key) + + case OP_DELETE: + if (len(cfgDataItem.Data) > 0) { + //Delete a single field + if (len(cfgDataItem.Data) != 1) { + CVL_LOG(ERROR, "Only single field is allowed for field deletion") + } else { + for field, _ := range cfgDataItem.Data { + if (c.checkDeleteConstraint(cfgData, tbl, key, field) != CVL_SUCCESS) { + cvlErrObj.ErrCode = CVL_SEMANTIC_ERROR + cvlErrObj.CVLErrDetails = cvlErrorMap[cvlErrObj.ErrCode] + return cvlErrObj, CVL_SEMANTIC_ERROR + } + break //only one field there + } + } + } else { + //Entire entry to be deleted + if (c.checkDeleteConstraint(cfgData, tbl, key, "") != CVL_SUCCESS) { + cvlErrObj.ErrCode = CVL_SEMANTIC_ERROR + cvlErrObj.CVLErrDetails = cvlErrorMap[cvlErrObj.ErrCode] + return cvlErrObj, CVL_SEMANTIC_ERROR + } + //TBD : Can we do this ? + //No entry has depedency on this key, + //remove from requestCache, we don't need any more as depedent data + //delete(c.requestCache[tbl], key) + } + + if (c.addTableEntryForMustExp(&cfgDataItem, tbl) != CVL_SUCCESS) { + c.addTableDataForMustExp(cfgDataItem.VOp, tbl) + } + + c.addTableEntryToCache(tbl, key) + } + } + + //Only for tracing + if (IsTraceSet()) { + jsonData := "" + + jsonDataBytes, err := json.Marshal(requestedData) + if (err == nil) { + jsonData = string(jsonDataBytes) + } else { + cvlErrObj.ErrCode = CVL_SYNTAX_ERROR + cvlErrObj.CVLErrDetails = cvlErrorMap[cvlErrObj.ErrCode] + return cvlErrObj, CVL_SYNTAX_ERROR + } + + TRACE_LOG(INFO_DATA, TRACE_LIBYANG, "Requested JSON Data = [%s]\n", jsonData) + } + + //Step 2 : Perform syntax validation only + yang, errN := c.translateToYang(&requestedData) + if (errN.ErrCode == CVL_SUCCESS) { + if cvlErrObj, cvlRetCode := c.validateSyntax(yang); cvlRetCode != CVL_SUCCESS { + return cvlErrObj, cvlRetCode + } + } else { + return errN,errN.ErrCode + } + + //Step 3 : Check keys and update dependent data + dependentData := make(map[string]interface{}) + + for _, cfgDataItem := range cfgData { + + if (cfgDataItem.VType == VALIDATE_ALL || cfgDataItem.VType == VALIDATE_SEMANTICS) { + //Step 3.1 : Check keys + switch cfgDataItem.VOp { + case OP_CREATE: + //Check key should not already exist + n, err1 := redisClient.Exists(cfgDataItem.Key).Result() + if (err1 == nil && n > 0) { + //Check if key deleted and CREATE done in same session, + //allow to create the entry + tbl, key := splitRedisKey(cfgDataItem.Key) + deletedInSameSession := false + if tbl != "" && key != "" { + for _, cachedCfgData := range c.requestCache[tbl][key] { + if cachedCfgData.VOp == OP_DELETE { + deletedInSameSession = true + break + } + } + } + + if deletedInSameSession == false { + CVL_LOG(ERROR, "\nValidateEditConfig(): Key = %s already exists", cfgDataItem.Key) + cvlErrObj.ErrCode = CVL_SEMANTIC_KEY_ALREADY_EXIST + cvlErrObj.CVLErrDetails = cvlErrorMap[cvlErrObj.ErrCode] + return cvlErrObj, CVL_SEMANTIC_KEY_ALREADY_EXIST + + } else { + TRACE_LOG(INFO_API, TRACE_CREATE, "\nKey %s is deleted in same session, skipping key existence check for OP_CREATE operation", cfgDataItem.Key) + } + } + + c.yp.SetOperation("CREATE") + + case OP_UPDATE: + n, err1 := redisClient.Exists(cfgDataItem.Key).Result() + if (err1 != nil || n == 0) { //key must exists + CVL_LOG(ERROR, "\nValidateEditConfig(): Key = %s does not exist", cfgDataItem.Key) + cvlErrObj.ErrCode = CVL_SEMANTIC_KEY_ALREADY_EXIST + cvlErrObj.CVLErrDetails = cvlErrorMap[cvlErrObj.ErrCode] + return cvlErrObj, CVL_SEMANTIC_KEY_NOT_EXIST + } + + c.yp.SetOperation("UPDATE") + + case OP_DELETE: + n, err1 := redisClient.Exists(cfgDataItem.Key).Result() + if (err1 != nil || n == 0) { //key must exists + CVL_LOG(ERROR, "\nValidateEditConfig(): Key = %s does not exist", cfgDataItem.Key) + cvlErrObj.ErrCode = CVL_SEMANTIC_KEY_NOT_EXIST + cvlErrObj.CVLErrDetails = cvlErrorMap[cvlErrObj.ErrCode] + return cvlErrObj, CVL_SEMANTIC_KEY_NOT_EXIST + } + + c.yp.SetOperation("DELETE") + //store deleted keys + } + + }/* else if (cfgDataItem.VType == VALIDATE_NONE) { + //Step 3.2 : Get dependent data + + switch cfgDataItem.VOp { + case OP_CREATE: + //NOP + case OP_UPDATE: + //NOP + case OP_DELETE: + tbl,key := c.addCfgDataItem(&dependentData, cfgDataItem) + //update cache by removing deleted entry + c.updateDeleteDataToCache(tbl, key) + //store deleted keys + } + }*/ + } + + var depYang *yparser.YParserNode = nil + if (len(dependentData) > 0) { + depYang, errN = c.translateToYang(&dependentData) + } + //Step 4 : Perform validation + if cvlErrObj, cvlRetCode1 := c.validateSemantics(yang, depYang); cvlRetCode1 != CVL_SUCCESS { + return cvlErrObj, cvlRetCode1 + } + + //Cache validated data + /* + if errObj := c.yp.CacheSubtree(false, yang); errObj.ErrCode != yparser.YP_SUCCESS { + TRACE_LOG(INFO_API, TRACE_CACHE, "Could not cache validated data") + } + */ + + c.yp.DestroyCache() + return cvlErrObj, CVL_SUCCESS +} + +/* Fetch the Error Message from CVL Return Code. */ +func GetErrorString(retCode CVLRetCode) string{ + + return cvlErrorMap[retCode] + +} + +//Validate key only +func (c *CVL) ValidateKeys(key []string) CVLRetCode { + return CVL_NOT_IMPLEMENTED +} + +//Validate key and data +func (c *CVL) ValidateKeyData(key string, data string) CVLRetCode { + return CVL_NOT_IMPLEMENTED +} + +//Validate key, field and value +func (c *CVL) ValidateFields(key string, field string, value string) CVLRetCode { + return CVL_NOT_IMPLEMENTED +} diff --git a/src/cvl/cvl_luascript.go b/src/cvl/cvl_luascript.go new file mode 100644 index 0000000000..fd4c863ad1 --- /dev/null +++ b/src/cvl/cvl_luascript.go @@ -0,0 +1,65 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package cvl +import ( + "github.com/go-redis/redis" +) + +//Redis server side script +func loadLuaScript() { + luaScripts = make(map[string]*redis.Script) + + // Find entry which has given fieldName and value + luaScripts["find_key"] = redis.NewScript(` + local tableName=ARGV[1] + local sep=ARGV[2] + local fieldName=ARGV[3] + local fieldValue=ARGV[4] + + -- Check if field value is part of key + local entries=redis.call('KEYS', tableName..sep.."*"..fieldValue.."*") + + if (entries[1] ~= nil) + then + return entries[1] + else + + -- Search through all keys for fieldName and fieldValue + local entries=redis.call('KEYS', tableName..sep.."*") + + local idx = 1 + while(entries[idx] ~= nil) + do + local val = redis.call("HGET", entries[idx], fieldName) + if (val == fieldValue) + then + -- Return the key + return entries[idx] + end + + idx = idx + 1 + end + end + + -- Could not find the key + return "" + `) + +} diff --git a/src/cvl/cvl_test.go b/src/cvl/cvl_test.go new file mode 100644 index 0000000000..d4a4205261 --- /dev/null +++ b/src/cvl/cvl_test.go @@ -0,0 +1,3491 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package cvl_test + +import ( + "cvl" + "encoding/json" + "fmt" + "github.com/go-redis/redis" + "io/ioutil" + "os" + "os/exec" + "strings" + "syscall" + "testing" + "runtime" + . "cvl/internal/util" + "cvl/internal/yparser" +) + +type testEditCfgData struct { + filedescription string + cfgData string + depData string + retCode cvl.CVLRetCode +} + +var rclient *redis.Client +var port_map map[string]interface{} +var filehandle *os.File + +/* Dependent port channel configuration. */ +var depDataMap = map[string]interface{} { + "PORTCHANNEL" : map[string]interface{} { + "PortChannel001": map[string] interface{} { + "admin_status": "up", + "mtu": "9100", + }, + "PortChannel002": map[string] interface{} { + "admin_status": "up", + "mtu": "9100", + }, + }, + "PORTCHANNEL_MEMBER": map[string]interface{} { + "PortChannel001|Ethernet4": map[string] interface{} { + "NULL": "NULL", + }, + "PortChannel001|Ethernet8": map[string] interface{} { + "NULL": "NULL", + }, + "PortChannel001|Ethernet12": map[string] interface{} { + "NULL": "NULL", + }, + "PortChannel002|Ethernet20": map[string] interface{} { + "NULL": "NULL", + }, + "PortChannel002|Ethernet24": map[string] interface{} { + "NULL": "NULL", + }, + }, +} + +/* Converts JSON Data in a File to Map. */ +func convertJsonFileToMap(t *testing.T, fileName string) map[string]string { + var mapstr map[string]string + + jsonData := convertJsonFileToString(t, fileName) + byteData := []byte(jsonData) + + err := json.Unmarshal(byteData, &mapstr) + + if err != nil { + fmt.Println("Failed to convert Json File to map:", err) + } + + return mapstr + +} + +/* Converts JSON Data in a File to Map. */ +func convertDataStringToMap(t *testing.T, dataString string) map[string]string { + var mapstr map[string]string + + byteData := []byte(dataString) + + err := json.Unmarshal(byteData, &mapstr) + + if err != nil { + fmt.Println("Failed to convert Json Data String to map:", err) + } + + return mapstr + +} + +/* Converts JSON Data in a File to String. */ +func convertJsonFileToString(t *testing.T, fileName string) string { + var jsonData string + + data, err := ioutil.ReadFile(fileName) + + if err != nil { + fmt.Printf("\nFailed to read data file : %v\n", err) + } else { + jsonData = string(data) + } + + return jsonData +} + +/* Converts JSON config to map which can be loaded to Redis */ +func loadConfig(key string, in []byte) map[string]interface{} { + var fvp map[string]interface{} + + err := json.Unmarshal(in, &fvp) + if err != nil { + fmt.Printf("Failed to Unmarshal %v err: %v", in, err) + } + if key != "" { + kv := map[string]interface{}{} + kv[key] = fvp + return kv + } + return fvp +} + +/* Separator for keys. */ +func getSeparator() string { + return "|" +} + +/* Unloads the Config DB based on JSON File. */ +func unloadConfigDB(rclient *redis.Client, mpi map[string]interface{}) { + for key, fv := range mpi { + switch fv.(type) { + case map[string]interface{}: + for subKey, subValue := range fv.(map[string]interface{}) { + newKey := key + getSeparator() + subKey + _, err := rclient.Del(newKey).Result() + + if err != nil { + fmt.Printf("Invalid data for db: %v : %v %v", newKey, subValue, err) + } + + } + default: + fmt.Printf("Invalid data for db: %v : %v", key, fv) + } + } + +} + +/* Loads the Config DB based on JSON File. */ +func loadConfigDB(rclient *redis.Client, mpi map[string]interface{}) { + for key, fv := range mpi { + switch fv.(type) { + case map[string]interface{}: + for subKey, subValue := range fv.(map[string]interface{}) { + newKey := key + getSeparator() + subKey + _, err := rclient.HMSet(newKey, subValue.(map[string]interface{})).Result() + + if err != nil { + fmt.Printf("Invalid data for db: %v : %v %v", newKey, subValue, err) + } + + } + default: + fmt.Printf("Invalid data for db: %v : %v", key, fv) + } + } +} + +func compareErrorDetails(cvlErr cvl.CVLErrorInfo, expCode cvl.CVLRetCode, errAppTag string, constraintmsg string) bool { + + if ((cvlErr.ErrCode == expCode) && ((cvlErr.ErrAppTag == errAppTag) || (cvlErr.ConstraintErrMsg == constraintmsg))) { + return true + } + + return false +} + +func getConfigDbClient() *redis.Client { + rclient := redis.NewClient(&redis.Options{ + Network: "tcp", + Addr: "localhost:6379", + Password: "", // no password set + DB: 4, + DialTimeout: 0, + }) + _, err := rclient.Ping().Result() + if err != nil { + fmt.Printf("failed to connect to redis server %v", err) + } + return rclient +} + +/* Prepares the database in Redis Server. */ +func prepareDb() { + rclient = getConfigDbClient() + + fileName := "testdata/port_table.json" + PortsMapByte, err := ioutil.ReadFile(fileName) + if err != nil { + fmt.Printf("read file %v err: %v", fileName, err) + } + + port_map = loadConfig("", PortsMapByte) + + loadConfigDB(rclient, port_map) + loadConfigDB(rclient, depDataMap) +} + +func WriteToFile(message string) { + pc := make([]uintptr, 10) + runtime.Callers(2, pc) + f := runtime.FuncForPC(pc[0]) + + message = f.Name()+ "\n" + message + + if _, err := filehandle.Write([]byte(message)); err != nil { + fmt.Println("Unable to write to cvl test log file") + } + + message = "\n-------------------------------------------------\n" + + + if _, err := filehandle.Write([]byte(message)); err != nil { + fmt.Println("Unable to write to cvl test log file") + } +} + +/* Setup before starting of test. */ +func TestMain(m *testing.M) { + + redisAlreadyRunning := false + pidOfRedis, err := exec.Command("/bin/pidof", "redis-server").Output() + if err == nil && string(pidOfRedis) != "\n" { + redisAlreadyRunning = true + } + + if (redisAlreadyRunning == false) { + //Redis not running, lets start it + _, err := exec.Command("/bin/sh", "-c", "sudo /etc/init.d/redis-server start").Output() + if err != nil { + fmt.Println(err.Error()) + } + + } + + os.Remove("testdata/cvl_test_details.log") + + filehandle, err = os.OpenFile("testdata/cvl_test_details.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + + if err != nil { + fmt.Println("Could not open the log file for writing.") + } + + + /* Prepare the Redis database. */ + prepareDb() + SetTrace(true) + cvl.Debug(true) + code := m.Run() + //os.Exit(m.Run()) + + unloadConfigDB(rclient, port_map) + unloadConfigDB(rclient, depDataMap) + cvl.Finish() + rclient.Close() + rclient.FlushDB() + + if err := filehandle.Close(); err != nil { + //log.Fatal(err) + } + + if (redisAlreadyRunning == false) { + //If Redis was not already running, close the instance that we ran + _, err := exec.Command("/bin/sh", "-c", "sudo /etc/init.d/redis-server stop").Output() + if err != nil { + fmt.Println(err.Error()) + } + + } + + os.Exit(code) + +} + +//Test Initialize() API +func TestInitialize(t *testing.T) { + ret := cvl.Initialize() + if (ret != cvl.CVL_SUCCESS) { + t.Errorf("CVl initialization failed") + } + + ret = cvl.Initialize() + if (ret != cvl.CVL_SUCCESS) { + t.Errorf("CVl re-initialization should not fail") + } +} + +//Test Initialize() API +func TestFinish(t *testing.T) { + ret := cvl.Initialize() + if (ret != cvl.CVL_SUCCESS) { + t.Errorf("CVl initialization failed") + } + + cvl.Finish() + + //Initialize again for other test cases to run + cvl.Initialize() +} + +/* ValidateEditConfig with user input in file . */ +func TestValidateEditConfig_CfgFile(t *testing.T) { + + tests := []struct { + filedescription string + cfgDataFile string + depDataFile string + retCode cvl.CVLRetCode + }{ + {filedescription: "ACL_DATA", cfgDataFile: "testdata/aclrule.json", depDataFile: "testdata/acltable.json", retCode: cvl.CVL_SUCCESS}, + } + + cvSess, _ := cvl.ValidationSessOpen() + + for index, tc := range tests { + t.Logf("Running Testcase %d with Description %s", index+1, tc.filedescription) + + t.Run(tc.filedescription, func(t *testing.T) { + + jsonEditCfg_Create_DependentMap := convertJsonFileToMap(t, tc.depDataFile) + jsonEditCfg_Create_ConfigMap := convertJsonFileToMap(t, tc.cfgDataFile) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{cvl.VALIDATE_ALL, cvl.OP_CREATE, "ACL_TABLE|TestACL1", jsonEditCfg_Create_DependentMap}, + } + + + cvlErrObj, err := cvSess.ValidateEditConfig(cfgData) + + if err != tc.retCode { + t.Errorf("Config Validation failed. %v", cvlErrObj) + } + + cfgData = []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{cvl.VALIDATE_ALL, cvl.OP_CREATE, "ACL_RULE|TestACL1|Rule1", jsonEditCfg_Create_ConfigMap}, + } + + + cvlErrObj, err = cvSess.ValidateEditConfig(cfgData) + + if err != tc.retCode { + t.Errorf("Config Validation failed. %v", cvlErrObj) + } + }) + } + + cvl.ValidationSessClose(cvSess) +} + +/* ValidateEditConfig with user input inline. */ +func TestValidateEditConfig_CfgStrBuffer(t *testing.T) { + + type testStruct struct { + filedescription string + cfgData string + depData string + retCode cvl.CVLRetCode + } + + cvSess, _ := cvl.ValidationSessOpen() + + tests := []testStruct{} + + /* Iterate through data present is separate file. */ + for index, _ := range json_edit_config_create_acl_table_dependent_data { + tests = append(tests, testStruct{filedescription: "ACL_DATA", cfgData: json_edit_config_create_acl_rule_config_data[index], + depData: json_edit_config_create_acl_table_dependent_data[index], retCode: cvl.CVL_SUCCESS}) + } + + for index, tc := range tests { + t.Logf("Running Testcase %d with Description %s", index+1, tc.filedescription) + t.Run(tc.filedescription, func(t *testing.T) { + jsonEditCfg_Create_DependentMap := convertDataStringToMap(t, tc.depData) + jsonEditCfg_Create_ConfigMap := convertDataStringToMap(t, tc.cfgData) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{cvl.VALIDATE_ALL, cvl.OP_CREATE, "ACL_TABLE|TestACL1", jsonEditCfg_Create_DependentMap}, + } + + + cvlErrObj, err := cvSess.ValidateEditConfig(cfgData) + + if err != tc.retCode { + t.Errorf("Config Validation failed. %v", cvlErrObj) + } + + cfgData = []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{cvl.VALIDATE_ALL, cvl.OP_CREATE, "ACL_RULE|TestACL1|Rule1", jsonEditCfg_Create_ConfigMap}, + } + + + cvlErrObj, err = cvSess.ValidateEditConfig(cfgData) + + if err != tc.retCode { + t.Errorf("Config Validation failed. %v", cvlErrObj) + } + }) + } + + cvl.ValidationSessClose(cvSess) +} +/* API when config is given as string buffer. */ +func TestValidateConfig_CfgStrBuffer(t *testing.T) { + type testStruct struct { + filedescription string + jsonString string + retCode cvl.CVLRetCode + } + + tests := []testStruct{} + + for index, _ := range json_validate_config_data { + // Fetch the modelName. + result := strings.Split(json_validate_config_data[index], "{") + modelName := strings.Trim(strings.Replace(strings.TrimSpace(result[1]), "\"", "", -1), ":") + + tests = append(tests, testStruct{filedescription: modelName, jsonString: json_validate_config_data[index], retCode: cvl.CVL_SUCCESS}) + } + + cvSess, _ := cvl.ValidationSessOpen() + + for index, tc := range tests { + t.Logf("Running Testcase %d with Description %s", index+1, tc.filedescription) + t.Run(fmt.Sprintf("%s [%d]", tc.filedescription, index+1), func(t *testing.T) { + err := cvSess.ValidateConfig(tc.jsonString) + + + if err != tc.retCode { + t.Errorf("Config Validation failed.") + } + + }) + } + + cvl.ValidationSessClose(cvSess) + +} + + +/* API when config is given as json file. */ +func TestValidateConfig_CfgFile(t *testing.T) { + + /* Structure containing file information. */ + tests := []struct { + filedescription string + fileName string + retCode cvl.CVLRetCode + }{ + {filedescription: "Config File - VLAN,ACL,PORTCHANNEL", fileName: "testdata/config_db1.json", retCode: cvl.CVL_SUCCESS}, + } + + cvSess, _ := cvl.ValidationSessOpen() + + for index, tc := range tests { + + t.Logf("Running Testcase %d with Description %s", index+1, tc.filedescription) + t.Run(tc.filedescription, func(t *testing.T) { + jsonString := convertJsonFileToString(t, tc.fileName) + err := cvSess.ValidateConfig(jsonString) + + + if err != tc.retCode { + t.Errorf("Config Validation failed.") + } + + }) + } + + cvl.ValidationSessClose(cvSess) +} + +func TestValidateEditConfig_Delete_Must_Check_Positive(t *testing.T) { + depDataMap := map[string]interface{} { + "PORT" : map[string]interface{} { + "Ethernet3" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "81,82,83,84", + "mtu": "9100", + "index": "3", + }, + "Ethernet5" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "85,86,87,89", + "mtu": "9100", + "index": "5", + }, + }, + "ACL_TABLE" : map[string]interface{} { + "TestACL1": map[string] interface{} { + "stage": "INGRESS", + "type": "L3", + "ports@": "Ethernet3,Ethernet5", + }, + "TestACL2": map[string] interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + "ACL_RULE" : map[string]interface{} { + "TestACL1|Rule1": map[string] interface{} { + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + "TestACL2|Rule2": map[string] interface{} { + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cfgDataAclRule := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "ACL_RULE|TestACL2|Rule2", + map[string]string { + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrObj, err := cvSess.ValidateEditConfig(cfgDataAclRule) + + cvl.ValidationSessClose(cvSess) + + if err != cvl.CVL_SUCCESS { //should not succeed + t.Errorf("Config Validation failed. %v", cvlErrObj) + } + + unloadConfigDB(rclient, depDataMap) +} + +/* +func TestValidateEditConfig_Delete_Must_Check_Negative(t *testing.T) { + depDataMap := map[string]interface{} { + "PORT" : map[string]interface{} { + "Ethernet3" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "81,82,83,84", + "mtu": "9100", + }, + "Ethernet5" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "85,86,87,89", + "mtu": "9100", + }, + }, + "ACL_TABLE" : map[string]interface{} { + "TestACL1": map[string] interface{} { + "stage": "INGRESS", + "type": "L3", + "ports@": "Ethernet3,Ethernet5", + }, + }, + "ACL_RULE" : map[string]interface{} { + "TestACL1|Rule1": map[string] interface{} { + "PACKET_ACTION": "FORWARD", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cfgDataAclRule := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "ACL_RULE|TestACL1|Rule1", + map[string]string { + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrObj, err := cvSess.ValidateEditConfig(cfgDataAclRule) + + cvl.ValidationSessClose(cvSess) + + if err == cvl.CVL_SUCCESS { //should not succeed + t.Errorf("Config Validation failed. %v", cvlErrObj) + } + + unloadConfigDB(rclient, depDataMap) +} +*/ + +//Validate invalid json data +func TestValidateConfig_Negative(t *testing.T) { + cvSess, _ := cvl.ValidationSessOpen() + jsonData := `{ + "VLANjunk": { + "Vlan100": { + "members": [ + "Ethernet4", + "Ethernet8" + ], + "vlanid": "100" + } + } + }` + + err := cvSess.ValidateConfig(jsonData) + + if err == cvl.CVL_SUCCESS { //Should return failure + t.Errorf("Config Validation failed.") + } + + cvl.ValidationSessClose(cvSess) +} + +/* Delete Existing Key.*/ +/* +func TestValidateEditConfig_Delete_Semantic_ACLTableReference_Positive(t *testing.T) { + + depDataMap := map[string]interface{} { + "ACL_TABLE" : map[string]interface{} { + "TestACL1005": map[string] interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + "ACL_RULE": map[string]interface{} { + "TestACL1005|Rule1": map[string] interface{} { + "PACKET_ACTION": "FORWARD", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "ACL_RULE|TestACL1005|Rule1", + map[string]string{}, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + if err != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, depDataMap) +} +*/ + +/* API to test edit config with valid syntax. */ +func TestValidateEditConfig_Create_Syntax_Valid_FieldValue(t *testing.T) { + + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{} { + "TestACL1": map[string]interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, retCode := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + if retCode != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, depDataMap) + +} + +/* API to test edit config with invalid field value. */ +func TestValidateEditConfig_Create_Syntax_CableLength(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "CABLE_LENGTH|AZURE", + map[string]string{ + "Ethernet8": "5m", + "Ethernet12": "5m", + "Ethernet16": "5m", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +/* API to test edit config with invalid field value. */ +func TestValidateEditConfig_Create_Syntax_Invalid_FieldValue(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{cvl.VALIDATE_ALL, cvl.OP_CREATE, "ACL_TABLE|TestACL1", map[string]string{ + "stage": "INGRESS", + "type": "junk", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +/* API to test edit config with valid syntax. */ +func TestValidateEditConfig_Create_Syntax_Invalid_PacketAction_Negative(t *testing.T) { + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{} { + "TestACL1": map[string]interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD777", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + unloadConfigDB(rclient, depDataMap) + +} + +/* API to test edit config with valid syntax. */ +func TestValidateEditConfig_Create_Syntax_Invalid_SrcPrefix_Negative(t *testing.T) { + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{} { + "TestACL1": map[string]interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/3288888", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvl.ValidationSessClose(cvSess) + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + unloadConfigDB(rclient, depDataMap) + +} + +/* API to test edit config with valid syntax. */ +func TestValidateEditConfig_Create_Syntax_InvalidIPAddress_Negative(t *testing.T) { + + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{} { + "TestACL1": map[string]interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1a.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + unloadConfigDB(rclient, depDataMap) + +} + +/* API to test edit config with valid syntax. */ +func TestValidateEditConfig_Create_Syntax_OutofBound_Negative(t *testing.T) { + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{} { + "TestACL1": map[string]interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "19099090909090", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + unloadConfigDB(rclient, depDataMap) + +} + +/* API to test edit config with valid syntax. */ +func TestValidateEditConfig_Create_Syntax_InvalidProtocol_Negative(t *testing.T) { + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{} { + "TestACL1": map[string]interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "10388888", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, depDataMap) +} + +/* API to test edit config with valid syntax. */ +//Note: Syntax check is done first before dependency check +//hence ACL_TABLE is not required here +func TestValidateEditConfig_Create_Syntax_InvalidRange_Negative(t *testing.T) { + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{} { + "TestACL1": map[string]interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "777779000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + unloadConfigDB(rclient, depDataMap) + +} + +/* API to test edit config with valid syntax. */ +func TestValidateEditConfig_Create_Syntax_InvalidCharNEw_Negative(t *testing.T) { + + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1jjjj|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Create_Syntax_SpecialChar_Positive(t *testing.T) { + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{} { + "TestACL1": map[string]interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule_1-2", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSessNew, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSessNew.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSessNew) + + if err != cvl.CVL_SUCCESS { //Should succeed + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, depDataMap) + +} + +func TestValidateEditConfig_Create_Syntax_InvalidKeyName_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "AC&&***L_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Create_Semantic_AdditionalInvalidNode_Negative(t *testing.T) { + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{} { + "TestACL1": map[string]interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + "extra": "shhs", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, depDataMap) +} + +func TestValidateEditConfig_Create_Semantic_MissingMandatoryNode_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan101", + map[string]string{ + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } +} + +func TestValidateEditConfig_Create_Syntax_Invalid_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULERule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Create_Syntax_IncompleteKey_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Create_Syntax_InvalidKey_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +/* +func TestValidateEditConfig_Update_Syntax_DependentData_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "MIRROR_SESSION|everflow", + map[string]string{ + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2", + }, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_RULE|MyACL11_ACL_IPV4|RULE_1", + map[string]string{ + "MIRROR_ACTION": "everflow", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrObj, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrObj)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrObj) + } + +} + +func TestValidateEditConfig_Create_Syntax_DependentData_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL|ch1", + map[string]string{ + "admin_status": "up", + "mtu": "9100", + }, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL|ch2", + map[string]string{ + "admin_status": "up", + "mtu": "9100", + }, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL_MEMBER|ch1|Ethernet4", + map[string]string{}, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL_MEMBER|ch1|Ethernet8", + map[string]string{}, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL_MEMBER|ch2|Ethernet12", + map[string]string{}, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL_MEMBER|ch2|Ethernet16", + map[string]string{}, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL_MEMBER|ch2|Ethernet20", + map[string]string{}, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan1001", + map[string]string{ + "vlanid": "102", + "members@": "Ethernet24,ch1,Ethernet8", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} +*/ + +func TestValidateEditConfig_Delete_Syntax_InvalidKey_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Update_Syntax_InvalidKey_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Delete_InvalidKey_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "ACL_RULE|TestACL1:Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrObj, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrObj)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrObj) + } + +} + +func TestValidateEditConfig_Update_Semantic_Invalid_Key_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_RULE|TestACL1Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103uuuu", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Delete_Semantic_Positive(t *testing.T) { + depDataMap := map[string]interface{}{ + "MIRROR_SESSION": map[string]interface{}{ + "everflow": map[string]interface{}{ + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "MIRROR_SESSION|everflow", + map[string]string{}, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + if err != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, depDataMap) + +} + +func TestValidateEditConfig_Delete_Semantic_KeyNotExisting_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "MIRROR_SESSION|everflow0", + map[string]string{}, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Update_Semantic_MissingKey_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_RULE|TestACL177|Rule1", + map[string]string{ + "MIRROR_ACTION": "everflow", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Create_Duplicate_Key_Negative(t *testing.T) { + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{} { + "TestACL100": map[string]interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + //Load same key in DB + loadConfigDB(rclient, depDataMap) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_TABLE|TestACL100", + map[string]string{ + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, retCode := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if retCode == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, depDataMap) +} + +/* API to test edit config with valid syntax. */ +func TestValidateEditConfig_Update_Semantic_Positive(t *testing.T) { + + // Create ACL Table. + fileName := "testdata/create_acl_table.json" + aclTableMapByte, err := ioutil.ReadFile(fileName) + if err != nil { + fmt.Printf("read file %v err: %v", fileName, err) + } + + mpi_acl_table_map := loadConfig("", aclTableMapByte) + loadConfigDB(rclient, mpi_acl_table_map) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_TABLE|TestACL1", + map[string]string{ + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, retCode := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + if retCode != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, mpi_acl_table_map) + +} + +/* API to test edit config with valid syntax. */ +func TestValidateConfig_Update_Semantic_Vlan_Negative(t *testing.T) { + + cvSess, _ := cvl.ValidationSessOpen() + + jsonData := `{ + "VLAN": { + "Vlan100": { + "members": [ + "Ethernet44", + "Ethernet64" + ], + "vlanid": "107" + } + } + }` + + err := cvSess.ValidateConfig(jsonData) + + if err == cvl.CVL_SUCCESS { //Expected semantic failure + t.Errorf("Config Validation failed -- error details.") + } + + cvl.ValidationSessClose(cvSess) +} + +func TestValidateEditConfig_Update_Syntax_DependentData_Redis_Positive(t *testing.T) { + + // Create ACL Table. + fileName := "testdata/create_acl_table13.json" + aclTableMapByte, err := ioutil.ReadFile(fileName) + if err != nil { + fmt.Printf("read file %v err: %v", fileName, err) + } + + mpi_acl_table_map := loadConfig("", aclTableMapByte) + loadConfigDB(rclient, mpi_acl_table_map) + + // Create ACL Rule. + fileName = "testdata/acl_rule.json" + aclTableMapRule, err := ioutil.ReadFile(fileName) + if err != nil { + fmt.Printf("read file %v err: %v", fileName, err) + } + + mpi_acl_table_rule := loadConfig("", aclTableMapRule) + loadConfigDB(rclient, mpi_acl_table_rule) + + depDataMap := map[string]interface{}{ + /* Use MIRROR session once supported --- + "MIRROR_SESSION": map[string]interface{}{ + "everflow2": map[string]interface{}{ + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2", + }, + }, + */ + } + + loadConfigDB(rclient, depDataMap) + + /* ACL and Rule name pre-created . */ + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_RULE|TestACL13|Rule1", + map[string]string{ + /* Use Mirror session when supported + "MIRROR_ACTION": "everflow2", + */ + "PACKET_ACTION" : "FORWARD", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, retCode := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + if retCode != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, mpi_acl_table_map) + unloadConfigDB(rclient, mpi_acl_table_rule) + unloadConfigDB(rclient, depDataMap) + +} + +func TestValidateEditConfig_Update_Syntax_DependentData_Invalid_Op_Seq(t *testing.T) { + + /* ACL and Rule name pre-created . */ + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_CREATE, + "ACL_TABLE|TestACL1", + map[string]string{ + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "DROP", + "L4_SRC_PORT": "781", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + if err == cvl.CVL_SUCCESS { //Validation should fail + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Update_Syntax_DependentData_Redis_Negative(t *testing.T) { + + /* ACL does not exist.*/ + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "MIRROR_ACTION": "everflow0", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +/* Create with User provided dependent data. */ +func TestValidateEditConfig_Create_Syntax_DependentData_Redis_Positive(t *testing.T) { + + /* ACL and Rule name pre-created . */ + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_TABLE|TestACL22", + map[string]string{ + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + if err != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + cfgData = []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL22|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvlErrInfo, err = cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + if err != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } +} + +/* Delete Non-Existing Key.*/ +func TestValidateEditConfig_Delete_Semantic_ACLTableReference_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "ACL_RULE|MyACL11_ACL_IPV4|RULE_1", + map[string]string{}, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Create_Dependent_CacheData(t *testing.T) { + + cvSess, _ := cvl.ValidationSessOpen() + + //Create ACL rule + cfgDataAcl := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_TABLE|TestACL14", + map[string]string{ + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + } + + cvlErrInfo, err1 := cvSess.ValidateEditConfig(cfgDataAcl) + + //Create ACL rule + cfgDataRule := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL14|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvlErrInfo, err2 := cvSess.ValidateEditConfig(cfgDataRule) + + if err1 != cvl.CVL_SUCCESS || err2 != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + cvl.ValidationSessClose(cvSess) +} + +func TestValidateEditConfig_Create_DepData_In_MultiSess(t *testing.T) { + + //Create ACL rule - Session 1 + cvSess, _ := cvl.ValidationSessOpen() + cfgDataAcl := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_TABLE|TestACL16", + map[string]string{ + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + } + + cvlErrInfo, err1 := cvSess.ValidateEditConfig(cfgDataAcl) + + cvl.ValidationSessClose(cvSess) + + //Create ACL rule - Session 2, validation should fail + cvSess, _ = cvl.ValidationSessOpen() + cfgDataRule := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL16|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + _, err2 := cvSess.ValidateEditConfig(cfgDataRule) + + + cvl.ValidationSessClose(cvSess) + + if err1 != cvl.CVL_SUCCESS || err2 == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Create_DepData_From_Redis_Negative11(t *testing.T) { + + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{}{ + "TestACL1": map[string]interface{}{ + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + //Create ACL rule - Session 2 + cvSess, _ := cvl.ValidationSessOpen() + cfgDataRule := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL188|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgDataRule) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + + cvl.ValidationSessClose(cvSess) + + if (err != cvl.CVL_SEMANTIC_DEPENDENT_DATA_MISSING) { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, depDataMap) +} + +func TestValidateEditConfig_Create_DepData_From_Redis(t *testing.T) { + + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{}{ + "TestACL1": map[string]interface{}{ + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + //Create ACL rule - Session 2 + cvSess, _ := cvl.ValidationSessOpen() + cfgDataRule := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgDataRule) + + cvl.ValidationSessClose(cvSess) + + if err != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, depDataMap) +} + +func TestValidateEditConfig_Create_Syntax_ErrAppTag_In_Range_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan701", + map[string]string{ + "vlanid": "7001", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, retCode := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + /* Compare expected error details and error tag. */ + if compareErrorDetails(cvlErrInfo, cvl.CVL_SYNTAX_ERROR, "vlanid-invalid", "") != true { + t.Errorf("Config Validation failed -- error details %v %v", cvlErrInfo, retCode) + } + +} + +func TestValidateEditConfig_Create_Syntax_ErrAppTag_In_Length_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_TABLE|TestACL1", + map[string]string{ + "stage": "INGRESS", + "type": "MIRROR", + "policy_desc": "A12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, retCode := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + /* Compare expected error details and error tag. */ + if compareErrorDetails(cvlErrInfo, cvl.CVL_SYNTAX_ERROR, "policy-desc-invalid-length", "") != true { + t.Errorf("Config Validation failed -- error details %v %v", cvlErrInfo, retCode) + } + +} + +func TestValidateEditConfig_Create_Syntax_ErrAppTag_In_Pattern_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan5001", + map[string]string{ + "vlanid": "102", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, retCode := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + /* Compare expected error details and error tag. */ + if compareErrorDetails(cvlErrInfo, cvl.CVL_SYNTAX_ERROR, "vlan-name-invalid", "") != true { + t.Errorf("Config Validation failed -- error details %v %v", cvlErrInfo, retCode) + } + +} + +func TestValidateEditConfig_Create_ErrAppTag_In_Must_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan1001", + map[string]string{ + "vlanid": "102", + "members@": "Ethernet24,Ethernet8", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, retCode := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + /* Compare expected error details and error tag. */ + if compareErrorDetails(cvlErrInfo, cvl.CVL_SEMANTIC_DEPENDENT_DATA_MISSING ,"vlan-invalid", "") != true { + t.Errorf("Config Validation failed -- error details %v %v", cvlErrInfo, retCode) + } + +} + +/* API to test edit config with valid syntax. */ +func TestValidateEditConfig_Create_Syntax_InValid_FieldValue(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_UPDATE, + "ACL_TABLE|TestACL1", + map[string]string{ + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_NONE, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "ACL_RULE|TestACL1", + map[string]string{}, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, retCode := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if retCode == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } +} + +//EditConfig(Create) with dependent data from redis +func TestValidateEditConfig_Create_DepData_From_Redis_Negative(t *testing.T) { + + depDataMap := map[string]interface{} { + "ACL_TABLE" : map[string]interface{} { + "TestACL1": map[string] interface{} { + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + cfgDataRule := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL2|Rule1", + map[string]string { + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgDataRule) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { //should not succeed + t.Errorf("Config Validation should fail.") + } + + unloadConfigDB(rclient, depDataMap) +} + +// EditConfig(Create) with chained leafref from redis +func TestValidateEditConfig_Create_Chained_Leafref_DepData_Positive(t *testing.T) { + depDataMap := map[string]interface{} { + "VLAN" : map[string]interface{} { + "Vlan100": map[string]interface{} { + "members@": "Ethernet1", + "vlanid": "100", + }, + }, + "PORT" : map[string]interface{} { + "Ethernet1" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "81,82,83,84", + "mtu": "9100", + "index": "1", + }, + "Ethernet2" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "85,86,87,89", + "mtu": "9100", + "index": "2", + }, + }, + "ACL_TABLE" : map[string]interface{} { + "TestACL1": map[string] interface{} { + "stage": "INGRESS", + "type": "L3", + "ports@":"Ethernet2", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cvSess, _ := cvl.ValidationSessOpen() + + cfgDataVlan := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN_MEMBER|Vlan100|Ethernet1", + map[string]string { + "tagging_mode" : "tagged", + }, + }, + } + + _, err := cvSess.ValidateEditConfig(cfgDataVlan) + + if err != cvl.CVL_SUCCESS { //should succeed + t.Errorf("Config Validation failed.") + return + } + + cfgDataAclRule := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string { + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + + _, err = cvSess.ValidateEditConfig(cfgDataAclRule) + + cvl.ValidationSessClose(cvSess) + + if err != cvl.CVL_SUCCESS { //should succeed + t.Errorf("Config Validation failed.") + } + + unloadConfigDB(rclient, depDataMap) +} + +//EditConfig(Delete) deleting entry already used by other table as leafref +func TestValidateEditConfig_Delete_Dep_Leafref_Negative(t *testing.T) { + depDataMap := map[string]interface{} { + "ACL_TABLE" : map[string]interface{} { + "TestACL1": map[string] interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + "ACL_RULE": map[string]interface{} { + "TestACL1|Rule1": map[string] interface{} { + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cfgDataVlan := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "ACL_TABLE|TestACL1", + map[string]string { + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgDataVlan) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err == cvl.CVL_SUCCESS { //should be semantic failure + t.Errorf("Config Validation failed.") + } + + unloadConfigDB(rclient, depDataMap) +} + +//EditConfig(Create) with chained leafref from redis +func TestValidateEditConfig_Create_Chained_Leafref_DepData_Negative(t *testing.T) { + depDataMap := map[string]interface{} { + "PORT" : map[string]interface{} { + "Ethernet3" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "81,82,83,84", + "mtu": "9100", + "index": "3", + }, + "Ethernet5" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "85,86,87,89", + "mtu": "9100", + "index": "5", + }, + }, + "ACL_TABLE" : map[string]interface{} { + "TestACL1": map[string] interface{} { + "stage": "INGRESS", + "type": "L3", + "ports@":"Ethernet2", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cfgDataAclRule := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string { + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + _, err := cvSess.ValidateEditConfig(cfgDataAclRule) + + cvl.ValidationSessClose(cvSess) + + if err == cvl.CVL_SUCCESS { //should not succeed + t.Errorf("Config Validation failed.") + } + + unloadConfigDB(rclient, depDataMap) +} +func TestValidateEditConfig_Create_Syntax_InvalidVlanRange_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan5002", + map[string]string{ + "vlanid": "6002", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, retCode := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if retCode == cvl.CVL_SUCCESS { //should not succeed + t.Errorf("Config Validation failed with details %v.", cvlErrInfo) + } + +} + +//Test Initialize() API +func TestLogging(t *testing.T) { + ret := cvl.Initialize() + str := "Testing" + cvl.CVL_LOG(INFO ,"This is Info Log %s", str) + cvl.CVL_LOG(WARNING,"This is Warning Log %s", str) + cvl.CVL_LOG(ERROR ,"This is Error Log %s", str) + cvl.CVL_LOG(INFO_API ,"This is Info API %s", str) + cvl.CVL_LOG(INFO_TRACE ,"This is Info Trace %s", str) + cvl.CVL_LOG(INFO_DEBUG ,"This is Info Debug %s", str) + cvl.CVL_LOG(INFO_DATA ,"This is Info Data %s", str) + cvl.CVL_LOG(INFO_DETAIL ,"This is Info Detail %s", str) + cvl.CVL_LOG(INFO_ALL ,"This is Info all %s", str) + + if (ret != cvl.CVL_SUCCESS) { + t.Errorf("CVl initialization failed") + } + + cvl.Finish() + + //Initialize again for other test cases to run + cvl.Initialize() +} + +func TestValidateEditConfig_DepData_Through_Cache(t *testing.T) { + depDataMap := map[string]interface{} { + "PORT" : map[string]interface{} { + "Ethernet3" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "81,82,83,84", + "mtu": "9100", + "index": "3", + }, + "Ethernet5" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "85,86,87,89", + "mtu": "9100", + "index": "5", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + //Modify entry + depDataMap = map[string]interface{} { + "PORT" : map[string]interface{} { + "Ethernet3" : map[string]interface{} { + "mtu": "9200", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + cfgDataAclRule := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_TABLE|TestACL1", + map[string]string { + "stage": "INGRESS", + "type": "L3", + "ports@":"Ethernet3,Ethernet5", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + _, err := cvSess.ValidateEditConfig(cfgDataAclRule) + + cvl.ValidationSessClose(cvSess) + + if err != cvl.CVL_SUCCESS { //should succeed + t.Errorf("Config Validation failed.") + } + + unloadConfigDB(rclient, depDataMap) +} + +/* Delete field for an existing key.*/ +func TestValidateEditConfig_Delete_Single_Field_Positive(t *testing.T) { + + depDataMap := map[string]interface{} { + "ACL_TABLE" : map[string]interface{} { + "TestACL1": map[string] interface{} { + "stage": "INGRESS", + "type": "L3", + "policy_desc":"Test ACL desc", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "ACL_TABLE|TestACL1", + map[string]string{ + "policy_desc":"Test ACL desc", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + if err != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + + unloadConfigDB(rclient, depDataMap) +} + +func TestValidateConfig_Repeated_Keys_Positive(t *testing.T) { + jsonData := `{ + "WRED_PROFILE": { + "AZURE_LOSSLESS": { + "red_max_threshold": "312000", + "wred_green_enable": "true", + "ecn": "ecn_all", + "green_min_threshold": "104000", + "red_min_threshold": "104000", + "wred_yellow_enable": "true", + "yellow_min_threshold": "104000", + "wred_red_enable": "true", + "yellow_max_threshold": "312000", + "green_max_threshold": "312000" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type": "DWRR", + "weight": "25" + }, + "scheduler.1": { + "type": "DWRR", + "weight": "30" + }, + "scheduler.2": { + "type": "DWRR", + "weight": "20" + } + }, + "QUEUE": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { + "scheduler": "[SCHEDULER|scheduler.1]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { + "scheduler": "[SCHEDULER|scheduler.2]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "wred_profile": "[WRED_PROFILE|AZURE_LOSSLESS]", + "scheduler": "[SCHEDULER|scheduler.0]" + } + } + }` + + cvSess, _ := cvl.ValidationSessOpen() + err := cvSess.ValidateConfig(jsonData) + + if err != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details.") + } + + cvl.ValidationSessClose(cvSess) +} + +func TestValidateEditConfig_Delete_Entry_Then_Dep_Leafref_Positive(t *testing.T) { + depDataMap := map[string]interface{} { + "VLAN" : map[string]interface{} { + "Vlan20": map[string] interface{} { + "vlanid": "20", + }, + }, + "VLAN_MEMBER": map[string]interface{} { + "Vlan20|Ethernet4": map[string] interface{} { + "tagging_mode": "tagged", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cvSess, _ := cvl.ValidationSessOpen() + + cfgDataAcl := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "VLAN_MEMBER|Vlan20|Ethernet4", + map[string]string { + }, + }, + } + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgDataAcl) + + cfgDataAcl = []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_NONE, + cvl.OP_DELETE, + "VLAN_MEMBER|Vlan20|Ethernet4", + map[string]string { + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "VLAN|Vlan20", + map[string]string { + }, + }, + } + + cvlErrInfo, err = cvSess.ValidateEditConfig(cfgDataAcl) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err != cvl.CVL_SUCCESS { //should be success + t.Errorf("Config Validation failed.") + } + + unloadConfigDB(rclient, depDataMap) +} + +func TestBadSchema(t *testing.T) { + env := os.Environ() + env[0] = env[0] + " " + + if _, err := os.Stat("/usr/sbin/schema"); os.IsNotExist(err) { + //Corrupt some schema file + exec.Command("/bin/sh", "-c", "/bin/cp testdata/schema/sonic-port.yin testdata/schema/sonic-port.yin.bad" + + " && /bin/sed -i '1 a ' testdata/schema/sonic-port.yin.bad").Output() + + //Parse bad schema file + if module, _ := yparser.ParseSchemaFile("testdata/schema/sonic-port.yin.bad"); module != nil { //should fail + t.Errorf("Bad schema parsing should fail.") + } + + //Revert to + exec.Command("/bin/sh", "-c", "/bin/rm testdata/schema/sonic-port.yin.bad").Output() + } else { + //Corrupt some schema file + exec.Command("/bin/sh", "-c", "/bin/cp /usr/sbin/schema/sonic-port.yin /usr/sbin/schema/sonic-port.yin.bad" + + " && /bin/sed -i '1 a ' /usr/sbin/schema/sonic-port.yin.bad").Output() + + //Parse bad schema file + if module, _ := yparser.ParseSchemaFile("/usr/sbin/schema/sonic-port.yin.bad"); module != nil { //should fail + t.Errorf("Bad schema parsing should fail.") + } + + //Revert to + exec.Command("/bin/sh", "-c", "/bin/rm /usr/sbin/schema/sonic-port.yin.bad").Output() + } + +} + + +func TestServicability_Debug_Trace(t *testing.T) { + + cvl.Debug(false) + SetTrace(false) + + //Reload the config file by sending SIGUSR2 to ourself + p, err := os.FindProcess(os.Getpid()) + if (err == nil) { + p.Signal(syscall.SIGUSR2) + } + + + depDataMap := map[string]interface{}{ + "ACL_TABLE": map[string]interface{}{ + "TestACL1": map[string]interface{}{ + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + } + + loadConfigDB(rclient, depDataMap) + + //Create ACL rule - Session 2 + cvSess, _ := cvl.ValidationSessOpen() + cfgDataRule := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + + cvSess.ValidateEditConfig(cfgDataRule) + + unloadConfigDB(rclient, depDataMap) + + SetTrace(true) + cvl.Debug(true) + + cvl.ValidationSessClose(cvSess) + + //Reload the bad config file by sending SIGUSR2 to ourself + exec.Command("/bin/sh", "-c", "/bin/cp conf/cvl_cfg.json conf/cvl_cfg.json.orig" + + " && /bin/echo 'junk' >> conf/cvl_cfg.json").Output() + p, err = os.FindProcess(os.Getpid()) + if (err == nil) { + p.Signal(syscall.SIGUSR2) + } + exec.Command("/bin/sh", "-c", "/bin/mv conf/cvl_cfg.json.orig conf/cvl_cfg.json").Output() +} + +// EditConfig(Create) with chained leafref from redis +func TestValidateEditConfig_Delete_Create_Same_Entry_Positive(t *testing.T) { + depDataMap := map[string]interface{} { + "VLAN" : map[string]interface{} { + "Vlan100": map[string]interface{} { + "members@": "Ethernet1", + "vlanid": "100", + }, + }, + "PORT" : map[string]interface{} { + "Ethernet1" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "81,82,83,84", + "mtu": "9100", + "index": "1", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cvSess, _ := cvl.ValidationSessOpen() + + cfgDataVlan := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "VLAN|Vlan100", + map[string]string { + }, + }, + } + + _, err1 := cvSess.ValidateEditConfig(cfgDataVlan) + + //Same entry getting created again + cfgDataVlan = []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan100", + map[string]string { + "vlanid": "100", + }, + }, + } + + _, err2 := cvSess.ValidateEditConfig(cfgDataVlan) + + if err1 != cvl.CVL_SUCCESS || err2 != cvl.CVL_SUCCESS { //should succeed + t.Errorf("Config Validation failed.") + return + } + + + cvl.ValidationSessClose(cvSess) + + unloadConfigDB(rclient, depDataMap) +} + +func TestValidateStartupConfig_Positive(t *testing.T) { + cvSess, _ := cvl.ValidationSessOpen() + if cvl.CVL_NOT_IMPLEMENTED != cvSess.ValidateStartupConfig("") { + t.Errorf("Not implemented yet.") + } + cvl.ValidationSessClose(cvSess) +} + +func TestValidateIncrementalConfig_Positive(t *testing.T) { + existingDataMap := map[string]interface{} { + "VLAN" : map[string]interface{} { + "Vlan800": map[string]interface{} { + "members@": "Ethernet1", + "vlanid": "800", + }, + "Vlan801": map[string]interface{} { + "members@": "Ethernet2", + "vlanid": "801", + }, + }, + "VLAN_MEMBER": map[string]interface{} { + "Vlan800|Ethernet1": map[string] interface{} { + "tagging_mode": "tagged", + }, + }, + "PORT" : map[string]interface{} { + "Ethernet1" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "81,82,83,84", + "mtu": "9100", + "index": "1", + }, + "Ethernet2" : map[string]interface{} { + "alias":"hundredGigE1", + "lanes": "85,86,87,89", + "mtu": "9100", + "index": "2", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, existingDataMap) + + cvSess, _ := cvl.ValidationSessOpen() + + jsonData := `{ + "VLAN": { + "Vlan800": { + "members": [ + "Ethernet1", + "Ethernet2" + ], + "vlanid": "800" + } + }, + "VLAN_MEMBER": { + "Vlan800|Ethernet1": { + "tagging_mode": "untagged" + }, + "Vlan801|Ethernet2": { + "tagging_mode": "tagged" + } + } + }` + + ret := cvSess.ValidateIncrementalConfig(jsonData) + + cvl.ValidationSessClose(cvSess) + + unloadConfigDB(rclient, existingDataMap) + + if ret != cvl.CVL_SUCCESS { //should succeed + t.Errorf("Config Validation failed.") + return + } +} + +//Validate key only +func TestValidateKeys(t *testing.T) { + cvSess, _ := cvl.ValidationSessOpen() + if cvl.CVL_NOT_IMPLEMENTED != cvSess.ValidateKeys([]string{}) { + t.Errorf("Not implemented yet.") + } + cvl.ValidationSessClose(cvSess) +} + +//Validate key and data +func TestValidateKeyData(t *testing.T) { + cvSess, _ := cvl.ValidationSessOpen() + if cvl.CVL_NOT_IMPLEMENTED != cvSess.ValidateKeyData("", "") { + t.Errorf("Not implemented yet.") + } + cvl.ValidationSessClose(cvSess) +} + +//Validate key, field and value +func TestValidateFields(t *testing.T) { + cvSess, _ := cvl.ValidationSessOpen() + if cvl.CVL_NOT_IMPLEMENTED != cvSess.ValidateFields("", "", "") { + t.Errorf("Not implemented yet.") + } + cvl.ValidationSessClose(cvSess) +} + +func TestValidateEditConfig_Two_Updates_Positive(t *testing.T) { + depDataMap := map[string]interface{} { + "ACL_TABLE" : map[string]interface{} { + "TestACL1": map[string] interface{} { + "stage": "INGRESS", + "type": "L3", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cvSess, _ := cvl.ValidationSessOpen() + + cfgDataAcl := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_TABLE|TestACL1", + map[string]string { + "policy_desc": "Test ACL", + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_TABLE|TestACL1", + map[string]string { + "type": "MIRROR", + }, + }, + } + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgDataAcl) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err != cvl.CVL_SUCCESS { //should be success + t.Errorf("Config Validation failed.") + } + + unloadConfigDB(rclient, depDataMap) + +} +func TestValidateEditConfig_Create_Syntax_DependentData_PositivePortChannel(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan1001", + map[string]string{ + "vlanid": "1001", + "members@": "Ethernet28,PortChannel002", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + + +func TestValidateEditConfig_Create_Syntax_DependentData_PositivePortChannelIfName(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan1001", + map[string]string{ + "vlanid": "1001", + "members@": "Ethernet24,PortChannel001", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, err := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if err != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} + +func TestValidateEditConfig_Create_Syntax_DependentData_NegativePortChannelEthernet(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan1001", + map[string]string{ + "vlanid": "1001", + "members@": "PortChannel001,Ethernet4", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, _ := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if cvlErrInfo.ErrCode == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } +} + +func TestValidateEditConfig_Create_Syntax_DependentData_NegativePortChannelNew(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan1001", + map[string]string{ + "vlanid": "1001", + "members@": "Ethernet12,PortChannel001", + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, _ := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if cvlErrInfo.ErrCode == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } +} + +func TestValidateEditConfig_Use_Updated_Data_As_Create_DependentData_Positive(t *testing.T) { + depDataMap := map[string]interface{} { + "VLAN" : map[string]interface{} { + "Vlan201": map[string] interface{} { + "vlanid": "201", + "members@": "Ethernet8", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cvSess, _ := cvl.ValidationSessOpen() + + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "VLAN|Vlan201", + map[string]string{ + "members@": "Ethernet8,Ethernet12", + }, + }, + } + + cvlErrInfo, _ := cvSess.ValidateEditConfig(cfgData) + if cvlErrInfo.ErrCode != cvl.CVL_SUCCESS { + unloadConfigDB(rclient, depDataMap) + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + return + } + + cfgData = []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN_MEMBER|Vlan201|Ethernet8", + map[string]string{ + "tagging_mode": "tagged", + }, + }, + } + + cvlErrInfo, _ = cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + unloadConfigDB(rclient, depDataMap) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if cvlErrInfo.ErrCode != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } +} + +func TestValidateEditConfig_Use_Updated_Data_As_Create_DependentData_Single_Call_Positive(t *testing.T) { + depDataMap := map[string]interface{} { + "VLAN" : map[string]interface{} { + "Vlan201": map[string] interface{} { + "vlanid": "201", + "members@": "Ethernet8", + }, + }, + } + + //Prepare data in Redis + loadConfigDB(rclient, depDataMap) + + cvSess, _ := cvl.ValidationSessOpen() + + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "VLAN|Vlan201", + map[string]string{ + "members@": "Ethernet8,Ethernet12", + }, + }, + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN_MEMBER|Vlan201|Ethernet8", + map[string]string{ + "tagging_mode": "tagged", + }, + }, + } + + cvlErrInfo, _ := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + unloadConfigDB(rclient, depDataMap) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if cvlErrInfo.ErrCode != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } +} + +func TestValidateEditConfig_Create_Syntax_Interface_AllKeys_Positive(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "INTERFACE|Ethernet24|10.0.0.0/31", + map[string]string{ + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, _ := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if cvlErrInfo.ErrCode != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } +} + +func TestValidateEditConfig_Create_Syntax_Interface_OptionalKey_Positive(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "INTERFACE|Ethernet24", + map[string]string{ + /*"vrf-name": "Vrf1", -- Enable once VRF YANG implemented */ + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, _ := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if cvlErrInfo.ErrCode != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } +} + +func TestValidateEditConfig_Create_Syntax_Interface_IncorrectKey_Negative(t *testing.T) { + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "INTERFACE|10.0.0.0/31", + map[string]string{ + }, + }, + } + + cvSess, _ := cvl.ValidationSessOpen() + + cvlErrInfo, _ := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if cvlErrInfo.ErrCode == cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } +} + +func TestValidateEditConfig_EmptyNode_Positive(t *testing.T) { + cvSess, _ := cvl.ValidationSessOpen() + + + cfgData := []cvl.CVLEditConfigData{ + cvl.CVLEditConfigData{ + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "PORT|Ethernet0", + map[string]string{ + "description": "", + "index": "3", + }, + }, + } + + cvlErrInfo, _ := cvSess.ValidateEditConfig(cfgData) + + cvl.ValidationSessClose(cvSess) + + WriteToFile(fmt.Sprintf("\nCVL Error Info is %v\n", cvlErrInfo)) + + if cvlErrInfo.ErrCode != cvl.CVL_SUCCESS { + t.Errorf("Config Validation failed -- error details %v", cvlErrInfo) + } + +} diff --git a/src/cvl/internal/util/util.go b/src/cvl/internal/util/util.go new file mode 100644 index 0000000000..7404500d04 --- /dev/null +++ b/src/cvl/internal/util/util.go @@ -0,0 +1,255 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package util + +import ( + "os" + "fmt" + "runtime" + "encoding/json" + "io/ioutil" + "os/signal" + "syscall" + "strings" + "flag" + log "github.com/golang/glog" +) + +var CVL_SCHEMA string = "schema/" +var CVL_CFG_FILE string = "/usr/sbin/cvl_cfg.json" + +//package init function +func init() { + if (os.Getenv("CVL_SCHEMA_PATH") != "") { + CVL_SCHEMA = os.Getenv("CVL_SCHEMA_PATH") + "/" + } + + if (os.Getenv("CVL_CFG_FILE") != "") { + CVL_CFG_FILE = os.Getenv("CVL_CFG_FILE") + } +} + +var cvlCfgMap map[string]string + +/* Logging Level for CVL global logging. */ +type CVLLogLevel uint8 +const ( + INFO = 0 + iota + WARNING + ERROR + FATAL + INFO_API + INFO_TRACE + INFO_DEBUG + INFO_DATA + INFO_DETAIL + INFO_ALL +) + +var cvlTraceFlags uint32 + +/* Logging levels for CVL Tracing. */ +type CVLTraceLevel uint32 +const ( + TRACE_MIN = 0 + TRACE_MAX = 8 + TRACE_CACHE = 1 << TRACE_MIN + TRACE_LIBYANG = 1 << 1 + TRACE_YPARSER = 1 << 2 + TRACE_CREATE = 1 << 3 + TRACE_UPDATE = 1 << 4 + TRACE_DELETE = 1 << 5 + TRACE_SEMANTIC = 1 << 6 + TRACE_ONERROR = 1 << 7 + TRACE_SYNTAX = 1 << TRACE_MAX + +) + + +var traceLevelMap = map[int]string { + /* Caching operation traces */ + TRACE_CACHE : "TRACE_CACHE", + /* Libyang library traces. */ + TRACE_LIBYANG: "TRACE_LIBYANG", + /* Yang Parser traces. */ + TRACE_YPARSER : "TRACE_YPARSER", + /* Create operation traces. */ + TRACE_CREATE : "TRACE_CREATE", + /* Update operation traces. */ + TRACE_UPDATE : "TRACE_UPDATE", + /* Delete operation traces. */ + TRACE_DELETE : "TRACE_DELETE", + /* Semantic Validation traces. */ + TRACE_SEMANTIC : "TRACE_SEMANTIC", + /* Syntax Validation traces. */ + TRACE_SYNTAX : "TRACE_SYNTAX", + /* Trace on Error. */ + TRACE_ONERROR : "TRACE_ONERROR", +} + +var Tracing bool = false + +var traceFlags uint16 = 0 + +func SetTrace(on bool) { + if (on == true) { + Tracing = true + traceFlags = 1 + } else { + Tracing = false + traceFlags = 0 + } +} + +func IsTraceSet() bool { + if (traceFlags == 0) { + return false + } else { + return true + } +} + +func TRACE_LEVEL_LOG(level log.Level, tracelevel CVLTraceLevel, fmtStr string, args ...interface{}) { + + if (IsTraceSet() == false) { + return + } + + level = (level - INFO_API) + 1; + + traceEnabled := false + if ((cvlTraceFlags & (uint32)(tracelevel)) != 0) { + traceEnabled = true + } + + if IsTraceSet() == true && traceEnabled == true { + pc := make([]uintptr, 10) + runtime.Callers(2, pc) + f := runtime.FuncForPC(pc[0]) + file, line := f.FileLine(pc[0]) + + fmt.Printf("%s:%d %s(): ", file, line, f.Name()) + fmt.Printf(fmtStr+"\n", args...) + } else { + if (traceEnabled == true) { + log.V(level).Infof(fmtStr, args...) + } + } +} + +func CVL_LEVEL_LOG(level CVLLogLevel, format string, args ...interface{}) { + + switch level { + case INFO: + log.Infof(format, args...) + case WARNING: + log.Warningf(format, args...) + case ERROR: + log.Errorf(format, args...) + case FATAL: + log.Fatalf(format, args...) + case INFO_API: + log.V(1).Infof(format, args...) + case INFO_TRACE: + log.V(2).Infof(format, args...) + case INFO_DEBUG: + log.V(3).Infof(format, args...) + case INFO_DATA: + log.V(4).Infof(format, args...) + case INFO_DETAIL: + log.V(5).Infof(format, args...) + case INFO_ALL: + log.V(6).Infof(format, args...) + } + +} + + +func ConfigFileSyncHandler() { + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGUSR2) + go func() { + for { + <-sigs + cvlCfgMap := ReadConfFile() + + if cvlCfgMap == nil { + return + } + + CVL_LEVEL_LOG(INFO ,"Received SIGUSR2. Changed configuration values are %v", cvlCfgMap) + + + if (strings.Compare(cvlCfgMap["LOGTOSTDERR"], "true") == 0) { + SetTrace(true) + flag.Set("logtostderr", "true") + flag.Set("stderrthreshold", cvlCfgMap["STDERRTHRESHOLD"]) + flag.Set("v", cvlCfgMap["VERBOSITY"]) + } + } + }() + +} + +func ReadConfFile() map[string]string{ + + /* Return if CVL configuration file is not present. */ + if _, err := os.Stat(CVL_CFG_FILE); os.IsNotExist(err) { + return nil + } + + data, err := ioutil.ReadFile(CVL_CFG_FILE) + + err = json.Unmarshal(data, &cvlCfgMap) + + if err != nil { + CVL_LEVEL_LOG(INFO ,"Error in reading cvl configuration file %v", err) + return nil + } + + CVL_LEVEL_LOG(INFO ,"Current Values of CVL Configuration File %v", cvlCfgMap) + var index uint32 + + for index = TRACE_MIN ; index < TRACE_MAX ; index++ { + if (strings.Compare(cvlCfgMap[traceLevelMap[1 << index]], "true") == 0) { + cvlTraceFlags = cvlTraceFlags | (1 << index) + } + } + + return cvlCfgMap +} + +func SkipValidation() bool { + val, existing := cvlCfgMap["SKIP_VALIDATION"] + if (existing == true) && (val == "true") { + return true + } + + return false +} + +func SkipSemanticValidation() bool { + val, existing := cvlCfgMap["SKIP_SEMANTIC_VALIDATION"] + if (existing == true) && (val == "true") { + return true + } + + return false +} diff --git a/src/cvl/internal/yparser/yparser.go b/src/cvl/internal/yparser/yparser.go new file mode 100644 index 0000000000..55c3f6d367 --- /dev/null +++ b/src/cvl/internal/yparser/yparser.go @@ -0,0 +1,699 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package yparser + +/* Yang parser using libyang library */ + +import ( + "os" + "strings" + log "github.com/golang/glog" + . "cvl/internal/util" +) + +/* +#cgo LDFLAGS: -lyang +#include +#include +#include +#include +#include + +struct lyd_node* lyd_parse_data_path(struct ly_ctx *ctx, const char *path, LYD_FORMAT format, int options) { + return lyd_parse_path(ctx, path, format, options); +} + +struct lyd_node *lyd_parse_data_mem(struct ly_ctx *ctx, const char *data, LYD_FORMAT format, int options) +{ + return lyd_parse_mem(ctx, data, format, options); +} + +int lyd_data_validate(struct lyd_node **node, int options, struct ly_ctx *ctx) +{ + return lyd_validate(node, options, ctx); +} + +int lyd_data_validate_all(const char *data, const char *depData, const char *othDepData, int options, struct ly_ctx *ctx) +{ + struct lyd_node *pData; + struct lyd_node *pDepData; + struct lyd_node *pOthDepData; + + if ((data == NULL) || (data[0] == '\0')) + { + return -1; + } + + pData = lyd_parse_mem(ctx, data, LYD_XML, LYD_OPT_EDIT | LYD_OPT_NOEXTDEPS); + if (pData == NULL) + { + return -1; + } + + if ((depData != NULL) && (depData[0] != '\0')) + { + if (NULL != (pDepData = lyd_parse_mem(ctx, depData, LYD_XML, LYD_OPT_EDIT | LYD_OPT_NOEXTDEPS))) + { + if (0 != lyd_merge_to_ctx(&pData, pDepData, LYD_OPT_DESTRUCT, ctx)) + { + return -1; + } + } + } + + if ((othDepData != NULL) && (othDepData[0] != '\0')) + { + if (NULL != (pOthDepData = lyd_parse_mem(ctx, othDepData, LYD_XML, LYD_OPT_EDIT | LYD_OPT_NOEXTDEPS))) + { + if (0 != lyd_merge_to_ctx(&pData, pOthDepData, LYD_OPT_DESTRUCT, ctx)) + { + return -1; + } + } + } + + return lyd_validate(&pData, LYD_OPT_CONFIG, ctx); +} + +int lyd_multi_new_leaf(struct lyd_node *parent, const struct lys_module *module, const char *leafVal) +{ + char s[4048]; + char *name, *val, *saveptr; + + strcpy(s, leafVal); + + name = strtok_r(s, "#", &saveptr); + + while (name != NULL) + { + val = strtok_r(NULL, "#", &saveptr); + if (val != NULL) + { + if (NULL == lyd_new_leaf(parent, module, name, val)) + { + return -1; + } + } + + name = strtok_r(NULL, "#", &saveptr); + } + + return 0; +} + +struct lyd_node *lyd_find_node(struct lyd_node *root, const char *xpath) +{ + struct ly_set *set = NULL; + struct lyd_node *node = NULL; + + if (root == NULL) + { + return NULL; + } + + set = lyd_find_path(root, xpath); + if (set == NULL || set->number == 0) { + return NULL; + } + + node = set->set.d[0]; + ly_set_free(set); + + return node; +} + +int lyd_change_leaf_data(struct lyd_node *leaf, const char *val_str) +{ + return lyd_change_leaf((struct lyd_node_leaf_list *)leaf, val_str); +} + +*/ +import "C" + +type YParserCtx C.struct_ly_ctx +type YParserNode C.struct_lyd_node +type YParserModule C.struct_lys_module + +var ypCtx *YParserCtx +var ypOpModule *YParserModule +var ypOpRoot *YParserNode //Operation root +var ypOpNode *YParserNode //Operation node + + +type YParser struct { + ctx *YParserCtx //Parser context + root *YParserNode //Top evel root for validation + operation string //Edit operation +} + +/* YParser Error Structure */ +type YParserError struct { + ErrCode YParserRetCode /* Error Code describing type of error. */ + Msg string /* Detailed error message. */ + ErrTxt string /* High level error message. */ + TableName string /* List/Table having error */ + Keys []string /* Keys of the Table having error. */ + Field string /* Field Name throwing error . */ + Value string /* Field Value throwing error */ + ErrAppTag string /* Error App Tag. */ +} + +type YParserRetCode int +const ( + YP_SUCCESS YParserRetCode = 1000 + iota + YP_SYNTAX_ERROR + YP_SEMANTIC_ERROR + YP_SYNTAX_MISSING_FIELD + YP_SYNTAX_INVALID_FIELD /* Invalid Field */ + YP_SYNTAX_INVALID_INPUT_DATA /*Invalid Input Data */ + YP_SYNTAX_MULTIPLE_INSTANCE /* Multiple Field Instances */ + YP_SYNTAX_DUPLICATE /* Duplicate Fields */ + YP_SYNTAX_ENUM_INVALID /* Invalid enum value */ + YP_SYNTAX_ENUM_INVALID_NAME /* Invalid enum name */ + YP_SYNTAX_ENUM_WHITESPACE /* Enum name with leading/trailing whitespaces */ + YP_SYNTAX_OUT_OF_RANGE /* Value out of range/length/pattern (data) */ + YP_SYNTAX_MINIMUM_INVALID /* min-elements constraint not honored */ + YP_SYNTAX_MAXIMUM_INVALID /* max-elements constraint not honored */ + YP_SEMANTIC_DEPENDENT_DATA_MISSING /* Dependent Data is missing */ + YP_SEMANTIC_MANDATORY_DATA_MISSING /* Mandatory Data is missing */ + YP_SEMANTIC_KEY_ALREADY_EXIST /* Key already existing */ + YP_SEMANTIC_KEY_NOT_EXIST /* Key is missing */ + YP_SEMANTIC_KEY_DUPLICATE /* Duplicate key */ + YP_SEMANTIC_KEY_INVALID /* Invalid key */ + YP_INTERNAL_UNKNOWN +) + +var yparserInitialized bool = false + +func TRACE_LOG(level log.Level, tracelevel CVLTraceLevel, fmtStr string, args ...interface{}) { + TRACE_LEVEL_LOG(level, tracelevel , fmtStr, args...) +} + +func CVL_LOG(level CVLLogLevel, fmtStr string, args ...interface{}) { + CVL_LEVEL_LOG(level, fmtStr, args...) +} + +//package init function +func init() { + if (os.Getenv("CVL_DEBUG") != "") { + Debug(true) + } +} + +func Debug(on bool) { + if (on == true) { + C.ly_verb(C.LY_LLDBG) + } else { + C.ly_verb(C.LY_LLERR) + } +} + +func Initialize() { + if (yparserInitialized != true) { + ypCtx = (*YParserCtx)(C.ly_ctx_new(C.CString(CVL_SCHEMA), 0)) + C.ly_verb(C.LY_LLERR) + // yparserInitialized = true + } +} + +func Finish() { + if (yparserInitialized == true) { + C.ly_ctx_destroy((*C.struct_ly_ctx)(ypCtx), nil) + // yparserInitialized = false + } +} + +//Parse YIN schema file +func ParseSchemaFile(modelFile string) (*YParserModule, YParserError) { + /* schema */ + TRACE_LOG(INFO_DEBUG, TRACE_YPARSER, "Parsing schema file %s ...\n", modelFile) + + module := C.lys_parse_path((*C.struct_ly_ctx)(ypCtx), C.CString(modelFile), C.LYS_IN_YIN) + if module == nil { + return nil, getErrorDetails() + } + + if (strings.Contains(modelFile, "sonic-common.yin") == true) { + ypOpModule = (*YParserModule)(module) + ypOpRoot = (*YParserNode)(C.lyd_new(nil, (*C.struct_lys_module)(ypOpModule), C.CString("operation"))) + ypOpNode = (*YParserNode)(C.lyd_new_leaf((*C.struct_lyd_node)(ypOpRoot), (*C.struct_lys_module)(ypOpModule), C.CString("operation"), C.CString("NOP"))) + } + + return (*YParserModule)(module), YParserError {ErrCode : YP_SUCCESS,} +} + +//Add child node to a parent node +func(yp *YParser) AddChildNode(module *YParserModule, parent *YParserNode, name string) *YParserNode { + + ret := (*YParserNode)(C.lyd_new((*C.struct_lyd_node)(parent), (*C.struct_lys_module)(module), C.CString(name))) + if (ret == nil) { + TRACE_LOG(INFO_DEBUG, TRACE_YPARSER, "Failed parsing node %s\n", name) + } + + return ret +} + +//Add child node to a parent node +func(yp *YParser) AddMultiLeafNodes(module *YParserModule, parent *YParserNode, multiLeaf string) YParserError { + if (0 != C.lyd_multi_new_leaf((*C.struct_lyd_node)(parent), (*C.struct_lys_module)(module), C.CString(multiLeaf))) { + if (Tracing == true) { + TRACE_LOG(INFO_API, TRACE_ONERROR, "Failed to create Multi Leaf Data = %v", multiLeaf) + } + return getErrorDetails() + } + + return YParserError {ErrCode : YP_SUCCESS,} + +} + +//Return entire subtree in XML format in string +func (yp *YParser) NodeDump(root *YParserNode) string { + if (root == nil) { + return "" + } else { + var outBuf *C.char + C.lyd_print_mem(&outBuf, (*C.struct_lyd_node)(root), C.LYD_XML, C.LYP_WITHSIBLINGS) + return C.GoString(outBuf) + } +} + +//Merge source with destination +func (yp *YParser) MergeSubtree(root, node *YParserNode) (*YParserNode, YParserError) { + rootTmp := (*C.struct_lyd_node)(root) + + if (root == nil || node == nil) { + return root, YParserError {ErrCode: YP_SUCCESS} + } + + if (Tracing == true) { + rootdumpStr := yp.NodeDump((*YParserNode)(rootTmp)) + TRACE_LOG(INFO_API, TRACE_YPARSER, "Root subtree = %v\n", rootdumpStr) + } + + if (0 != C.lyd_merge_to_ctx(&rootTmp, (*C.struct_lyd_node)(node), C.LYD_OPT_DESTRUCT, + (*C.struct_ly_ctx)(ypCtx))) { + return (*YParserNode)(rootTmp), getErrorDetails() + } + + if (Tracing == true) { + dumpStr := yp.NodeDump((*YParserNode)(rootTmp)) + TRACE_LOG(INFO_API, TRACE_YPARSER, "Merged subtree = %v\n", dumpStr) + } + + return (*YParserNode)(rootTmp), YParserError {ErrCode : YP_SUCCESS,} +} + +//Cache subtree +func (yp *YParser) CacheSubtree(dupSrc bool, node *YParserNode) YParserError { + rootTmp := (*C.struct_lyd_node)(yp.root) + var dup *C.struct_lyd_node + + if (node == nil) { + //nothing to merge + return YParserError {ErrCode : YP_SUCCESS,} + } + + if (dupSrc == true) { + dup = C.lyd_dup_withsiblings((*C.struct_lyd_node)(node), C.LYD_DUP_OPT_RECURSIVE | C.LYD_DUP_OPT_NO_ATTR) + } else { + dup = (*C.struct_lyd_node)(node) + } + + if (yp.root != nil) { + if (0 != C.lyd_merge_to_ctx(&rootTmp, (*C.struct_lyd_node)(dup), C.LYD_OPT_DESTRUCT, + (*C.struct_ly_ctx)(ypCtx))) { + return getErrorDetails() + } + } else { + yp.root = (*YParserNode)(dup) + } + + if (Tracing == true) { + dumpStr := yp.NodeDump((*YParserNode)(rootTmp)) + TRACE_LOG(INFO_API, TRACE_YPARSER, "Cached subtree = %v\n", dumpStr) + } + + return YParserError {ErrCode : YP_SUCCESS,} +} + +func (yp *YParser) DestroyCache() YParserError { + + if (yp.root != nil) { + C.lyd_free_withsiblings((*C.struct_lyd_node)(yp.root)) + yp.root = nil + } + + return YParserError {ErrCode : YP_SUCCESS,} +} + +//Set operation +func (yp *YParser) SetOperation(op string) YParserError { + if (ypOpNode == nil) { + return YParserError {ErrCode : YP_INTERNAL_UNKNOWN,} + } + + if (0 != C.lyd_change_leaf_data((*C.struct_lyd_node)(ypOpNode), C.CString(op))) { + return YParserError {ErrCode : YP_INTERNAL_UNKNOWN,} + } + + yp.operation = op + return YParserError {ErrCode : YP_SUCCESS,} +} + +//Validate config - syntax and semantics +func (yp *YParser) ValidateData(data, depData *YParserNode) YParserError { + + var dataRoot *YParserNode + + if (depData != nil) { + if dataRoot, _ = yp.MergeSubtree(data, depData); dataRoot == nil { + CVL_LOG(ERROR, "Failed to merge dependent data\n") + return getErrorDetails() + } + } + + dataRootTmp := (*C.struct_lyd_node)(dataRoot) + + if (0 != C.lyd_data_validate(&dataRootTmp, C.LYD_OPT_CONFIG, (*C.struct_ly_ctx)(ypCtx))) { + if (Tracing == true) { + strData := yp.NodeDump((*YParserNode)(dataRootTmp)) + TRACE_LOG(INFO_API, TRACE_ONERROR, "Failed to validate data = %v", strData) + } + + CVL_LOG(ERROR, "Validation failed\n") + return getErrorDetails() + } + + return YParserError {ErrCode : YP_SUCCESS,} +} + +//Perform syntax checks +func (yp *YParser) ValidateSyntax(data *YParserNode) YParserError { + dataTmp := (*C.struct_lyd_node)(data) + + //Just validate syntax + if (0 != C.lyd_data_validate(&dataTmp, C.LYD_OPT_EDIT | C.LYD_OPT_NOEXTDEPS, + (*C.struct_ly_ctx)(ypCtx))) { + if (Tracing == true) { + strData := yp.NodeDump((*YParserNode)(dataTmp)) + TRACE_LOG(INFO_API, TRACE_ONERROR, "Failed to validate Syntax, data = %v", strData) + } + return getErrorDetails() + } + //fmt.Printf("Error Code from libyang is %d\n", C.ly_errno) + + return YParserError {ErrCode : YP_SUCCESS,} +} + +//Perform semantic checks +func (yp *YParser) ValidateSemantics(data, depData, appDepData *YParserNode) YParserError { + + var dataTmp *C.struct_lyd_node + + if (data != nil) { + dataTmp = (*C.struct_lyd_node)(data) + } else if (depData != nil) { + dataTmp = (*C.struct_lyd_node)(depData) + } else if (yp.root != nil) { + dataTmp = (*C.struct_lyd_node)(yp.root) + } else { + if (yp.operation == "CREATE") || (yp.operation == "UPDATE") { + return YParserError {ErrCode : YP_INTERNAL_UNKNOWN,} + } else { + return YParserError {ErrCode : YP_SUCCESS,} + } + } + + //parse dependent data + if (data != nil && depData != nil) { + + //merge input data and dependent data for semantic validation + if (0 != C.lyd_merge_to_ctx(&dataTmp, (*C.struct_lyd_node)(depData), + C.LYD_OPT_DESTRUCT, (*C.struct_ly_ctx)(ypCtx))) { + TRACE_LOG(INFO_API, (TRACE_SEMANTIC | TRACE_LIBYANG), "Unable to merge dependent data\n") + return getErrorDetails() + } + } + + //Merge cached data + if ((data != nil || depData != nil) && yp.root != nil) { + if (0 != C.lyd_merge_to_ctx(&dataTmp, (*C.struct_lyd_node)(yp.root), + 0, (*C.struct_ly_ctx)(ypCtx))) { + TRACE_LOG(INFO_API, (TRACE_SEMANTIC | TRACE_LIBYANG), "Unable to merge cached dependent data\n") + return getErrorDetails() + } + } + + //Merge appDepData + if (appDepData != nil) { + if (0 != C.lyd_merge_to_ctx(&dataTmp, (*C.struct_lyd_node)(appDepData), + C.LYD_OPT_DESTRUCT, (*C.struct_ly_ctx)(ypCtx))) { + TRACE_LOG(INFO_API, (TRACE_SEMANTIC | TRACE_LIBYANG), "Unable to merge other dependent data\n") + return getErrorDetails() + } + } + + //Add operation for constraint check + if (ypOpRoot != nil) { + //if (0 != C.lyd_insert_sibling(&dataTmp, (*C.struct_lyd_node)(ypOpRoot))) { + if (0 != C.lyd_merge_to_ctx(&dataTmp, (*C.struct_lyd_node)(ypOpRoot), + 0, (*C.struct_ly_ctx)(ypCtx))) { + TRACE_LOG(INFO_API, (TRACE_SEMANTIC | TRACE_LIBYANG), "Unable to insert operation node") + return getErrorDetails() + } + } + + if (Tracing == true) { + strData := yp.NodeDump((*YParserNode)(dataTmp)) + TRACE_LOG(INFO_API, TRACE_YPARSER, "Semantics data = %v", strData) + } + + //Check semantic validation + if (0 != C.lyd_data_validate(&dataTmp, C.LYD_OPT_CONFIG, (*C.struct_ly_ctx)(ypCtx))) { + if (Tracing == true) { + strData1 := yp.NodeDump((*YParserNode)(dataTmp)) + TRACE_LOG(INFO_API, TRACE_ONERROR, "Failed to validate Semantics, data = %v", strData1) + } + return getErrorDetails() + } + + return YParserError {ErrCode : YP_SUCCESS,} +} + +func (yp *YParser) FreeNode(node *YParserNode) YParserError { + + C.lyd_free_withsiblings((*C.struct_lyd_node)(node)) + + return YParserError {ErrCode : YP_SUCCESS,} +} + +/* This function translates LIBYANG error code to valid YPARSER error code. */ +func translateLYErrToYParserErr(LYErrcode int) YParserRetCode { + var ypErrCode YParserRetCode + + switch LYErrcode { + case C.LYVE_SUCCESS: /**< no error */ + ypErrCode = YP_SUCCESS + case C.LYVE_XML_MISS, C.LYVE_INARG, C.LYVE_MISSELEM: /**< missing XML object */ + ypErrCode = YP_SYNTAX_MISSING_FIELD + case C.LYVE_XML_INVAL, C.LYVE_XML_INCHAR, C.LYVE_INMOD, C.LYVE_INELEM , C.LYVE_INVAL, C.LYVE_MCASEDATA:/**< invalid XML object */ + ypErrCode = YP_SYNTAX_INVALID_FIELD + case C.LYVE_EOF, C.LYVE_INSTMT, C.LYVE_INPAR, C.LYVE_INID, C.LYVE_MISSSTMT, C.LYVE_MISSARG: /**< invalid statement (schema) */ + ypErrCode = YP_SYNTAX_INVALID_INPUT_DATA + case C.LYVE_TOOMANY: /**< too many instances of some object */ + ypErrCode = YP_SYNTAX_MULTIPLE_INSTANCE + case C.LYVE_DUPID, C.LYVE_DUPLEAFLIST, C.LYVE_DUPLIST, C.LYVE_NOUNIQ:/**< duplicated identifier (schema) */ + ypErrCode = YP_SYNTAX_DUPLICATE + case C.LYVE_ENUM_INVAL: /**< invalid enum value (schema) */ + ypErrCode = YP_SYNTAX_ENUM_INVALID + case C.LYVE_ENUM_INNAME: /**< invalid enum name (schema) */ + ypErrCode = YP_SYNTAX_ENUM_INVALID_NAME + case C.LYVE_ENUM_WS: /**< enum name with leading/trailing whitespaces (schema) */ + ypErrCode = YP_SYNTAX_ENUM_WHITESPACE + case C.LYVE_KEY_NLEAF, C.LYVE_KEY_CONFIG, C.LYVE_KEY_TYPE : /**< list key is not a leaf (schema) */ + ypErrCode = YP_SEMANTIC_KEY_INVALID + case C.LYVE_KEY_MISS, C.LYVE_PATH_MISSKEY: /**< list key not found (schema) */ + ypErrCode = YP_SEMANTIC_KEY_NOT_EXIST + case C.LYVE_KEY_DUP: /**< duplicated key identifier (schema) */ + ypErrCode = YP_SEMANTIC_KEY_DUPLICATE + case C.LYVE_NOMIN:/**< min-elements constraint not honored (data) */ + ypErrCode = YP_SYNTAX_MINIMUM_INVALID + case C.LYVE_NOMAX:/**< max-elements constraint not honored (data) */ + ypErrCode = YP_SYNTAX_MAXIMUM_INVALID + case C.LYVE_NOMUST, C.LYVE_NOWHEN, C.LYVE_INWHEN, C.LYVE_NOLEAFREF : /**< unsatisfied must condition (data) */ + ypErrCode = YP_SEMANTIC_DEPENDENT_DATA_MISSING + case C.LYVE_NOMANDCHOICE:/**< max-elements constraint not honored (data) */ + ypErrCode = YP_SEMANTIC_MANDATORY_DATA_MISSING + case C.LYVE_PATH_EXISTS: /**< target node already exists (path) */ + ypErrCode = YP_SEMANTIC_KEY_ALREADY_EXIST + default: + ypErrCode = YP_INTERNAL_UNKNOWN + + } + return ypErrCode +} + +/* This function performs parsing and processing of LIBYANG error messages. */ +func getErrorDetails() YParserError { + var key []string + var errtableName string + var ElemVal string + var errMessage string + var ElemName string + var errText string + var msg string + var ypErrCode YParserRetCode = YP_INTERNAL_UNKNOWN + var errMsg, errPath, errAppTag string + + ctx := (*C.struct_ly_ctx)(ypCtx) + ypErrFirst := C.ly_err_first(ctx); + + + if (ypErrFirst == nil) { + return YParserError { + TableName : errtableName, + ErrCode : ypErrCode, + Keys : key, + Value : ElemVal, + Field : ElemName, + Msg : errMessage, + ErrTxt: errText, + ErrAppTag: errAppTag, + } + } + + + if ((ypErrFirst != nil) && ypErrFirst.prev.no == C.LY_SUCCESS) { + return YParserError { + ErrCode : YP_SUCCESS, + } + } + + if (ypErrFirst != nil) { + errMsg = C.GoString(ypErrFirst.prev.msg) + errPath = C.GoString(ypErrFirst.prev.path) + errAppTag = C.GoString(ypErrFirst.prev.apptag) + } + + + /* Example error messages. + 1. Leafref "/sonic-port:sonic-port/sonic-port:PORT/sonic-port:ifname" of value "Ethernet668" points to a non-existing leaf. + (path: /sonic-interface:sonic-interface/INTERFACE[portname='Ethernet668'][ip_prefix='10.0.0.0/31']/portname) + 2. A vlan interface member cannot be part of portchannel which is already a vlan member + (path: /sonic-vlan:sonic-vlan/VLAN[name='Vlan1001']/members[.='Ethernet8']) + 3. Value "ch1" does not satisfy the constraint "Ethernet([1-3][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[0-9])" (range, length, or pattern). + (path: /sonic-vlan:sonic-vlan/VLAN[name='Vlan1001']/members[.='ch1'])*/ + + + /* Fetch the TABLE Name which are in CAPS. */ + resultTable := strings.SplitN(errPath, "[", 2) + if (len(resultTable) >= 2) { + resultTab := strings.Split(resultTable[0], "/") + errtableName = resultTab[len(resultTab) -1] + + /* Fetch the Error Elem Name. */ + resultElem := strings.Split(resultTable[1], "/") + ElemName = resultElem[len(resultElem) -1] + } + + /* Fetch the invalid field name. */ + result := strings.Split(errMsg, "\"") + if (len(result) > 1) { + for i := range result { + if (strings.Contains(result[i], "value")) || + (strings.Contains(result[i], "Value")) { + ElemVal = result[i+1] + } + } + } else if (len(result) == 1) { + /* Custom contraint error message like in must statement. + This can be used by App to display to user. + */ + errText = errMsg + } + + // Find key elements + resultKey := strings.Split(errPath, "=") + for i := range resultKey { + if (strings.Contains(resultKey[i], "]")) { + newRes := strings.Split(resultKey[i], "]") + key = append(key, newRes[0]) + } + } + + /* Form the error message. */ + msg = "[" + for _, elem := range key { + msg = msg + elem + " " + } + msg = msg + "]" + + /* For non-constraint related errors , print below error message. */ + if (len(result) > 1) { + errMessage = errtableName + " with keys" + msg + " has field " + + ElemName + " with invalid value " + ElemVal + }else { + /* Dependent data validation error. */ + errMessage = "Dependent data validation failed for table " + + errtableName + " with keys" + msg + } + + + if (C.ly_errno == C.LY_EVALID) { //Validation failure + ypErrCode = translateLYErrToYParserErr(int(ypErrFirst.prev.vecode)) + + } else { + switch (C.ly_errno) { + case C.LY_EMEM: + errText = "Memory allocation failure" + + case C.LY_ESYS: + errText = "System call failure" + + case C.LY_EINVAL: + errText = "Invalid value" + + case C.LY_EINT: + errText = "Internal error" + + case C.LY_EPLUGIN: + errText = "Error reported by a plugin" + } + } + + errObj := YParserError { + TableName : errtableName, + ErrCode : ypErrCode, + Keys : key, + Value : ElemVal, + Field : ElemName, + Msg : errMessage, + ErrTxt: errText, + ErrAppTag: errAppTag, + } + + TRACE_LOG(INFO_API, TRACE_YPARSER, "YParser error details: %v...", errObj) + + return errObj +} + +func FindNode(root *YParserNode, xpath string) *YParserNode { + return (*YParserNode)(C.lyd_find_node((*C.struct_lyd_node)(root), C.CString(xpath))) +} diff --git a/src/cvl/jsondata_test.go b/src/cvl/jsondata_test.go new file mode 100644 index 0000000000..87fe059e27 --- /dev/null +++ b/src/cvl/jsondata_test.go @@ -0,0 +1,70 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package cvl_test + +var json_edit_config_create_acl_table_dependent_data = []string{`{ + "stage": "INGRESS", + "type": "L3" + }`} + +var json_edit_config_create_acl_rule_config_data = []string{ + `{ + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000" + + + }`} + +var json_validate_config_data = []string{`{ + "INTERFACE": { + "Ethernet8|10.0.0.0/31": {}, + "Ethernet12|10.0.0.2/31": {}, + "Ethernet16|10.0.0.4/31": {} + } + }`, + `{ + "DEVICE_METADATA": { + "localhost": { + "hwsku": "Force10-S6100", + "default_bgp_status": "up", + "docker_routing_config_mode": "unified", + "hostname": "sonic-s6100-01", + "platform": "x86_64-dell_s6100_c2538-r0", + "mac": "4c:76:25:f4:70:82", + "default_pfcwd_status": "disable", + "deployment_id": "1", + "type": "ToRRouter" + } + } + }`, + `{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet8": "5m", + "Ethernet12": "5m", + "Ethernet16": "5m", + } + } + }`} diff --git a/src/cvl/schema/Makefile b/src/cvl/schema/Makefile new file mode 100644 index 0000000000..e1132130a2 --- /dev/null +++ b/src/cvl/schema/Makefile @@ -0,0 +1,66 @@ +################################################################################ +# # +# Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or # +# its subsidiaries. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# # +################################################################################ + +TOPDIR=../../.. +YANGDIR=$(TOPDIR)/models/yang +sonic_yang=$(YANGDIR)/sonic +std_yang_common=$(YANGDIR)/common/ +sonic_yang_common=$(sonic_yang)/common +pyang_plugin_dir=$(TOPDIR)/tools/pyang/pyang_plugins + +src_files=$(wildcard $(sonic_yang)/*.yang) +src_files += $(wildcard $(sonic_yang_common)/*.yang) +out=$(patsubst %.yang, %.yin, $(shell ls -1 $(sonic_yang)/*.yang | cut -d'/' -f7)) +out_common=$(patsubst %.yang, %.yin, $(shell ls -1 $(sonic_yang_common)/*.yang | cut -d'/' -f8)) +out_tree=$(patsubst %.yang, %.tree, $(src_files)) +search_path=$(std_yang_common):$(sonic_yang):$(sonic_yang_common) + +all: schema + +schema: $(out) $(out_common) + + +schema-tree: $(out_tree) + +#Build YANG models +%.yin:$(sonic_yang)/%.yang + @echo "Generating `basename $@` ..." + @devFile="`echo $@ | cut -d . -f1`-deviation.yang"; \ + if [ -f $$devFile ] ; then devOpt="--deviation-module $$devFile"; fi; \ + pyang -p $(search_path) --plugindir $(pyang_plugin_dir) \ + -f yin-cvl $$devOpt $< -o `basename $@` + + +#Build common YANG models +%.yin:$(sonic_yang_common)/%.yang + @echo "Generating `basename $@` ..." + @devFile="`echo $@ | cut -d . -f1`-deviation.yang"; \ + if [ -f $$devFile ] ; then devOpt="--deviation-module $$devFile"; fi; \ + pyang -p $(search_path) --plugindir $(pyang_plugin_dir) \ + -f yin-cvl $$devOpt $< -o `basename $@` + +%.tree:%.yang + @echo "Generating `basename $@` ..." + @devFile="`echo $< | cut -d . -f1`-dev.yang"; \ + if [ -f $$devFile ] ; then devOpt="--deviation-module $$devFile"; fi; \ + pyang -p $(search_path) -f tree $$devOpt $< -o `basename $@` + +clean: + @echo "Removing files ..." + rm -rf *.yin *.tree diff --git a/src/cvl/testdata/acl_rule.json b/src/cvl/testdata/acl_rule.json new file mode 100644 index 0000000000..46c5a3745a --- /dev/null +++ b/src/cvl/testdata/acl_rule.json @@ -0,0 +1,10 @@ +{ +"ACL_RULE": { + "TestACL13|Rule1": { + "PRIORITY": "55", + "PACKET_ACTION": "DROP", + "IP_TYPE" : "IPV4", + "L4_SRC_PORT": "0" + } + } +} diff --git a/src/cvl/testdata/aclrule.json b/src/cvl/testdata/aclrule.json new file mode 100644 index 0000000000..41a768225a --- /dev/null +++ b/src/cvl/testdata/aclrule.json @@ -0,0 +1,9 @@ +{ + "PACKET_ACTION": "FORWARD", + "SRC_IP": "10.1.1.1/32", + "IP_TYPE" : "IPV4", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000" +} diff --git a/src/cvl/testdata/acltable.json b/src/cvl/testdata/acltable.json new file mode 100644 index 0000000000..810caee0db --- /dev/null +++ b/src/cvl/testdata/acltable.json @@ -0,0 +1,4 @@ +{ +"stage": "INGRESS", +"type": "L3" +} diff --git a/src/cvl/testdata/config_db.json b/src/cvl/testdata/config_db.json new file mode 100644 index 0000000000..ad2d952f28 --- /dev/null +++ b/src/cvl/testdata/config_db.json @@ -0,0 +1,107 @@ +{ + "VLAN": { + "Vlan100": { + "members": [ + "Ethernet44", + "Ethernet64" + ], + "vlanid": "100" + }, + "Vlan1200": { + "members": [ + "Ethernet64", + "Ethernet8" + ], + "vlanid": "1200" + }, + "Vlan2500": { + "members": [ + "Ethernet8", + "Ethernet64" + ], + "vlanid": "2500" + } + }, + "VLAN_MEMBER": { + "Vlan100|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan100|Ethernet44": { + "tagging_mode": "tagged" + }, + "Vlan1200|Ethernet8": { + "tagging_mode": "tagged" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS": { + "red_max_threshold": "312000", + "wred_green_enable": "true", + "ecn": "ecn_all", + "green_min_threshold": "104000", + "red_min_threshold": "104000", + "wred_yellow_enable": "true", + "yellow_min_threshold": "104000", + "wred_red_enable": "true", + "yellow_max_threshold": "312000", + "green_max_threshold": "312000" + } + }, + "BUFFER_POOL": { + "egress_lossless_pool": { + "type": "egress", + "mode": "static", + "size": "12766208" + }, + "egress_lossy_pool": { + "type": "egress", + "mode": "dynamic", + "size": "8072396" + }, + "ingress_lossless_pool": { + "type": "ingress", + "mode": "dynamic", + "size": "12766208" + } + }, + "MIRROR_SESSION": { + "everflow0": { + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type": "DWRR", + "weight": "25" + }, + "scheduler.1": { + "type": "DWRR", + "weight": "30" + }, + "scheduler.2": { + "type": "DWRR", + "weight": "20" + } + }, + "QUEUE": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { + "scheduler": "[SCHEDULER|scheduler.1]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { + "scheduler": "[SCHEDULER|scheduler.2]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "wred_profile": "[WRED_PROFILE|AZURE_LOSSLESS]", + "scheduler": "[SCHEDULER|scheduler.0]" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "1": "1", + "0": "0", + "3": "3", + "4": "4" + } + } +} diff --git a/src/cvl/testdata/config_db1.json b/src/cvl/testdata/config_db1.json new file mode 100644 index 0000000000..ec6ce5e734 --- /dev/null +++ b/src/cvl/testdata/config_db1.json @@ -0,0 +1,133 @@ +{ + "PORT": { + "Ethernet0": { + "alias": "fortyGigE0/0", + "lanes": "29,30,31,32" + }, + "Ethernet4": { + "alias": "fortyGigE0/4", + "lanes": "25,26,27,28" + }, + "Ethernet8": { + "alias": "fortyGigE0/8", + "lanes": "37,38,39,40" + }, + "Ethernet12": { + "alias": "fortyGigE0/12", + "lanes": "33,34,35,36" + }, + "Ethernet16": { + "alias": "fortyGigE0/16", + "lanes": "41,42,43,44" + }, + "Ethernet20": { + "alias": "fortyGigE0/20", + "lanes": "45,46,47,48" + }, + "Ethernet24": { + "alias": "fortyGigE0/24", + "lanes": "5,6,7,8" + }, + "Ethernet28": { + "alias": "fortyGigE0/28", + "lanes": "1,2,3,4" + }, + "Ethernet32": { + "alias": "fortyGigE0/32", + "lanes": "9,10,11,12" + }, + "Ethernet36": { + "alias": "fortyGigE0/36", + "lanes": "13,14,15,16" + }, + "Ethernet40": { + "alias": "fortyGigE0/40", + "lanes": "21,22,23,24" + }, + "Ethernet44": { + "alias": "fortyGigE0/44", + "lanes": "17,18,19,20" + }, + "Ethernet48": { + "alias": "fortyGigE0/48", + "lanes": "49,50,51,52" + }, + "Ethernet52": { + "alias": "fortyGigE0/52", + "lanes": "53,54,55,56" + }, + "Ethernet56": { + "alias": "fortyGigE0/56", + "lanes": "61,62,63,64" + }, + "Ethernet60": { + "alias": "fortyGigE0/60", + "lanes": "57,58,59,60" + }, + "Ethernet64": { + "alias": "fortyGigE0/64", + "lanes": "65,66,67,68" + }, + "Ethernet68": { + "alias": "fortyGigE0/68", + "lanes": "69,70,71,72" + }, + "Ethernet72": { + "alias": "fortyGigE0/72", + "lanes": "77,78,79,80" + }, + "Ethernet76": { + "alias": "fortyGigE0/76", + "lanes": "73,74,75,76" + }, + "Ethernet80": { + "alias": "fortyGigE0/80", + "lanes": "105,106,107,108" + }, + "Ethernet84": { + "alias": "fortyGigE0/84", + "lanes": "109,110,111,112" + }, + "Ethernet88": { + "alias": "fortyGigE0/88", + "lanes": "117,118,119,120" + }, + "Ethernet92": { + "alias": "fortyGigE0/92", + "lanes": "113,114,115,116" + }, + "Ethernet96": { + "alias": "fortyGigE0/96", + "lanes": "121,122,123,124" + }, + "Ethernet100": { + "alias": "fortyGigE0/100", + "lanes": "125,126,127,128" + }, + "Ethernet104": { + "alias": "fortyGigE0/104", + "lanes": "85,86,87,88" + }, + "Ethernet108": { + "alias": "fortyGigE0/108", + "lanes": "81,82,83,84" + }, + "Ethernet112": { + "alias": "fortyGigE0/112", + "lanes": "89,90,91,92" + }, + "Ethernet116": { + "alias": "fortyGigE0/116", + "lanes": "93,94,95,96" + }, + "Ethernet120": { + "alias": "fortyGigE0/120", + "lanes": "97,98,99,100" + }, + "Ethernet124": { + "alias": "fortyGigE0/124", + "lanes": "101,102,103,104" + } + } +} + diff --git a/src/cvl/testdata/config_db2.json b/src/cvl/testdata/config_db2.json new file mode 100644 index 0000000000..e6be83ac4e --- /dev/null +++ b/src/cvl/testdata/config_db2.json @@ -0,0 +1,3437 @@ +{ + "VLAN_MEMBER": { + "Vlan51|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan51|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan97|Ethernet4": { + "tagging_mode": "untagged" + }, + "Vlan99|Ethernet4": { + "tagging_mode": "untagged" + }, + "Vlan99|Ethernet108": { + "tagging_mode": "untagged" + }, + "Vlan99|Ethernet124": { + "tagging_mode": "untagged" + }, + "Vlan101|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan101|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan101|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan102|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan102|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan102|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan103|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan103|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan103|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan104|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan104|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan104|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan105|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan105|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan105|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan106|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan106|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan106|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan107|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan107|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan107|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan108|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan108|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan108|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan109|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan109|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan109|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan110|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan110|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan110|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan111|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan111|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan111|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan112|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan112|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan112|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan113|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan113|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan113|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan114|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan114|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan114|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan115|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan115|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan115|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan116|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan116|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan116|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan117|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan117|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan117|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan118|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan118|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan118|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan119|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan119|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan119|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan120|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan120|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan120|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan121|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan121|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan121|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan122|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan122|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan122|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan123|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan123|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan123|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan124|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan124|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan124|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan125|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan125|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan125|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan126|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan126|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan126|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan127|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan127|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan127|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan128|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan128|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan128|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan129|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan129|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan129|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan130|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan130|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan130|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan131|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan131|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan131|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan132|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan132|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan132|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan133|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan133|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan133|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan134|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan134|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan134|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan135|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan135|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan135|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan136|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan136|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan136|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan137|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan137|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan137|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan138|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan138|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan138|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan139|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan139|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan139|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan140|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan140|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan140|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan141|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan141|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan141|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan142|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan142|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan142|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan143|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan143|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan143|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan144|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan144|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan144|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan145|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan145|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan145|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan146|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan146|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan146|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan147|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan147|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan147|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan148|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan148|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan148|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan149|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan149|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan149|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan150|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan150|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan150|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan151|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan151|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan151|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan152|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan152|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan152|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan153|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan153|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan153|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan154|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan154|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan154|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan155|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan155|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan155|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan156|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan156|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan156|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan157|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan157|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan157|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan158|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan158|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan158|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan159|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan159|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan159|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan160|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan160|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan160|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan161|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan161|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan161|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan162|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan162|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan162|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan163|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan163|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan163|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan164|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan164|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan164|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan165|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan165|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan165|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan166|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan166|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan166|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan167|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan167|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan167|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan168|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan168|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan168|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan169|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan169|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan169|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan170|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan170|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan170|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan171|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan171|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan171|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan172|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan172|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan172|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan173|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan173|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan173|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan174|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan174|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan174|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan175|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan175|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan175|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan176|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan176|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan176|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan177|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan177|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan177|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan178|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan178|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan178|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan179|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan179|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan179|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan180|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan180|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan180|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan181|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan181|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan181|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan182|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan182|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan182|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan183|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan183|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan183|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan184|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan184|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan184|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan185|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan185|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan185|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan186|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan186|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan186|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan187|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan187|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan187|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan188|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan188|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan188|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan189|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan189|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan189|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan190|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan190|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan190|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan191|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan191|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan191|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan192|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan192|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan192|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan193|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan193|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan193|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan194|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan194|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan194|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan195|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan195|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan195|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan196|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan196|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan196|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan197|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan197|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan197|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan198|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan198|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan198|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan199|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan200|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan200|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan200|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan201|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan201|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan201|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan202|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan202|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan202|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan203|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan203|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan203|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan204|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan204|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan204|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan205|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan205|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan205|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan206|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan206|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan206|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan207|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan207|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan207|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan208|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan208|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan208|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan209|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan209|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan209|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan210|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan210|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan210|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan211|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan211|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan211|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan212|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan212|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan212|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan213|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan213|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan213|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan214|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan214|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan214|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan215|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan215|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan215|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan216|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan216|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan216|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan217|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan217|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan217|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan218|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan218|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan218|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan219|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan219|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan219|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan220|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan220|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan220|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan221|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan221|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan221|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan222|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan222|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan222|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan223|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan223|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan223|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan224|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan224|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan224|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan225|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan225|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan225|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan226|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan226|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan226|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan227|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan227|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan227|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan228|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan228|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan228|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan229|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan229|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan229|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan230|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan230|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan230|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan231|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan231|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan231|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan232|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan232|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan232|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan233|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan233|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan233|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan234|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan234|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan234|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan235|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan235|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan235|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan236|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan236|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan236|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan237|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan237|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan237|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan238|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan238|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan238|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan239|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan239|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan239|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan240|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan240|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan240|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan241|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan241|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan241|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan242|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan242|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan242|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan243|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan243|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan243|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan244|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan244|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan244|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan245|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan245|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan245|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan246|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan246|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan246|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan247|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan247|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan247|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan248|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan248|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan248|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan249|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan249|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan249|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan250|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan250|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan250|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan251|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan251|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan251|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan252|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan252|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan252|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan253|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan253|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan253|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan254|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan254|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan254|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan255|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan255|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan255|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan256|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan256|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan256|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan257|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan257|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan257|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan258|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan258|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan258|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan259|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan259|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan259|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan260|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan260|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan260|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan261|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan261|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan261|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan262|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan262|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan262|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan263|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan263|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan263|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan264|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan264|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan264|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan265|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan265|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan265|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan266|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan266|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan266|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan267|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan267|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan267|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan268|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan268|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan268|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan269|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan269|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan269|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan270|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan270|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan270|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan271|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan271|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan271|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan272|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan272|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan272|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan273|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan273|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan273|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan274|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan274|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan274|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan275|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan275|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan275|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan276|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan276|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan276|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan277|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan277|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan277|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan278|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan278|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan278|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan279|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan279|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan279|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan280|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan280|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan280|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan281|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan281|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan281|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan282|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan282|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan282|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan283|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan283|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan283|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan284|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan284|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan284|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan285|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan285|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan285|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan286|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan286|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan286|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan287|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan287|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan287|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan288|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan288|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan288|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan289|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan289|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan289|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan290|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan290|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan290|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan291|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan291|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan291|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan292|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan292|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan292|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan293|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan293|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan293|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan294|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan294|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan294|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan295|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan295|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan295|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan296|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan296|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan296|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan297|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan297|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan297|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan298|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan298|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan298|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan299|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan299|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan299|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan300|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan300|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan300|Ethernet4": { + "tagging_mode": "tagged" + } + }, + "VLAN": { + "Vlan51": { + "members": [ + "Ethernet108", + "Ethernet124" + ], + "vlanid": "51" + }, + "Vlan97": { + "members": [ + "Ethernet4" + ], + "vlanid": "97" + }, + "Vlan99": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "99" + }, + "Vlan101": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "101" + }, + "Vlan102": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "102" + }, + "Vlan103": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "103" + }, + "Vlan104": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "104" + }, + "Vlan105": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "105" + }, + "Vlan106": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "106" + }, + "Vlan107": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "107" + }, + "Vlan108": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "108" + }, + "Vlan109": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "109" + }, + "Vlan110": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "110" + }, + "Vlan111": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "111" + }, + "Vlan112": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "112" + }, + "Vlan113": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "113" + }, + "Vlan114": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "114" + }, + "Vlan115": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "115" + }, + "Vlan116": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "116" + }, + "Vlan117": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "117" + }, + "Vlan118": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "118" + }, + "Vlan119": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "119" + }, + "Vlan120": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "120" + }, + "Vlan121": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "121" + }, + "Vlan122": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "122" + }, + "Vlan123": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "123" + }, + "Vlan124": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "124" + }, + "Vlan125": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "125" + }, + "Vlan126": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "126" + }, + "Vlan127": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "127" + }, + "Vlan128": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "128" + }, + "Vlan129": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "129" + }, + "Vlan130": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "130" + }, + "Vlan131": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "131" + }, + "Vlan132": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "132" + }, + "Vlan133": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "133" + }, + "Vlan134": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "134" + }, + "Vlan135": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "135" + }, + "Vlan136": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "136" + }, + "Vlan137": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "137" + }, + "Vlan138": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "138" + }, + "Vlan139": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "139" + }, + "Vlan140": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "140" + }, + "Vlan141": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "141" + }, + "Vlan142": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "142" + }, + "Vlan143": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "143" + }, + "Vlan144": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "144" + }, + "Vlan145": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "145" + }, + "Vlan146": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "146" + }, + "Vlan147": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "147" + }, + "Vlan148": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "148" + }, + "Vlan149": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "149" + }, + "Vlan150": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "150" + }, + "Vlan151": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "151" + }, + "Vlan152": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "152" + }, + "Vlan153": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "153" + }, + "Vlan154": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "154" + }, + "Vlan155": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "155" + }, + "Vlan156": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "156" + }, + "Vlan157": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "157" + }, + "Vlan158": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "158" + }, + "Vlan159": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "159" + }, + "Vlan160": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "160" + }, + "Vlan161": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "161" + }, + "Vlan162": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "162" + }, + "Vlan163": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "163" + }, + "Vlan164": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "164" + }, + "Vlan165": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "165" + }, + "Vlan166": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "166" + }, + "Vlan167": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "167" + }, + "Vlan168": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "168" + }, + "Vlan169": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "169" + }, + "Vlan170": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "170" + }, + "Vlan171": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "171" + }, + "Vlan172": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "172" + }, + "Vlan173": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "173" + }, + "Vlan174": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "174" + }, + "Vlan175": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "175" + }, + "Vlan176": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "176" + }, + "Vlan177": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "177" + }, + "Vlan178": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "178" + }, + "Vlan179": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "179" + }, + "Vlan180": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "180" + }, + "Vlan181": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "181" + }, + "Vlan182": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "182" + }, + "Vlan183": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "183" + }, + "Vlan184": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "184" + }, + "Vlan185": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "185" + }, + "Vlan186": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "186" + }, + "Vlan187": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "187" + }, + "Vlan188": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "188" + }, + "Vlan189": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "189" + }, + "Vlan190": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "190" + }, + "Vlan191": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "191" + }, + "Vlan192": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "192" + }, + "Vlan193": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "193" + }, + "Vlan194": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "194" + }, + "Vlan195": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "195" + }, + "Vlan196": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "196" + }, + "Vlan197": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "197" + }, + "Vlan198": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "198" + }, + "Vlan199": { + "members": [ + "Ethernet64" + ], + "vlanid": "199" + }, + "Vlan200": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "200" + }, + "Vlan201": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "201" + }, + "Vlan202": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "202" + }, + "Vlan203": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "203" + }, + "Vlan204": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "204" + }, + "Vlan205": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "205" + }, + "Vlan206": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "206" + }, + "Vlan207": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "207" + }, + "Vlan208": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "208" + }, + "Vlan209": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "209" + }, + "Vlan210": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "210" + }, + "Vlan211": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "211" + }, + "Vlan212": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "212" + }, + "Vlan213": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "213" + }, + "Vlan214": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "214" + }, + "Vlan215": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "215" + }, + "Vlan216": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "216" + }, + "Vlan217": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "217" + }, + "Vlan218": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "218" + }, + "Vlan219": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "219" + }, + "Vlan220": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "220" + }, + "Vlan221": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "221" + }, + "Vlan222": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "222" + }, + "Vlan223": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "223" + }, + "Vlan224": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "224" + }, + "Vlan225": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "225" + }, + "Vlan226": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "226" + }, + "Vlan227": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "227" + }, + "Vlan228": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "228" + }, + "Vlan229": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "229" + }, + "Vlan230": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "230" + }, + "Vlan231": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "231" + }, + "Vlan232": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "232" + }, + "Vlan233": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "233" + }, + "Vlan234": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "234" + }, + "Vlan235": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "235" + }, + "Vlan236": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "236" + }, + "Vlan237": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "237" + }, + "Vlan238": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "238" + }, + "Vlan239": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "239" + }, + "Vlan240": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "240" + }, + "Vlan241": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "241" + }, + "Vlan242": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "242" + }, + "Vlan243": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "243" + }, + "Vlan244": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "244" + }, + "Vlan245": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "245" + }, + "Vlan246": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "246" + }, + "Vlan247": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "247" + }, + "Vlan248": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "248" + }, + "Vlan249": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "249" + }, + "Vlan250": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "250" + }, + "Vlan251": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "251" + }, + "Vlan252": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "252" + }, + "Vlan253": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "253" + }, + "Vlan254": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "254" + }, + "Vlan255": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "255" + }, + "Vlan256": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "256" + }, + "Vlan257": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "257" + }, + "Vlan258": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "258" + }, + "Vlan259": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "259" + }, + "Vlan260": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "260" + }, + "Vlan261": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "261" + }, + "Vlan262": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "262" + }, + "Vlan263": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "263" + }, + "Vlan264": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "264" + }, + "Vlan265": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "265" + }, + "Vlan266": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "266" + }, + "Vlan267": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "267" + }, + "Vlan268": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "268" + }, + "Vlan269": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "269" + }, + "Vlan270": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "270" + }, + "Vlan271": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "271" + }, + "Vlan272": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "272" + }, + "Vlan273": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "273" + }, + "Vlan274": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "274" + }, + "Vlan275": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "275" + }, + "Vlan276": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "276" + }, + "Vlan277": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "277" + }, + "Vlan278": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "278" + }, + "Vlan279": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "279" + }, + "Vlan280": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "280" + }, + "Vlan281": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "281" + }, + "Vlan282": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "282" + }, + "Vlan283": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "283" + }, + "Vlan284": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "284" + }, + "Vlan285": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "285" + }, + "Vlan286": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "286" + }, + "Vlan287": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "287" + }, + "Vlan288": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "288" + }, + "Vlan289": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "289" + }, + "Vlan290": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "290" + }, + "Vlan291": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "291" + }, + "Vlan292": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "292" + }, + "Vlan293": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "293" + }, + "Vlan294": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "294" + }, + "Vlan295": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "295" + }, + "Vlan296": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "296" + }, + "Vlan297": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "297" + }, + "Vlan298": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "298" + }, + "Vlan299": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "299" + }, + "Vlan300": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "300" + } + } +} diff --git a/src/cvl/testdata/create_acl_table.json b/src/cvl/testdata/create_acl_table.json new file mode 100644 index 0000000000..604be2e2d2 --- /dev/null +++ b/src/cvl/testdata/create_acl_table.json @@ -0,0 +1,8 @@ +{ +"ACL_TABLE": { + "TestACL1": { + "stage": "INGRESS", + "type": "L3" + } + } +} diff --git a/src/cvl/testdata/create_acl_table12.json b/src/cvl/testdata/create_acl_table12.json new file mode 100644 index 0000000000..83f74d6f18 --- /dev/null +++ b/src/cvl/testdata/create_acl_table12.json @@ -0,0 +1,8 @@ +{ +"ACL_TABLE": { + "TestACL13": { + "stage": "INGRESS", + "type": "L3" + } + } +} diff --git a/src/cvl/testdata/create_acl_table13.json b/src/cvl/testdata/create_acl_table13.json new file mode 100644 index 0000000000..83f74d6f18 --- /dev/null +++ b/src/cvl/testdata/create_acl_table13.json @@ -0,0 +1,8 @@ +{ +"ACL_TABLE": { + "TestACL13": { + "stage": "INGRESS", + "type": "L3" + } + } +} diff --git a/src/cvl/testdata/port_table.json b/src/cvl/testdata/port_table.json new file mode 100644 index 0000000000..266731a6ed --- /dev/null +++ b/src/cvl/testdata/port_table.json @@ -0,0 +1,165 @@ +{ + "PORT": { + "Ethernet0": { + "alias": "fortyGigE0/0", + "lanes": "29,30,31,32", + "index": "0" + }, + "Ethernet4": { + "alias": "fortyGigE0/4", + "lanes": "25,26,27,28", + "index": "1" + }, + "Ethernet8": { + "alias": "fortyGigE0/8", + "lanes": "37,38,39,40", + "index": "2" + }, + "Ethernet12": { + "alias": "fortyGigE0/12", + "lanes": "33,34,35,36", + "index": "3" + }, + "Ethernet16": { + "alias": "fortyGigE0/16", + "lanes": "41,42,43,44", + "index": "4" + }, + "Ethernet20": { + "alias": "fortyGigE0/20", + "lanes": "45,46,47,48", + "index": "5" + }, + "Ethernet24": { + "alias": "fortyGigE0/24", + "lanes": "5,6,7,8", + "index": "6" + }, + "Ethernet28": { + "alias": "fortyGigE0/28", + "lanes": "1,2,3,4", + "index": "7" + }, + "Ethernet32": { + "alias": "fortyGigE0/32", + "lanes": "9,10,11,12", + "index": "8" + }, + "Ethernet36": { + "alias": "fortyGigE0/36", + "lanes": "13,14,15,16", + "index": "9" + }, + "Ethernet40": { + "alias": "fortyGigE0/40", + "lanes": "21,22,23,24", + "index": "10" + }, + "Ethernet44": { + "alias": "fortyGigE0/44", + "lanes": "17,18,19,20", + "index": "11" + }, + "Ethernet48": { + "alias": "fortyGigE0/48", + "lanes": "49,50,51,52", + "index": "12" + }, + "Ethernet52": { + "alias": "fortyGigE0/52", + "lanes": "53,54,55,56", + "index": "13" + }, + "Ethernet56": { + "alias": "fortyGigE0/56", + "lanes": "61,62,63,64", + "index": "14" + }, + "Ethernet60": { + "alias": "fortyGigE0/60", + "lanes": "57,58,59,60", + "index": "15" + }, + "Ethernet64": { + "alias": "fortyGigE0/64", + "lanes": "65,66,67,68", + "index": "16" + }, + "Ethernet68": { + "alias": "fortyGigE0/68", + "lanes": "69,70,71,72", + "index": "17" + }, + "Ethernet72": { + "alias": "fortyGigE0/72", + "lanes": "77,78,79,80", + "index": "18" + }, + "Ethernet76": { + "alias": "fortyGigE0/76", + "lanes": "73,74,75,76", + "index": "19" + }, + "Ethernet80": { + "alias": "fortyGigE0/80", + "lanes": "105,106,107,108", + "index": "20" + }, + "Ethernet84": { + "alias": "fortyGigE0/84", + "lanes": "109,110,111,112", + "index": "21" + }, + "Ethernet88": { + "alias": "fortyGigE0/88", + "lanes": "117,118,119,120", + "index": "22" + }, + "Ethernet92": { + "alias": "fortyGigE0/92", + "lanes": "113,114,115,116", + "index": "23" + }, + "Ethernet96": { + "alias": "fortyGigE0/96", + "lanes": "121,122,123,124", + "index": "24" + }, + "Ethernet100": { + "alias": "fortyGigE0/100", + "lanes": "125,126,127,128", + "index": "25" + }, + "Ethernet104": { + "alias": "fortyGigE0/104", + "lanes": "85,86,87,88", + "index": "26" + }, + "Ethernet108": { + "alias": "fortyGigE0/108", + "lanes": "81,82,83,84", + "index": "27" + }, + "Ethernet112": { + "alias": "fortyGigE0/112", + "lanes": "89,90,91,92", + "index": "28" + }, + "Ethernet116": { + "alias": "fortyGigE0/116", + "lanes": "93,94,95,96", + "index": "29" + }, + "Ethernet120": { + "alias": "fortyGigE0/120", + "lanes": "97,98,99,100", + "index": "30" + }, + "Ethernet124": { + "alias": "fortyGigE0/124", + "lanes": "101,102,103,104", + "index": "31" + } + } +} + diff --git a/src/cvl/testdata/schema/Makefile b/src/cvl/testdata/schema/Makefile new file mode 100644 index 0000000000..7f69d689d1 --- /dev/null +++ b/src/cvl/testdata/schema/Makefile @@ -0,0 +1,53 @@ +################################################################################ +# # +# Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or # +# its subsidiaries. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# # +################################################################################ + +TOPDIR=../../../.. +YANGDIR=$(TOPDIR)/models/yang +sonic_yang=$(YANGDIR)/sonic +std_yang_common=$(YANGDIR)/common/ +sonic_yang_common=$(sonic_yang)/common +pyang_plugin_dir=$(TOPDIR)/tools/pyang/pyang_plugins +src_files=$(wildcard *.yang) +out=$(patsubst %.yang, %.yin, $(src_files)) +out_ext=$(patsubst %.yang, %.tree, $(src_files)) +search_path=$(std_yang_common):$(sonic_yang):$(sonic_yang_common) + +all:schema + +schema: $(out) + +schema-tree: $(out_ext) + +%.yin:%.yang + @echo "Generating `basename $@` ..." + @devFile="`echo $< | cut -d . -f1`-dev.yang"; \ + if [ -f $$devFile ] ; then devOpt="--deviation-module $$devFile"; fi; \ + pyang -p $(search_path) \ + --plugindir $(pyang_plugin_dir) -f yin-cvl $$devOpt $< -o `basename $@` + +%.tree:%.yang + @echo "Generating `basename $@` ..." + @devFile="`echo $< | cut -d . -f1`-dev.yang"; \ + if [ -f $$devFile ] ; then devOpt="--deviation-module $$devFile"; fi; \ + pyang -p $(search_path) \ + -f tree $$devOpt $< -o `basename $@` + +clean: + @echo "Removing files ..." + rm -rf *.yin *.tree diff --git a/src/cvl/testdata/schema/sonic-acl-deviation.yang b/src/cvl/testdata/schema/sonic-acl-deviation.yang new file mode 100644 index 0000000000..c1d701c29d --- /dev/null +++ b/src/cvl/testdata/schema/sonic-acl-deviation.yang @@ -0,0 +1,43 @@ +module sonic-acl-deviation { + namespace "http://github.com/Azure/sonic-acl-deviation"; + prefix acld; + yang-version 1.1; + + import sonic-acl { + prefix sacl; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC ACL Deviations"; + + revision 2019-05-15 { + description + "Initial revision."; + } +/* + deviation /sacl:sonic-acl/sacl:ACL_TABLE/sacl:type { + deviate replace { + type enumeration { + enum MIRROR; + enum L2; + enum L3; + } + } + } + + deviation /sacl:sonic-acl/sacl:ACL_RULE/sacl:PACKET_ACTION { + deviate replace { + type enumeration { + enum FORWARD; + enum DROP; + } + } + } + */ +} diff --git a/src/cvl/testdata/schema/sonic-bgp-neighbor.yang b/src/cvl/testdata/schema/sonic-bgp-neighbor.yang new file mode 100644 index 0000000000..14504d6f9b --- /dev/null +++ b/src/cvl/testdata/schema/sonic-bgp-neighbor.yang @@ -0,0 +1,84 @@ +module sonic-bgp-neighbor { + namespace "http://github.com/Azure/sonic-bgp-neighbor"; + prefix sbn; + + import ietf-inet-types { + prefix inet; + } + + import sonic-common { + prefix scommon; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC BGP NEIGHBOR"; + + revision 2019-07-02 { + description + "Initial revision."; + } + + container sonic-bgp-neighbor { + + container BGP_NEIGHBOR { + + list BGP_NEIGHBOR_LIST { + key "ipaddress"; + + leaf ipaddress{ + type inet:ip-address; + } + + leaf rrclient { + type uint8 { + range "0..255"; + } + } + + leaf admin_status{ + type scommon:admin-status; + } + + leaf peer_addr{ + type inet:ip-address; + } + + leaf name { + type string; + } + + leaf local_addr { + type inet:ipv4-address; + } + + leaf nhopself { + type uint8 { + range "0..255"; + } + } + + leaf holdtime { + type uint8 { + range "0..255"; + } + } + + leaf asn { + type uint64; + } + + leaf keepalive { + type uint8 { + range "0..255"; + } + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-buffer-pg.yang b/src/cvl/testdata/schema/sonic-buffer-pg.yang new file mode 100644 index 0000000000..27918081e8 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-buffer-pg.yang @@ -0,0 +1,66 @@ +module sonic-buffer-pg { + namespace "http://github.com/Azure/sonic-buffer-pg"; + prefix bpg; + + import sonic-extension { + prefix sonic-ext; + } + + import sonic-port { + prefix prt; + } + + import sonic-buffer-profile { + prefix bpf; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC BUFFER PG"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + + container sonic-buffer-pg { + + container BUFFER_PG { + + list BUFFER_PG_LIST { + key "ifname pg_num"; + sonic-ext:key-pattern "BUFFER_PG|({ifname},)*|{pg_num}"; //special pattern used for extracting keys from + //redis-key and fill populate the yang instance + // Total list instance = number(key1) * number(key2) * number(key3) + + leaf ifname { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + } + + leaf pg_num { + type string { + pattern "[0-7]((-)[0-7])?" { + error-message "Invalid Buffer PG number"; + error-app-tag pg-num-invalid; + } + } + } + + leaf profile { //Hash reference key + type leafref { + path "/bpf:sonic-buffer-profile/bpf:BUFFER_PROFILE/bpf:BUFFER_PROFILE_LIST/bpf:name"; + } + } + + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-buffer-pool.yang b/src/cvl/testdata/schema/sonic-buffer-pool.yang new file mode 100644 index 0000000000..5f935b3f94 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-buffer-pool.yang @@ -0,0 +1,51 @@ +module sonic-buffer-pool { + namespace "http://github.com/Azure/sonic-buffer-pool"; + prefix bpl; + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC BUFFER POOL"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-buffer-pool { + + container BUFFER_POOL { + + list BUFFER_POOL_LIST { + key "name"; + + leaf name { + type string; + } + + leaf type { + type enumeration { + enum ingress; + enum egress; + } + } + + leaf mode { + type enumeration { + enum static; + enum dynamic; + } + } + + leaf size { + type uint64; + } + + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-buffer-profile.yang b/src/cvl/testdata/schema/sonic-buffer-profile.yang new file mode 100644 index 0000000000..71f077654d --- /dev/null +++ b/src/cvl/testdata/schema/sonic-buffer-profile.yang @@ -0,0 +1,67 @@ +module sonic-buffer-profile { + namespace "http://github.com/Azure/sonic-buffer-profile"; + prefix bpf; + + import sonic-buffer-pool { + prefix bpl; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC BUFFER PROFILE"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + + container sonic-buffer-profile { + + container BUFFER_PROFILE { + + list BUFFER_PROFILE_LIST { + key "name"; + + leaf name { + type string; + } + + leaf static_th { + type uint64; + } + + leaf dynamic_th { + type int64; + } + + leaf size { + type uint64; + } + + leaf pool { + type leafref { + path "/bpl:sonic-buffer-pool/bpl:BUFFER_POOL/bpl:BUFFER_POOL_LIST/bpl:name"; + } + } + + leaf xon_offset { + type uint64; + } + + leaf xon { + type uint64; + } + + leaf xoff { + type uint64; + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-cablelength.yang b/src/cvl/testdata/schema/sonic-cablelength.yang new file mode 100644 index 0000000000..af4746211b --- /dev/null +++ b/src/cvl/testdata/schema/sonic-cablelength.yang @@ -0,0 +1,60 @@ +module sonic-cablelength { + namespace "http://github.com/Azure/sonic-cablelength"; + prefix scl; + + import sonic-extension { + prefix sonic-ext; + } + + import sonic-port { + prefix prt; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC CABLELENGTH"; + + revision 2019-07-02 { + description + "Initial revision."; + } + + container sonic-cablelength { + + container CABLE_LENGTH { + + list CABLE_LENGTH_LIST { + key "name"; + sonic-ext:map-list true; //special conversion for map tables + sonic-ext:map-leaf "port length"; //every key:value pair is mapped to list keys, e.g. "1":"7" ==> tc_num=1, dscp=7 + + leaf name { + type string; + } + + list CABLE_LENGTH { //this is list inside list for storing mapping between two fields + key "port length"; + + leaf port { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + + } + + leaf length { + type string { + pattern "[0-9]?[0-9]m"; + } + } + } + + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-device-metadata.yang b/src/cvl/testdata/schema/sonic-device-metadata.yang new file mode 100644 index 0000000000..014f88cd47 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-device-metadata.yang @@ -0,0 +1,97 @@ +module sonic-device-metadata { + namespace "http://github.com/Azure/sonic-device-metadata"; + prefix sdm; + + import ietf-yang-types { + prefix yang; + } + + import sonic-common { + prefix scommon; + } + + import sonic-bgp-neighbor { + prefix sbn; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC DEVICE METADATA"; + + revision 2019-07-02 { + description + "Initial revision."; + } + + container sonic-device-metadata { + + container DEVICE_METADATA { + + list DEVICE_METADATA_LIST { + key "name"; + + leaf name{ + type string; + } + + leaf hwsku { + type string; + } + + leaf hostname { + type string; + } + + leaf platform { + type string; + } + + leaf mac { + type yang:mac-address; + } + + leaf bgp_asn { + type leafref { + path "/sbn:sonic-bgp-neighbor/sbn:BGP_NEIGHBOR/sbn:BGP_NEIGHBOR_LIST/sbn:asn"; + } + } + + leaf default_pfcwd_status { + type enumeration { + enum enable; + enum disable; + } + } + + leaf default_bgp_status { + type scommon:admin-status; + } + + leaf docker_routing_config_mode { + type enumeration { + enum unified; + enum separated; + } + } + + leaf deployment_id { + type uint8 { + range "0..255"; + } + } + + leaf type { + type enumeration { + enum ToRRouter; + enum LeafRouter; + } + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-device-neighbor.yang b/src/cvl/testdata/schema/sonic-device-neighbor.yang new file mode 100644 index 0000000000..a91302ac24 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-device-neighbor.yang @@ -0,0 +1,72 @@ +module sonic-device-neighbor { + namespace "http://github.com/Azure/sonic-device-neighbor"; + prefix sdn; + + import ietf-inet-types { + prefix inet; + } + + import sonic-port { + prefix prt; + } + + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC DEVICE NEIGHBOR"; + + revision 2019-07-02 { + description + "Initial revision."; + } + + container sonic-device-neighbor { + + container DEVICE_NEIGHBOR { + + list DEVICE_NEIGHBOR_LIST { + key "name"; + + leaf name{ + type string; + } + + leaf mgmt_addr{ + type inet:ip-address; + } + + leaf hwsku { + type string; + } + + leaf lo_addr { + type inet:ip-address; + } + + leaf local_port { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + } + + leaf type { + type enumeration { + enum ToRRouter; + enum LeafRouter; + } + } + + leaf port { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-dscp-tc-map.yang b/src/cvl/testdata/schema/sonic-dscp-tc-map.yang new file mode 100644 index 0000000000..14dccddd3d --- /dev/null +++ b/src/cvl/testdata/schema/sonic-dscp-tc-map.yang @@ -0,0 +1,58 @@ +module sonic-dscp-tc-map { + namespace "http://github.com/Azure/sonic-dscp-tc-map"; + prefix dtm; + + import sonic-extension { + prefix sonic-ext; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC DSCP_TO_TC_MAP"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-dscp-tc-map { + + container DSCP_TO_TC_MAP { + + list DSCP_TO_TC_MAP_LIST { + key "name"; + sonic-ext:map-list true; //special conversion for map tables + sonic-ext:map-leaf "dscp tc_num"; //every key:value pair is mapped to list keys, e.g. "1":"7" ==> tc_num=1, dscp=7 + + leaf name { + type string; + } + + list DSCP_TO_TC_MAP { //this is list inside list for storing mapping between two fields + key "dscp tc_num"; + + leaf tc_num { + type string { + pattern "[0-9]?"{ + error-message "Invalid Traffic Class number"; + error-app-tag tc-num-invalid; + } + } + } + + leaf dscp { + type string { + pattern "[1-9][0-9]?|[0-9]?"; + } + } + } + + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-mirror-session.yang b/src/cvl/testdata/schema/sonic-mirror-session.yang new file mode 100644 index 0000000000..f9e22691dd --- /dev/null +++ b/src/cvl/testdata/schema/sonic-mirror-session.yang @@ -0,0 +1,60 @@ +module sonic-mirror-session { + namespace "http://github.com/Azure/sonic-mirror-session"; + prefix sms; + + import ietf-inet-types { + prefix inet; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONiC MIRROR SESSION"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-mirror-session { + + container MIRROR_SESSION { + + list MIRROR_SESSION_LIST { + key "name"; + + leaf name { + type string; + } + + leaf src_ip { + type inet:ipv4-address; + } + + leaf dst_ip { + type inet:ipv4-address; + } + + leaf gre_type { + type string; + } + + leaf dscp { + type uint8; + } + + leaf ttl { + type uint8; + } + + leaf queue { + type uint8; + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-pf-limits.yang b/src/cvl/testdata/schema/sonic-pf-limits.yang new file mode 100644 index 0000000000..658a6e9a8d --- /dev/null +++ b/src/cvl/testdata/schema/sonic-pf-limits.yang @@ -0,0 +1,44 @@ +module sonic-pf-limits { + namespace "http://github.com/Azure/sonic-pf-limits"; + prefix spf; + yang-version 1.1; + + import sonic-extension { + prefix sonic-ext; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC Platform constrainst"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-pf-limits { + sonic-ext:db-name "APPL_DB"; + + container acl { + leaf MAX_ACL_RULES { + type uint16; + } + leaf MAX_PRIORITY { + type uint16 { + range "1..65535"; + } + } + + } + container vlan { + leaf MAX_VLANS { + type uint16; + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-pfc-priority-queue-map.yang b/src/cvl/testdata/schema/sonic-pfc-priority-queue-map.yang new file mode 100644 index 0000000000..ad51874d69 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-pfc-priority-queue-map.yang @@ -0,0 +1,55 @@ +module sonic-pfc-priority-queue-map { + namespace "http://github.com/Azure/sonic-pfc-priority-queue-map"; + prefix ppq; + + import sonic-extension { + prefix sonic-ext; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC MAP_PFC_PRIORITY_TO_QUEUE"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-pfc-priority-queue-map { + + container MAP_PFC_PRIORITY_TO_QUEUE { + + list MAP_PFC_PRIORITY_TO_QUEUE_LIST { + key "name"; + sonic-ext:map-list true; //special conversion for map tables + sonic-ext:map-leaf "pfc_priority qindex"; //every key:value pair is mapped to list keys, e.g. "1":"7" ==> tc_num=1, dscp=7 + + leaf name { + type string; + } + + list MAP_PFC_PRIORITY_TO_QUEUE { //this is list inside list for storing mapping between two fields + key "pfc_priority qindex"; + + leaf pfc_priority { + type string { + pattern "[0-9]?"; + } + } + + leaf qindex { + type string { + pattern "[0-9]?"; + } + } + } + + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-port-qos-map.yang b/src/cvl/testdata/schema/sonic-port-qos-map.yang new file mode 100644 index 0000000000..f9785cb46a --- /dev/null +++ b/src/cvl/testdata/schema/sonic-port-qos-map.yang @@ -0,0 +1,87 @@ +module sonic-port-qos-map { + namespace "http://github.com/Azure/sonic-port-qos-map"; + prefix pqm; + + import sonic-extension { + prefix sonic-ext; + } + + import sonic-port { + prefix prt; + } + + import sonic-tc-priority-group-map { + prefix tpg; + } + + import sonic-tc-queue-map { + prefix tqm; + } + + import sonic-pfc-priority-queue-map { + prefix ppq; + } + + import sonic-dscp-tc-map { + prefix dtm; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC PORT_QOS_MAP"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-port-qos-map { + + list PORT_QOS_MAP { + key "ifname"; + sonic-ext:key-pattern "PORT_QOS_MAP|({ifname},)*"; //special pattern used for extracting keys from redis-key and fill populate the yang instance + // Total list instance = number(key1) * number(key2) * number(key3) + + leaf ifname { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + } + + leaf tc_to_pg_map { + type leafref { + path "/tpg:sonic-tc-priority-group-map/tpg:TC_TO_PRIORITY_GROUP_MAP/tpg:TC_TO_PRIORITY_GROUP_MAP_LIST/tpg:name"; + } + } + + leaf tc_to_queue_map { + type leafref { + path "/tqm:sonic-tc-queue-map/tqm:TC_TO_QUEUE_MAP/tqm:TC_TO_QUEUE_MAP_LIST/tqm:name"; + } + } + + leaf pfc-enable { + type string { + pattern "[0-9](,[0-9])?"; + } + } + + leaf pfc_to_queue_map { + type leafref { + path "/ppq:sonic-pfc-priority-queue-map/ppq:MAP_PFC_PRIORITY_TO_QUEUE/ppq:MAP_PFC_PRIORITY_TO_QUEUE_LIST/ppq:name"; + } + } + + leaf dscp_to_tc_map { + type leafref { + path "/dtm:sonic-dscp-tc-map/dtm:DSCP_TO_TC_MAP/dtm:DSCP_TO_TC_MAP_LIST/dtm:name"; + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-portchannel-interface.yang b/src/cvl/testdata/schema/sonic-portchannel-interface.yang new file mode 100644 index 0000000000..45d92787d2 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-portchannel-interface.yang @@ -0,0 +1,48 @@ +module sonic-portchannel-interface { + namespace "http://github.com/Azure/sonic-portchannel-interface"; + prefix spchint; + + import ietf-inet-types { + prefix inet; + } + + import sonic-portchannel { + prefix spc; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC PORTCHANNEL INTERFACE"; + + revision 2019-07-02 { + description + "Initial revision."; + } + + container sonic-portchannel-interface { + + container PORTCHANNEL_INTERFACE { + + list PORTCHANNEL_INTERFACE_LIST { + key "pch_name ip_prefix"; + + leaf pch_name{ + type leafref { + path "/spc:sonic-portchannel/spc:PORTCHANNEL/spc:PORTCHANNEL_LIST/spc:name"; + } + } + + leaf ip_prefix { + mandatory true; + type inet:ip-prefix; + + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-portchannel.yang b/src/cvl/testdata/schema/sonic-portchannel.yang new file mode 100644 index 0000000000..afe308f4e5 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-portchannel.yang @@ -0,0 +1,77 @@ +module sonic-portchannel { + namespace "http://github.com/Azure/sonic-portchannel"; + prefix spc; + + import sonic-common { + prefix scommon; + } + + import sonic-port { + prefix prt; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC PORTCHANNEL"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-portchannel { + + container PORTCHANNEL { + + list PORTCHANNEL_LIST { + key "name"; + + max-elements 3; + + leaf name { + type string; + } + + leaf admin_status { + type scommon:admin-status; + } + + leaf mtu { + type uint16; + } + + leaf min_links { + type uint8; + } + + leaf fallback { + type boolean; + } + } + } + + container PORTCHANNEL_MEMBER { + + list PORTCHANNEL_MEMBER_LIST { + key "name ifname"; + + leaf name { + type leafref { + path "../../../PORTCHANNEL/PORTCHANNEL_LIST/name"; + } + } + + leaf ifname { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-queue.yang b/src/cvl/testdata/schema/sonic-queue.yang new file mode 100644 index 0000000000..92a7f4c96f --- /dev/null +++ b/src/cvl/testdata/schema/sonic-queue.yang @@ -0,0 +1,74 @@ +module sonic-queue { + namespace "http://github.com/Azure/sonic-queue"; + prefix squeue; + + import sonic-extension { + prefix sonic-ext; + } + + import sonic-port { + prefix prt; + } + + import sonic-scheduler { + prefix sch; + } + + import sonic-wred-profile { + prefix wrd; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC QUEUE"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + + container sonic-queue { + + container QUEUE { + + list QUEUE_LIST { + key "ifname qindex"; + sonic-ext:key-pattern "QUEUE|({ifname},)*|{qindex}"; //special pattern used for extracting keys from redis-key and populate the yang instance + // Total list instances = number(key1) * number(key2) * number(key3) + + leaf ifname { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + } + + leaf qindex { + type string { + pattern "[0-8]((-)[0-8])?"{ + error-message "Invalid Q-index"; + error-app-tag qindex-invalid; + } + } + } + + leaf scheduler { + type leafref { + path "/sch:sonic-scheduler/sch:SCHEDULER/sch:SCHEDULER_LIST/sch:name"; + } + } + + leaf wred_profile { + type leafref { + path "/wrd:sonic-wred-profile/wrd:WRED_PROFILE/wrd:WRED_PROFILE_LIST/wrd:name"; + } + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-scheduler.yang b/src/cvl/testdata/schema/sonic-scheduler.yang new file mode 100644 index 0000000000..2fc7997f71 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-scheduler.yang @@ -0,0 +1,52 @@ +module sonic-scheduler { + namespace "http://github.com/Azure/sonic-scheduler"; + prefix sch; + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC SCHEDULER"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-scheduler { + + container SCHEDULER { + + list SCHEDULER_LIST { + key "name"; + + leaf name{ + type string; + } + + leaf type { + type enumeration { + enum DWRR; + enum WRR; + enum PRIORITY; + } + } + + leaf weight { + type uint8 { + range "0..255"; + } + } + + leaf priority { + type uint8 { + range "0..9"; + } + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-tc-priority-group-map.yang b/src/cvl/testdata/schema/sonic-tc-priority-group-map.yang new file mode 100644 index 0000000000..ed89a281ec --- /dev/null +++ b/src/cvl/testdata/schema/sonic-tc-priority-group-map.yang @@ -0,0 +1,54 @@ +module sonic-tc-priority-group-map { + namespace "http://github.com/Azure/sonic-tc-priority-group-map"; + prefix tpg; + + import sonic-extension { + prefix sonic-ext; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC TC_TO_PRIORITY_GROUP_MAP"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-tc-priority-group-map { + + container TC_TO_PRIORITY_GROUP_MAP { + + list TC_TO_PRIORITY_GROUP_MAP_LIST { + key "name"; + sonic-ext:map-list "true"; //special conversion for map tables + sonic-ext:map-leaf "tc_num pg_num"; //every key:value pair is mapped to list keys, e.g. "1":"7" ==> tc_num=1, dscp=7 + + leaf name { + type string; + } + + list TC_TO_PRIORITY_GROUP_MAP { //this is list inside list for storing mapping between two fields + key "tc_num pg_num"; + + leaf tc_num { + type string { + pattern "[0-9]?"; + } + } + + leaf pg_num { + type string { + pattern "[0-7]?"; + } + } + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-tc-queue-map.yang b/src/cvl/testdata/schema/sonic-tc-queue-map.yang new file mode 100644 index 0000000000..37ab1c8113 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-tc-queue-map.yang @@ -0,0 +1,55 @@ +module sonic-tc-queue-map { + namespace "http://github.com/Azure/sonic-tc-queue-map"; + prefix tqm; + + import sonic-extension { + prefix sonic-ext; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC TC_TO_QUEUE_MAP"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-tc-queue-map { + + container TC_TO_QUEUE_MAP { + + list TC_TO_QUEUE_MAP_LIST { + key "name"; + sonic-ext:map-list "true"; //special conversion for map tables + sonic-ext:map-leaf "tc_num qindex"; //every key:value pair is mapped to list keys, e.g. "1":"7" ==> tc_num=1, qindex=7 + + leaf name { + type string; + } + + list TC_TO_QUEUE_MAP { //this is list inside list for storing mapping between two fields + key "tc_num qindex"; + + leaf tc_num { + type string { + pattern "[0-9]?"; + } + } + + leaf qindex { + type string { + pattern "[0-9]?"; + } + } + } + + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-vlan-deviation.yang b/src/cvl/testdata/schema/sonic-vlan-deviation.yang new file mode 100644 index 0000000000..ff426fb30c --- /dev/null +++ b/src/cvl/testdata/schema/sonic-vlan-deviation.yang @@ -0,0 +1,36 @@ +module sonic-vlan-deviation { + namespace "http://github.com/Azure/sonic-vlan-deviation"; + prefix svd; + yang-version 1.1; + + /* + import sonic-vlan { + prefix svlan; + } + */ + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC VLAN deviation file"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + /* + deviation /svlan:sonic-vlan/svlan:VLAN/svlan:name { + deviate replace { + type string { + // Supports 3K VLANs + pattern "Vlan([1-3][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[1-9])"; + } + } + } + */ +} diff --git a/src/cvl/testdata/schema/sonic-vlan-interface.yang b/src/cvl/testdata/schema/sonic-vlan-interface.yang new file mode 100644 index 0000000000..554feb1f58 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-vlan-interface.yang @@ -0,0 +1,48 @@ +module sonic-vlan-interface { + namespace "http://github.com/Azure/sonic-vlan-interface"; + prefix svint; + + import ietf-inet-types { + prefix inet; + } + + import sonic-vlan { + prefix svlan; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC VLAN INTERFACE"; + + revision 2019-07-02 { + description + "Initial revision."; + } + + container sonic-vlan-interface { + + container VLAN_INTERFACE { + + list VLAN_INTERFACE_LIST { + key "portname ip_prefix"; + + leaf portname{ + type leafref { + path "/svlan:sonic-vlan/svlan:VLAN/svlan:VLAN_LIST/svlan:name"; + } + } + + leaf ip_prefix { + mandatory true; + type inet:ip-prefix; + + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-vlan.yang b/src/cvl/testdata/schema/sonic-vlan.yang new file mode 100644 index 0000000000..1170960df1 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-vlan.yang @@ -0,0 +1,107 @@ +module sonic-vlan { + namespace "http://github.com/Azure/sonic-vlan"; + prefix svlan; + yang-version 1.1; + + import sonic-common { + prefix scommon; + } + + import sonic-port { + prefix prt; + } + + import sonic-portchannel { + prefix spc; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC VLAN"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + + container sonic-vlan { + + container VLAN { + + list VLAN_LIST { + key "name"; + must "./name = concat('Vlan', string(./vlanid))"{ + error-app-tag vlan-invalid; + } + + leaf name { + type string { + pattern "Vlan(409[0-5]|40[0-8][0-9]|[1-3][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[1-9])" { + error-message "Invalid Vlan name pattern"; + error-app-tag vlan-name-invalid; + } + } + } + + leaf vlanid { + mandatory true; + type uint16 { + range "1..4095" { + error-message "Vlan ID out of range"; + error-app-tag vlanid-invalid; + } + } + } + + leaf-list members { + must "count(../members[text()=/spc:sonic-portchannel/spc:PORTCHANNEL_MEMBER/" + + "spc:PORTCHANNEL_MEMBER_LIST[spc:ifname=current()]/spc:name]) = 0 and " + + "count(../members[text()=/spc:sonic-portchannel/spc:PORTCHANNEL_MEMBER/" + + "spc:PORTCHANNEL_MEMBER_LIST[spc:name=current()]/spc:ifname]) = 0 " { + error-message "A vlan interface member cannot be part of portchannel which is already a vlan member"; + } + + + type union { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + type leafref { + path "/spc:sonic-portchannel/spc:PORTCHANNEL/spc:PORTCHANNEL_LIST/spc:name"; + } + } + } + } + } + + container VLAN_MEMBER { + + list VLAN_MEMBER_LIST { + key "name ifname"; + + leaf name { + type leafref { + path "../../../VLAN/VLAN_LIST/name"; + } + } + + leaf ifname { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:ifname"; + } + } + + leaf tagging_mode { + type scommon:tagging_mode; + default tagged; + } + } + } + } +} diff --git a/src/cvl/testdata/schema/sonic-wred-profile.yang b/src/cvl/testdata/schema/sonic-wred-profile.yang new file mode 100644 index 0000000000..e3c5abe363 --- /dev/null +++ b/src/cvl/testdata/schema/sonic-wred-profile.yang @@ -0,0 +1,80 @@ +module sonic-wred-profile { + namespace "http://github.com/Azure/sonic-wred-profile"; + prefix wrd; + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC WRED_PROFILE"; + + revision 2019-05-15 { + description + "Initial revision."; + } + + container sonic-wred-profile { + + container WRED_PROFILE { + + list WRED_PROFILE_LIST { + key "name"; + + leaf name{ + type string; + } + + leaf yellow_min_threshold { + type uint64; + } + + leaf green_min_threshold { + type uint64; + } + + leaf red_min_threshold { + type uint64; + } + leaf yellow_max_threshold { + type uint64; + } + + leaf green_max_threshold { + type uint64; + } + + leaf red_max_threshold { + type uint64; + } + + leaf ecn { + type enumeration { + enum ecn_none; + enum ecn_green; + enum ecn_yellow; + enum ecn_red; + enum ecn_green_yellow; + enum ecn_green_red; + enum ecn_yellow_red; + enum ecn_all; + } + } + + leaf wred_green_enable { + type boolean; + } + + leaf wred_yellow_enable { + type boolean; + } + + leaf wred_red_enable { + type boolean; + } + } + } + } +} diff --git a/src/cvl/tests/Makefile b/src/cvl/tests/Makefile new file mode 100644 index 0000000000..ce4dc21f0f --- /dev/null +++ b/src/cvl/tests/Makefile @@ -0,0 +1,37 @@ +################################################################################ +# # +# Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or # +# its subsidiaries. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# # +################################################################################ + +SRC_FILES=$(wildcard *.go) +OUT=$(patsubst %.go, %, $(SRC_FILES)) +TOPDIR := $(abspath ../../..) +GO=/usr/local/go/bin/go +GOPATH = $(TOPDIR):$(shell go env GOPATH) + +all:tests + +tests: $(OUT) + +%:%.go + make -C ../testdata/schema + @echo "Building $@ ..." + GOPATH=$(GOPATH) $(GO) build -gcflags="all=-N -l" $< + +clean: + @echo "Removing files ..." + rm -rf $(OUT) diff --git a/src/cvl/tests/acl_rule.json b/src/cvl/tests/acl_rule.json new file mode 100644 index 0000000000..c26cdee0e5 --- /dev/null +++ b/src/cvl/tests/acl_rule.json @@ -0,0 +1,22 @@ +{ +"ACL_TABLE": { + "TestACL11": { + "type": "L3", + "ports": "Ethernet0" + } + }, +"ACL_RULE": { + "TestACL11|Rule1": { + "PRIORITY": "55", + "PACKET_ACTION": "DROP", + "IP_TYPE" : "ANY", + "L4_SRC_PORT": "0" + }, + "TestACL11|Rule2": { + "PRIORITY": "55", + "PACKET_ACTION": "DROP", + "IP_TYPE" : "ANY", + "L4_SRC_PORT": "1" + } + } +} diff --git a/src/cvl/tests/cfg_validator.go b/src/cvl/tests/cfg_validator.go new file mode 100644 index 0000000000..f5a532da95 --- /dev/null +++ b/src/cvl/tests/cfg_validator.go @@ -0,0 +1,273 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package main + +import ( + "fmt" + "os" + "time" + "io/ioutil" + "cvl" +) + +func main() { + jsonData :=`{ + "VLAN": { + "Vlan100": { + "members": [ + "Ethernet44", + "Ethernet64" + ], + "vlanid": "100" + }, + "Vlan1200": { + "members": [ + "Ethernet64", + "Ethernet8" + ], + "vlanid": "1200" + }, + "Vlan2500": { + "members": [ + "Ethernet8", + "Ethernet64" + ], + "vlanid": "2500" + } + } + }` + /* + "ACL_TABLE": { + "TestACL1": { + "stage": "INGRESS", + "type": "l3" + } + }, + "ACL_RULE": { + "TestACL1|Rule1": { + "packet_action": "forward", + "src_ip": "10.1.1.1/32", + "l4_src_port": "ABC", + "ip_protocol": "ip", + "dst_ip": "20.2.2.2/32", + "l4_dst_port_range": "9000-12000", + "mirror_action" : "mirror1" + } + }*/ + +/*jsonData := `{ + "DEVICE_METADATA": { + "localhost": { + "hwsku": "Force10-S6100", + "default_bgp_status": "up", + "docker_routing_config_mode": "unified", + "hostname": "sonic-s6100-01", + "platform": "x86_64-dell_s6100_c2538-r0", + "mac": "4c:76:25:f4:70:82", + "default_pfcwd_status": "disable", + "deployment_id": "1", + "type": "ToRRouter" + } + } + }`*/ +/*jsonData := `{ + "DEVICE_NEIGHBOR": { + "ARISTA04T1": { + "mgmt_addr": "10.20.0.163", + "hwsku": "Arista", + "lo_addr": "2.2.2.2", + "local_port": "Ethernet124", + "type": "LeafRouter", + "port": "Ethernet68" + } + } + }`*/ +/*jsonData := `{ + "BGP_NEIGHBOR": { + "10.0.0.61": { + "local_addr": "10.0.0.60", + "asn": 64015, + "name": "ARISTA15T0" + } + } + }`*/ + +/* jsonData := `{ + "INTERFACE": { + "Ethernet68|10.0.0.0/31": {}, + "Ethernet24|10.0.0.2/31": {}, + "Ethernet112|10.0.0.4/31": {} + } + }`*/ + +/*jsonData := `{ + "INTERFACE": { + "Ethernet68|10.0.0.0/31": {}, + "Ethernet24|10.0.0.2/31": {}, + "Ethernet112|10.0.0.4/31": {} + } + }`*/ +/*jsonData := `{ + "PORTCHANNEL_INTERFACE": { + "PortChannel01|10.0.0.56/31": {}, + "PortChannel01|FC00::71/126": {}, + "PortChannel02|10.0.0.58/31": {}, + "PortChannel02|FC00::75/126": {} + } + + }`*/ +/*jsonData := `{ + "VLAN_INTERFACE": { + "Vlan1000|192.168.0.1/27": {} + } + }`*/ + start := time.Now() + + dataFile := "" + if (len(os.Args) >= 2) { + if (os.Args[1] == "debug") { + cvl.Debug(true) + } else { + dataFile = os.Args[1] + } + } + if (len(os.Args) == 3) { + dataFile = os.Args[2] + } + + //cvl.Initialize() + + b, e := ioutil.ReadFile(dataFile) + if e != nil { + fmt.Printf("\nFailed to read data file : %v\n", e) + } else { + jsonData = string(b) + } + + + cv, ret := cvl.ValidationSessOpen() + if (ret != cvl.CVL_SUCCESS) { + fmt.Printf("NewDB: Could not create CVL session") + return + } + + err := cv.ValidateConfig(jsonData) + + fmt.Printf("\nValidating data = %v\n\n", jsonData); + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + + keyData := make([]cvl.CVLEditConfigData, 4) + keyData[0].VType = cvl.VALIDATE_NONE + keyData[0].VOp = cvl.OP_NONE + keyData[0].Key = "ACL_TABLE|MyACL55_ACL_IPV4" + keyData[0].Data = make(map[string]string) + keyData[0].Data["stage"] = "INGRESS" + keyData[0].Data["type"] = "l3" + + keyData[1].VType = cvl.VALIDATE_NONE + keyData[1].VOp = cvl.OP_NONE + keyData[1].Key = "ACL_RULE|MyACL55_ACL_IPV4|RULE_1" + keyData[1].Data = make(map[string]string) + keyData[1].Data["packet_action"] = "forward" + keyData[1].Data["ip_protocol"] = "ip" + keyData[1].Data["src_ip"] = "10.1.1.1/32" + keyData[1].Data["dst_ip"] = "20.2.2.2/32" + + keyData[2].VType = cvl.VALIDATE_NONE + keyData[2].VOp = cvl.OP_NONE + keyData[2].Key = "ACL_TABLE|MyACL11_ACL_IPV4" + keyData[2].Data = make(map[string]string) + keyData[2].Data["stage"] = "INGRESS" + + keyData[3].VType = cvl.VALIDATE_ALL + keyData[3].VOp = cvl.OP_CREATE + keyData[3].Key = "VLAN|Vlan901" + keyData[3].Data = make(map[string]string) + keyData[3].Data["members"] = "Ethernet8" + keyData[3].Data["vlanid"] = "901" + + _, ret = cv.ValidateEditConfig(keyData) + fmt.Printf("\n\n\n cvl.ValidateEditConfig() = %d\n", ret) + + keyData1 := make([]cvl.CVLEditConfigData, 3) + keyData1[0].VType = cvl.VALIDATE_NONE + keyData1[0].VOp = cvl.OP_NONE + keyData1[0].Key = "ACL_TABLE|MyACL11_ACL_IPV4" + keyData1[0].Data = make(map[string]string) + keyData1[0].Data["stage"] = "INGRESS" + keyData1[0].Data["type"] = "l3" + + keyData1[1].VType = cvl.VALIDATE_NONE + keyData1[1].VOp = cvl.OP_NONE + keyData1[1].Key = "ACL_RULE|MyACL11_ACL_IPV4|RULE_1" + keyData1[1].Data = make(map[string]string) + keyData1[1].Data["packet_action"] = "forward" + keyData1[1].Data["ip_protocol"] = "ip" + keyData1[1].Data["src_ip"] = "10.1.1.1/32" + keyData1[1].Data["dst_ip"] = "20.2.2.2/32" + + keyData1[2].VType = cvl.VALIDATE_ALL + keyData1[2].VOp = cvl.OP_UPDATE + keyData1[2].Key = "ACL_TABLE|MyACL33_ACL_IPV4" + keyData1[2].Data = make(map[string]string) + keyData1[2].Data["stage"] = "INGRESS" + + _, ret = cv.ValidateEditConfig(keyData) + fmt.Printf("\n\n\n cvl.ValidateEditConfig() = %d\n", ret) + + + keyData2 := make([]cvl.CVLEditConfigData, 3) + keyData2[0].VType = cvl.VALIDATE_ALL + keyData2[0].VOp = cvl.OP_DELETE + keyData2[0].Key = "ACL_TABLE|MyACL11_ACL_IPV4" + keyData2[0].Data = make(map[string]string) + + keyData2[1].VType = cvl.VALIDATE_ALL + keyData2[1].VOp = cvl.OP_DELETE + keyData2[1].Key = "ACL_RULE|MyACL11_ACL_IPV4|RULE_1" + keyData2[1].Data = make(map[string]string) + + keyData2[2].VType = cvl.VALIDATE_ALL + keyData2[2].VOp = cvl.OP_DELETE + keyData2[2].Key = "ACL_TABLE|MyACL33_ACL_IPV4" + keyData2[2].Data = make(map[string]string) + + _, ret = cv.ValidateEditConfig(keyData) + fmt.Printf("\n\n\n cvl.ValidateEditConfig() = %d\n", ret) + + + cvl.ValidationSessClose(cv) + cvl.Finish() + fmt.Printf("\n\n\n Time taken = %v\n", time.Since(start)) + + stopChan := make(chan int, 1) + for { + select { + case <- stopChan: + } + } + + +} diff --git a/src/cvl/tests/config_db.json b/src/cvl/tests/config_db.json new file mode 100644 index 0000000000..381412ad6b --- /dev/null +++ b/src/cvl/tests/config_db.json @@ -0,0 +1,107 @@ +{ + "VLAN": { + "Vlan100": { + "members": [ + "Ethernet44", + "Ethernet64" + ], + "vlanid": "100" + }, + "Vlan1200": { + "members": [ + "Ethernet64", + "Ethernet8" + ], + "vlanid": "1200" + }, + "Vlan2500": { + "members": [ + "Ethernet8", + "Ethernet64" + ], + "vlanid": "2500" + } + }, + "VLAN_MEMBER": { + "Vlan100|Ethernet924": { + "tagging_mode": "tagged" + }, + "Vlan100|Ethernet28": { + "tagging_mode": "tagged" + }, + "Vlan1200|Ethernet4": { + "tagging_mode": "tagged" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS": { + "red_max_threshold": "312000", + "wred_green_enable": "true", + "ecn": "ecn_all", + "green_min_threshold": "104000", + "red_min_threshold": "104000", + "wred_yellow_enable": "true", + "yellow_min_threshold": "104000", + "wred_red_enable": "true", + "yellow_max_threshold": "312000", + "green_max_threshold": "312000" + } + }, + "BUFFER_POOL": { + "egress_lossless_pool": { + "type": "egress", + "mode": "static", + "size": "12766208" + }, + "egress_lossy_pool": { + "type": "egress", + "mode": "dynamic", + "size": "8072396" + }, + "ingress_lossless_pool": { + "type": "ingress", + "mode": "dynamic", + "size": "12766208" + } + }, + "MIRROR_SESSION": { + "everflow0": { + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type": "DWRR", + "weight": "25" + }, + "scheduler.1": { + "type": "DWRR", + "weight": "30" + }, + "scheduler.2": { + "type": "DWRR", + "weight": "20" + } + }, + "QUEUE": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { + "scheduler": "[SCHEDULER|scheduler.1]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { + "scheduler": "[SCHEDULER|scheduler.2]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "wred_profile": "[WRED_PROFILE|AZURE_LOSSLESS]", + "scheduler": "[SCHEDULER|scheduler.0]" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "1": "1", + "0": "0", + "3": "3", + "4": "4" + } + } +} diff --git a/src/cvl/tests/config_db1.json b/src/cvl/tests/config_db1.json new file mode 100644 index 0000000000..b565af7cb1 --- /dev/null +++ b/src/cvl/tests/config_db1.json @@ -0,0 +1,313 @@ +{ + "QUEUE": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { + "scheduler": "[SCHEDULER|scheduler.1]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { + "scheduler": "[SCHEDULER|scheduler.2]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "wred_profile": "[WRED_PROFILE|AZURE_LOSSLESS]", + "scheduler": "[SCHEDULER|scheduler.0]" + } + }, + "PORT": { + "Ethernet0": { + "alias": "fortyGigE0/0", + "lanes": "29,30,31,32" + }, + "Ethernet4": { + "alias": "fortyGigE0/4", + "lanes": "25,26,27,28" + }, + "Ethernet8": { + "alias": "fortyGigE0/8", + "lanes": "37,38,39,40" + }, + "Ethernet12": { + "alias": "fortyGigE0/12", + "lanes": "33,34,35,36" + }, + "Ethernet16": { + "alias": "fortyGigE0/16", + "lanes": "41,42,43,44" + }, + "Ethernet20": { + "alias": "fortyGigE0/20", + "lanes": "45,46,47,48" + }, + "Ethernet24": { + "alias": "fortyGigE0/24", + "lanes": "5,6,7,8" + }, + "Ethernet28": { + "alias": "fortyGigE0/28", + "lanes": "1,2,3,4" + }, + "Ethernet32": { + "alias": "fortyGigE0/32", + "lanes": "9,10,11,12" + }, + "Ethernet36": { + "alias": "fortyGigE0/36", + "lanes": "13,14,15,16" + }, + "Ethernet40": { + "alias": "fortyGigE0/40", + "lanes": "21,22,23,24" + }, + "Ethernet44": { + "alias": "fortyGigE0/44", + "lanes": "17,18,19,20" + }, + "Ethernet48": { + "alias": "fortyGigE0/48", + "lanes": "49,50,51,52" + }, + "Ethernet52": { + "alias": "fortyGigE0/52", + "lanes": "53,54,55,56" + }, + "Ethernet56": { + "alias": "fortyGigE0/56", + "lanes": "61,62,63,64" + }, + "Ethernet60": { + "alias": "fortyGigE0/60", + "lanes": "57,58,59,60" + }, + "Ethernet64": { + "alias": "fortyGigE0/64", + "lanes": "65,66,67,68" + }, + "Ethernet68": { + "alias": "fortyGigE0/68", + "lanes": "69,70,71,72" + }, + "Ethernet72": { + "alias": "fortyGigE0/72", + "lanes": "77,78,79,80" + }, + "Ethernet76": { + "alias": "fortyGigE0/76", + "lanes": "73,74,75,76" + }, + "Ethernet80": { + "alias": "fortyGigE0/80", + "lanes": "105,106,107,108" + }, + "Ethernet84": { + "alias": "fortyGigE0/84", + "lanes": "109,110,111,112" + }, + "Ethernet88": { + "alias": "fortyGigE0/88", + "lanes": "117,118,119,120" + }, + "Ethernet92": { + "alias": "fortyGigE0/92", + "lanes": "113,114,115,116" + }, + "Ethernet96": { + "alias": "fortyGigE0/96", + "lanes": "121,122,123,124" + }, + "Ethernet100": { + "alias": "fortyGigE0/100", + "lanes": "125,126,127,128" + }, + "Ethernet104": { + "alias": "fortyGigE0/104", + "lanes": "85,86,87,88" + }, + "Ethernet108": { + "alias": "fortyGigE0/108", + "lanes": "81,82,83,84" + }, + "Ethernet112": { + "alias": "fortyGigE0/112", + "lanes": "89,90,91,92" + }, + "Ethernet116": { + "alias": "fortyGigE0/116", + "lanes": "93,94,95,96" + }, + "Ethernet120": { + "alias": "fortyGigE0/120", + "lanes": "97,98,99,100" + }, + "Ethernet124": { + "alias": "fortyGigE0/124", + "lanes": "101,102,103,104" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS": { + "red_max_threshold": "312000", + "wred_green_enable": "true", + "ecn": "ecn_all", + "green_min_threshold": "104000", + "red_min_threshold": "104000", + "wred_yellow_enable": "true", + "yellow_min_threshold": "104000", + "wred_red_enable": "true", + "yellow_max_threshold": "312000", + "green_max_threshold": "312000" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type": "DWRR", + "weight": "25" + }, + "scheduler.1": { + "type": "DWRR", + "weight": "30" + }, + "scheduler.2": { + "type": "DWRR", + "weight": "20" + } + }, + "BUFFER_PG": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0-1": { + "profile": "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "profile": "[BUFFER_PROFILE|ingress_lossless_profile]" + } + }, + "BUFFER_PROFILE": { + "egress_lossless_profile": { + "static_th": "12766208", + "pool": "[BUFFER_POOL|egress_lossless_pool]", + "size": "0" + }, + "egress_lossy_profile": { + "dynamic_th": "3", + "pool": "[BUFFER_POOL|egress_lossy_pool]", + "size": "1518" + }, + "ingress_lossless_profile": { + "xon_offset": "2496", + "dynamic_th": "-4", + "xon": "18432", + "xoff": "40560", + "pool": "[BUFFER_POOL|ingress_lossless_pool]", + "size": "41808" + }, + "ingress_lossy_profile": { + "dynamic_th": "3", + "pool": "[BUFFER_POOL|ingress_lossless_pool]", + "size": "0" + } + }, + "BUFFER_POOL": { + "egress_lossless_pool": { + "type": "egress", + "mode": "static", + "size": "12766208" + }, + "egress_lossy_pool": { + "type": "egress", + "mode": "dynamic", + "size": "8072396" + }, + "ingress_lossless_pool": { + "type": "ingress", + "mode": "dynamic", + "size": "12766208" + } + }, + "MIRROR_SESSION": { + "everflow0": { + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "1": "1", + "0": "0", + "3": "3", + "4": "4" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "56": "0", + "54": "0", + "28": "0", + "48": "0", + "29": "0", + "60": "0", + "61": "0", + "62": "0", + "63": "0", + "49": "0", + "34": "0", + "24": "0", + "25": "0", + "26": "0", + "27": "0", + "20": "0", + "21": "0", + "22": "0", + "23": "0", + "46": "0", + "47": "0", + "44": "0", + "45": "0", + "42": "0", + "43": "0", + "40": "0", + "41": "0", + "1": "0", + "0": "0", + "3": "3", + "2": "0", + "5": "0", + "4": "4", + "7": "0", + "6": "0", + "9": "0", + "8": "1", + "35": "0", + "13": "0", + "12": "0", + "15": "0", + "58": "0", + "11": "0", + "10": "0", + "39": "0", + "38": "0", + "59": "0", + "14": "0", + "17": "0", + "16": "0", + "19": "0", + "18": "0", + "31": "0", + "30": "0", + "51": "0", + "36": "0", + "53": "0", + "52": "0", + "33": "0", + "55": "0", + "37": "0", + "32": "0", + "57": "0", + "50": "0" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "1", + "0": "0", + "3": "3", + "4": "4" + } + } +} + diff --git a/src/cvl/tests/config_db2.json b/src/cvl/tests/config_db2.json new file mode 100644 index 0000000000..e6be83ac4e --- /dev/null +++ b/src/cvl/tests/config_db2.json @@ -0,0 +1,3437 @@ +{ + "VLAN_MEMBER": { + "Vlan51|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan51|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan97|Ethernet4": { + "tagging_mode": "untagged" + }, + "Vlan99|Ethernet4": { + "tagging_mode": "untagged" + }, + "Vlan99|Ethernet108": { + "tagging_mode": "untagged" + }, + "Vlan99|Ethernet124": { + "tagging_mode": "untagged" + }, + "Vlan101|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan101|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan101|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan102|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan102|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan102|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan103|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan103|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan103|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan104|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan104|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan104|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan105|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan105|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan105|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan106|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan106|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan106|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan107|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan107|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan107|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan108|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan108|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan108|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan109|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan109|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan109|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan110|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan110|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan110|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan111|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan111|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan111|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan112|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan112|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan112|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan113|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan113|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan113|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan114|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan114|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan114|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan115|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan115|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan115|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan116|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan116|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan116|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan117|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan117|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan117|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan118|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan118|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan118|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan119|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan119|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan119|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan120|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan120|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan120|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan121|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan121|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan121|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan122|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan122|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan122|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan123|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan123|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan123|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan124|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan124|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan124|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan125|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan125|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan125|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan126|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan126|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan126|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan127|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan127|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan127|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan128|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan128|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan128|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan129|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan129|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan129|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan130|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan130|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan130|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan131|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan131|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan131|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan132|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan132|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan132|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan133|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan133|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan133|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan134|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan134|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan134|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan135|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan135|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan135|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan136|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan136|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan136|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan137|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan137|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan137|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan138|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan138|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan138|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan139|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan139|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan139|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan140|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan140|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan140|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan141|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan141|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan141|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan142|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan142|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan142|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan143|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan143|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan143|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan144|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan144|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan144|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan145|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan145|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan145|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan146|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan146|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan146|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan147|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan147|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan147|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan148|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan148|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan148|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan149|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan149|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan149|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan150|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan150|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan150|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan151|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan151|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan151|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan152|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan152|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan152|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan153|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan153|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan153|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan154|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan154|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan154|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan155|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan155|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan155|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan156|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan156|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan156|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan157|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan157|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan157|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan158|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan158|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan158|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan159|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan159|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan159|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan160|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan160|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan160|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan161|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan161|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan161|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan162|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan162|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan162|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan163|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan163|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan163|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan164|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan164|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan164|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan165|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan165|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan165|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan166|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan166|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan166|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan167|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan167|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan167|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan168|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan168|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan168|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan169|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan169|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan169|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan170|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan170|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan170|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan171|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan171|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan171|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan172|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan172|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan172|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan173|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan173|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan173|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan174|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan174|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan174|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan175|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan175|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan175|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan176|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan176|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan176|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan177|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan177|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan177|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan178|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan178|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan178|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan179|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan179|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan179|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan180|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan180|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan180|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan181|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan181|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan181|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan182|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan182|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan182|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan183|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan183|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan183|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan184|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan184|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan184|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan185|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan185|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan185|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan186|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan186|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan186|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan187|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan187|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan187|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan188|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan188|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan188|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan189|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan189|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan189|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan190|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan190|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan190|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan191|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan191|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan191|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan192|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan192|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan192|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan193|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan193|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan193|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan194|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan194|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan194|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan195|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan195|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan195|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan196|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan196|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan196|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan197|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan197|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan197|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan198|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan198|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan198|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan199|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan200|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan200|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan200|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan201|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan201|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan201|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan202|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan202|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan202|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan203|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan203|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan203|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan204|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan204|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan204|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan205|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan205|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan205|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan206|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan206|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan206|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan207|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan207|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan207|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan208|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan208|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan208|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan209|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan209|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan209|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan210|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan210|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan210|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan211|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan211|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan211|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan212|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan212|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan212|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan213|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan213|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan213|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan214|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan214|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan214|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan215|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan215|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan215|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan216|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan216|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan216|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan217|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan217|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan217|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan218|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan218|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan218|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan219|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan219|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan219|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan220|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan220|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan220|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan221|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan221|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan221|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan222|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan222|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan222|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan223|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan223|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan223|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan224|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan224|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan224|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan225|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan225|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan225|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan226|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan226|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan226|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan227|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan227|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan227|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan228|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan228|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan228|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan229|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan229|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan229|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan230|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan230|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan230|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan231|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan231|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan231|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan232|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan232|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan232|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan233|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan233|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan233|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan234|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan234|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan234|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan235|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan235|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan235|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan236|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan236|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan236|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan237|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan237|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan237|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan238|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan238|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan238|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan239|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan239|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan239|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan240|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan240|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan240|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan241|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan241|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan241|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan242|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan242|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan242|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan243|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan243|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan243|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan244|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan244|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan244|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan245|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan245|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan245|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan246|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan246|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan246|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan247|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan247|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan247|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan248|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan248|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan248|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan249|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan249|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan249|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan250|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan250|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan250|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan251|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan251|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan251|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan252|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan252|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan252|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan253|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan253|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan253|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan254|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan254|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan254|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan255|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan255|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan255|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan256|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan256|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan256|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan257|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan257|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan257|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan258|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan258|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan258|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan259|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan259|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan259|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan260|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan260|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan260|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan261|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan261|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan261|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan262|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan262|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan262|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan263|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan263|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan263|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan264|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan264|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan264|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan265|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan265|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan265|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan266|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan266|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan266|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan267|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan267|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan267|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan268|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan268|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan268|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan269|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan269|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan269|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan270|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan270|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan270|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan271|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan271|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan271|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan272|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan272|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan272|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan273|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan273|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan273|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan274|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan274|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan274|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan275|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan275|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan275|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan276|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan276|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan276|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan277|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan277|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan277|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan278|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan278|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan278|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan279|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan279|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan279|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan280|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan280|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan280|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan281|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan281|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan281|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan282|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan282|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan282|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan283|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan283|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan283|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan284|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan284|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan284|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan285|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan285|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan285|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan286|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan286|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan286|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan287|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan287|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan287|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan288|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan288|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan288|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan289|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan289|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan289|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan290|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan290|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan290|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan291|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan291|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan291|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan292|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan292|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan292|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan293|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan293|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan293|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan294|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan294|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan294|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan295|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan295|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan295|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan296|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan296|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan296|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan297|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan297|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan297|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan298|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan298|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan298|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan299|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan299|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan299|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan300|Ethernet108": { + "tagging_mode": "tagged" + }, + "Vlan300|Ethernet124": { + "tagging_mode": "tagged" + }, + "Vlan300|Ethernet4": { + "tagging_mode": "tagged" + } + }, + "VLAN": { + "Vlan51": { + "members": [ + "Ethernet108", + "Ethernet124" + ], + "vlanid": "51" + }, + "Vlan97": { + "members": [ + "Ethernet4" + ], + "vlanid": "97" + }, + "Vlan99": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "99" + }, + "Vlan101": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "101" + }, + "Vlan102": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "102" + }, + "Vlan103": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "103" + }, + "Vlan104": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "104" + }, + "Vlan105": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "105" + }, + "Vlan106": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "106" + }, + "Vlan107": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "107" + }, + "Vlan108": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "108" + }, + "Vlan109": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "109" + }, + "Vlan110": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "110" + }, + "Vlan111": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "111" + }, + "Vlan112": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "112" + }, + "Vlan113": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "113" + }, + "Vlan114": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "114" + }, + "Vlan115": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "115" + }, + "Vlan116": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "116" + }, + "Vlan117": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "117" + }, + "Vlan118": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "118" + }, + "Vlan119": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "119" + }, + "Vlan120": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "120" + }, + "Vlan121": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "121" + }, + "Vlan122": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "122" + }, + "Vlan123": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "123" + }, + "Vlan124": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "124" + }, + "Vlan125": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "125" + }, + "Vlan126": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "126" + }, + "Vlan127": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "127" + }, + "Vlan128": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "128" + }, + "Vlan129": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "129" + }, + "Vlan130": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "130" + }, + "Vlan131": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "131" + }, + "Vlan132": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "132" + }, + "Vlan133": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "133" + }, + "Vlan134": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "134" + }, + "Vlan135": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "135" + }, + "Vlan136": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "136" + }, + "Vlan137": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "137" + }, + "Vlan138": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "138" + }, + "Vlan139": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "139" + }, + "Vlan140": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "140" + }, + "Vlan141": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "141" + }, + "Vlan142": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "142" + }, + "Vlan143": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "143" + }, + "Vlan144": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "144" + }, + "Vlan145": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "145" + }, + "Vlan146": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "146" + }, + "Vlan147": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "147" + }, + "Vlan148": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "148" + }, + "Vlan149": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "149" + }, + "Vlan150": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "150" + }, + "Vlan151": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "151" + }, + "Vlan152": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "152" + }, + "Vlan153": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "153" + }, + "Vlan154": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "154" + }, + "Vlan155": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "155" + }, + "Vlan156": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "156" + }, + "Vlan157": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "157" + }, + "Vlan158": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "158" + }, + "Vlan159": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "159" + }, + "Vlan160": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "160" + }, + "Vlan161": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "161" + }, + "Vlan162": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "162" + }, + "Vlan163": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "163" + }, + "Vlan164": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "164" + }, + "Vlan165": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "165" + }, + "Vlan166": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "166" + }, + "Vlan167": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "167" + }, + "Vlan168": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "168" + }, + "Vlan169": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "169" + }, + "Vlan170": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "170" + }, + "Vlan171": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "171" + }, + "Vlan172": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "172" + }, + "Vlan173": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "173" + }, + "Vlan174": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "174" + }, + "Vlan175": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "175" + }, + "Vlan176": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "176" + }, + "Vlan177": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "177" + }, + "Vlan178": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "178" + }, + "Vlan179": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "179" + }, + "Vlan180": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "180" + }, + "Vlan181": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "181" + }, + "Vlan182": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "182" + }, + "Vlan183": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "183" + }, + "Vlan184": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "184" + }, + "Vlan185": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "185" + }, + "Vlan186": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "186" + }, + "Vlan187": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "187" + }, + "Vlan188": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "188" + }, + "Vlan189": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "189" + }, + "Vlan190": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "190" + }, + "Vlan191": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "191" + }, + "Vlan192": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "192" + }, + "Vlan193": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "193" + }, + "Vlan194": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "194" + }, + "Vlan195": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "195" + }, + "Vlan196": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "196" + }, + "Vlan197": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "197" + }, + "Vlan198": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "198" + }, + "Vlan199": { + "members": [ + "Ethernet64" + ], + "vlanid": "199" + }, + "Vlan200": { + "members": [ + "Ethernet64", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "200" + }, + "Vlan201": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "201" + }, + "Vlan202": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "202" + }, + "Vlan203": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "203" + }, + "Vlan204": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "204" + }, + "Vlan205": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "205" + }, + "Vlan206": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "206" + }, + "Vlan207": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "207" + }, + "Vlan208": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "208" + }, + "Vlan209": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "209" + }, + "Vlan210": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "210" + }, + "Vlan211": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "211" + }, + "Vlan212": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "212" + }, + "Vlan213": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "213" + }, + "Vlan214": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "214" + }, + "Vlan215": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "215" + }, + "Vlan216": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "216" + }, + "Vlan217": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "217" + }, + "Vlan218": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "218" + }, + "Vlan219": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "219" + }, + "Vlan220": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "220" + }, + "Vlan221": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "221" + }, + "Vlan222": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "222" + }, + "Vlan223": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "223" + }, + "Vlan224": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "224" + }, + "Vlan225": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "225" + }, + "Vlan226": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "226" + }, + "Vlan227": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "227" + }, + "Vlan228": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "228" + }, + "Vlan229": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "229" + }, + "Vlan230": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "230" + }, + "Vlan231": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "231" + }, + "Vlan232": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "232" + }, + "Vlan233": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "233" + }, + "Vlan234": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "234" + }, + "Vlan235": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "235" + }, + "Vlan236": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "236" + }, + "Vlan237": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "237" + }, + "Vlan238": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "238" + }, + "Vlan239": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "239" + }, + "Vlan240": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "240" + }, + "Vlan241": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "241" + }, + "Vlan242": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "242" + }, + "Vlan243": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "243" + }, + "Vlan244": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "244" + }, + "Vlan245": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "245" + }, + "Vlan246": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "246" + }, + "Vlan247": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "247" + }, + "Vlan248": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "248" + }, + "Vlan249": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "249" + }, + "Vlan250": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "250" + }, + "Vlan251": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "251" + }, + "Vlan252": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "252" + }, + "Vlan253": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "253" + }, + "Vlan254": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "254" + }, + "Vlan255": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "255" + }, + "Vlan256": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "256" + }, + "Vlan257": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "257" + }, + "Vlan258": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "258" + }, + "Vlan259": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "259" + }, + "Vlan260": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "260" + }, + "Vlan261": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "261" + }, + "Vlan262": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "262" + }, + "Vlan263": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "263" + }, + "Vlan264": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "264" + }, + "Vlan265": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "265" + }, + "Vlan266": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "266" + }, + "Vlan267": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "267" + }, + "Vlan268": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "268" + }, + "Vlan269": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "269" + }, + "Vlan270": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "270" + }, + "Vlan271": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "271" + }, + "Vlan272": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "272" + }, + "Vlan273": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "273" + }, + "Vlan274": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "274" + }, + "Vlan275": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "275" + }, + "Vlan276": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "276" + }, + "Vlan277": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "277" + }, + "Vlan278": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "278" + }, + "Vlan279": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "279" + }, + "Vlan280": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "280" + }, + "Vlan281": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "281" + }, + "Vlan282": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "282" + }, + "Vlan283": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "283" + }, + "Vlan284": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "284" + }, + "Vlan285": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "285" + }, + "Vlan286": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "286" + }, + "Vlan287": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "287" + }, + "Vlan288": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "288" + }, + "Vlan289": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "289" + }, + "Vlan290": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "290" + }, + "Vlan291": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "291" + }, + "Vlan292": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "292" + }, + "Vlan293": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "293" + }, + "Vlan294": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "294" + }, + "Vlan295": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "295" + }, + "Vlan296": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "296" + }, + "Vlan297": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "297" + }, + "Vlan298": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "298" + }, + "Vlan299": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "299" + }, + "Vlan300": { + "members": [ + "Ethernet4", + "Ethernet108", + "Ethernet124" + ], + "vlanid": "300" + } + } +} diff --git a/src/cvl/tests/create_acl_table.json b/src/cvl/tests/create_acl_table.json new file mode 100644 index 0000000000..604be2e2d2 --- /dev/null +++ b/src/cvl/tests/create_acl_table.json @@ -0,0 +1,8 @@ +{ +"ACL_TABLE": { + "TestACL1": { + "stage": "INGRESS", + "type": "L3" + } + } +} diff --git a/src/cvl/tests/cv_acl.go b/src/cvl/tests/cv_acl.go new file mode 100644 index 0000000000..cb12c0109b --- /dev/null +++ b/src/cvl/tests/cv_acl.go @@ -0,0 +1,443 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package main + +import ( + "fmt" + "time" + "os" + "cvl" + "github.com/go-redis/redis" + "strconv" +) + +func getConfigDbClient() *redis.Client { + rclient := redis.NewClient(&redis.Options{ + Addr: "localhost:6379", + Password: "", // no password set + DB: 4, + DialTimeout: 0, + }) + _, err := rclient.Ping().Result() + if err != nil { + fmt.Printf("failed to connect to redis server %v", err) + } + return rclient +} + +/* Unloads the Config DB based on JSON File. */ +func unloadConfigDB(rclient *redis.Client, key string, data map[string]string) { + _, err := rclient.Del(key).Result() + + if err != nil { + fmt.Printf("Failed to delete for key %s, data %v, err %v", key, data, err) + } + +} + +/* Loads the Config DB based on JSON File. */ +func loadConfigDB(rclient *redis.Client, key string, data map[string]string) { + + dataTmp := make(map[string]interface{}) + + for k, v := range data { + dataTmp[k] = v + } + + _, err := rclient.HMSet(key, dataTmp).Result() + + if err != nil { + fmt.Printf("Failed to add for key %s, data %v, err %v", key, data, err) + } + +} + +func main() { + start := time.Now() + count := 0 + + cvl.Initialize() + + if ((len(os.Args) > 1) && (os.Args[1] == "debug")) { + cvl.Debug(true) + } + + rclient := getConfigDbClient() + + if ((len(os.Args) > 1) && (os.Args[1] == "add")) { + + //Add ACL + aclNoStart, _ := strconv.Atoi(os.Args[2]) + aclNoEnd, _ := strconv.Atoi(os.Args[3]) + for aclNum:= aclNoStart ;aclNum <= aclNoEnd; aclNum++ { + aclNo := fmt.Sprintf("%d", aclNum) + + cvSess, _ := cvl.ValidationSessOpen() + + cfgDataAclRule := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + fmt.Sprintf("ACL_TABLE|TestACL%s", aclNo), + map[string]string { + "stage": "INGRESS", + "type": "L3", + //"ports@": "Ethernet0", + }, + }, + } + + _, ret := cvSess.ValidateEditConfig(cfgDataAclRule) + + if (ret != cvl.CVL_SUCCESS) { + fmt.Printf("Validation failure\n") + return + } + + cfgDataAclRule[0].VType = cvl.VALIDATE_NONE + + //Create 7 ACL rules + for i:=0; i<7; i++ { + cfgDataAclRule = append(cfgDataAclRule, cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + fmt.Sprintf("ACL_RULE|TestACL%s|Rule%d", aclNo, i+1), + map[string]string { + "PACKET_ACTION": "FORWARD", + "IP_TYPE": "IPV4", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": fmt.Sprintf("%d", 201 + i), + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT": fmt.Sprintf("%d", 701 + i), + }, + }) + + _, ret1 := cvSess.ValidateEditConfig(cfgDataAclRule) + if (ret1 != cvl.CVL_SUCCESS) { + fmt.Printf("Validation failure\n") + return + } + + cfgDataAclRule[1 + i].VType = cvl.VALIDATE_NONE + } + + //Write to DB + for _, cfgDataItem := range cfgDataAclRule { + loadConfigDB(rclient, cfgDataItem.Key, cfgDataItem.Data) + } + + cvl.ValidationSessClose(cvSess) + } + + return + } else if ((len(os.Args) > 1) && (os.Args[1] == "del")) { + aclNoStart, _ := strconv.Atoi(os.Args[2]) + aclNoEnd, _ := strconv.Atoi(os.Args[3]) + for aclNum:= aclNoStart ;aclNum <= aclNoEnd; aclNum++ { + aclNo := fmt.Sprintf("%d", aclNum) + cvSess,_ := cvl.ValidationSessOpen() + + //Delete ACL + + cfgDataAclRule := []cvl.CVLEditConfigData{} + + //Create 7 ACL rules + for i:=0; i<7; i++ { + cfgDataAclRule = append(cfgDataAclRule, cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + fmt.Sprintf("ACL_RULE|TestACL%s|Rule%d", aclNo, i+1), + map[string]string { + }, + }) + + _, ret := cvSess.ValidateEditConfig(cfgDataAclRule) + if (ret != cvl.CVL_SUCCESS) { + fmt.Printf("Validation failure\n") + return + } + + cfgDataAclRule[i].VType = cvl.VALIDATE_NONE + } + + cfgDataAclRule = append(cfgDataAclRule, cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + fmt.Sprintf("ACL_TABLE|TestACL%s", aclNo), + map[string]string { + }, + }) + + _, ret := cvSess.ValidateEditConfig(cfgDataAclRule) + if (ret != cvl.CVL_SUCCESS) { + fmt.Printf("Validation failure\n") + return + } + + //Write to DB + for _, cfgDataItem := range cfgDataAclRule { + unloadConfigDB(rclient, cfgDataItem.Key, cfgDataItem.Data) + } + + cvl.ValidationSessClose(cvSess) + } + + return + } + + cv, ret := cvl.ValidationSessOpen() + if (ret != cvl.CVL_SUCCESS) { + fmt.Printf("Could not create CVL session") + return + } + + { + count++ + jsonData :=`{ + "ACL_TABLE": { + "TestACL1": { + "stage": "INGRESS", + "type": "L3" + }, + "TestACL2": { + "stage": "EGRESS", + "ports": "Ethernet4" + } + } + }` + + fmt.Printf("\nValidating data = %v\n\n", jsonData); + + err := cv.ValidateConfig(jsonData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + jsonData :=`{ + "ACL_TABLE": { + "TestACL2": { + "stage": "EGRESS", + "ports": "Ethernet804" + } + } + }` + + + fmt.Printf("\nValidating data for external dependency check = %v\n\n", jsonData); + + err := cv.ValidateConfig(jsonData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + jsonData :=`{ + "ACL_TABLE": { + "TestACL1": { + "type": "L3" + } + } + }` + + + fmt.Printf("\nValidating data for mandatory element misssing = %v\n\n", jsonData); + + err := cv.ValidateConfig(jsonData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + jsonData :=`{ + "ACL_TABLE": { + "TestACL1": { + "stage": "INGRESS", + "type": "L3" + } + }, + "ACL_RULE": { + "TestACL1|Rule1": { + "PACKET_ACTION": "FORWARD", + "IP_PROTOCOL": "103", + "SRC_IP": "10.1.1.1/32", + "DST_IP": "20.2.2.2/32" + } + } + }` + + + + fmt.Printf("\nValidating data for internal dependency check = %v\n\n", jsonData); + + err := cv.ValidateConfig(jsonData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + jsonData :=`{ + "ACL_TABLE": { + "TestACL1": { + "stage": "INGRESS", + "type": "L3" + } + }, + "ACL_RULE": { + "TestACL1|Rule1": { + "PACKET_ACTION": "FORWARD", + "IP_PROTOCOL": "103" + } + } + }` + + + + fmt.Printf("\nValidating data for mandatory element check = %v\n\n", jsonData); + + err := cv.ValidateConfig(jsonData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + jsonData :=`{ + "ACL_TABLE": { + "TestACL1": { + "stage": "INGRESS", + "type": "L3" + } + }, + "ACL_RULE": { + "TestACL1|Rule1": { + "PACKET_ACTION": "FORWARD", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32" + } + } + }` + + + + fmt.Printf("\nValidating data for mandatory element check = %v\n\n", jsonData); + + err := cv.ValidateConfig(jsonData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + jsonData :=`{ + "ACL_TABLE": { + "TestACL1": { + "stage": "INGRESS", + "type": "L3" + } + }, + "ACL_RULE": { + "TestACL1|Rule1": { + "PACKET_ACTION": "FORWARD", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": 8080, + "ETHER_TYPE":"0x0800", + "IP_PROTOCOL": "1", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000" + } + } + }` + + + + fmt.Printf("\nValidating data for pattern check = %v\n\n", jsonData); + + err := cv.ValidateConfig(jsonData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + jsonData :=`{ + "ACL_TABLE": { + "TestACL1": { + "stage": "INGRESS", + "type": "L3" + } + }, + "ACL_RULE": { + "TestACL1|Rule1": { + "PACKET_ACTION": "FORWARD", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "ABC", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000" + } + } + }` + + + + fmt.Printf("\nValidating data for type check = %v\n\n", jsonData); + + err := cv.ValidateConfig(jsonData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + + cvl.ValidationSessClose(cv) + + cvl.Finish() + + fmt.Printf("\n\n\n Time taken for %v requests = %v\n", count, time.Since(start)) +} diff --git a/src/cvl/tests/cv_edit_op.go b/src/cvl/tests/cv_edit_op.go new file mode 100644 index 0000000000..a9035bcf51 --- /dev/null +++ b/src/cvl/tests/cv_edit_op.go @@ -0,0 +1,192 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package main + +import ( + "fmt" + "time" + "os" + "cvl" +) + +func main() { + start := time.Now() + count := 0 + + cvl.Initialize() + cv, _ := cvl.ValidationSessOpen() + + if ((len(os.Args) > 1) && (os.Args[1] == "debug")) { + cvl.Debug(true) + } + + { + count++ + + cfgData := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "ACL_TABLE|TestACL1", + map[string]string { + "stage": "INGRESS", + "type": "L3", + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "ACL_RULE|TestACL1|Rule1", + map[string]string { + "PACKET_ACTION": "FORWARD", + "SRC_IP": "10.1.1.1/32", + "L4_SRC_PORT": "1909", + "IP_PROTOCOL": "103", + "DST_IP": "20.2.2.2/32", + "L4_DST_PORT_RANGE": "9000-12000", + }, + }, + } + + fmt.Printf("\n\n%d. Validating create data = %v\n\n", count, cfgData); + + _, err := cv.ValidateEditConfig(cfgData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + + cfgData := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_TABLE|MyACL11_ACL_IPV4", + map[string]string { + "stage": "INGRESS", + "type": "MIRROR", + }, + }, + } + + fmt.Printf("\n\n%d. Validating update data = %v\n\n", count, cfgData); + + _, err := cv.ValidateEditConfig(cfgData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + cfgData := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "MIRROR_SESSION|everflow", + map[string]string { + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2", + }, + }, + } + + fmt.Printf("\n\n%d. Validating create data = %v\n\n", count, cfgData); + _, err := cv.ValidateEditConfig(cfgData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + + count++ + cfgData = []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "MIRROR_SESSION|everflow", + map[string]string { + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2", + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_UPDATE, + "ACL_RULE|MyACL11_ACL_IPV4|RULE_1", + map[string]string { + "MIRROR_ACTION": "everflow", + }, + }, + } + + fmt.Printf("\n\n%d. Validating data for update = %v\n\n", count, cfgData); + + _, err = cv.ValidateEditConfig(cfgData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + + cfgData := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "MIRROR_SESSION|everflow", + map[string]string { + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "ACL_RULE|MyACL11_ACL_IPV4|RULE_1", + map[string]string { + }, + }, + } + + fmt.Printf("\n\n%d. Validating data for delete = %v\n\n", count, cfgData); + + _, err := cv.ValidateEditConfig(cfgData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + + cvl.ValidationSessClose(cv) + cvl.Finish() + + fmt.Printf("\n\n\n Time taken for %v requests = %v\n", count, time.Since(start)) +} diff --git a/src/cvl/tests/cv_vlan.go b/src/cvl/tests/cv_vlan.go new file mode 100644 index 0000000000..b230e86b5a --- /dev/null +++ b/src/cvl/tests/cv_vlan.go @@ -0,0 +1,448 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package main + + +import ( + "fmt" + "os" + "time" + "cvl" + "github.com/go-redis/redis" + "strconv" +) + +func getConfigDbClient() *redis.Client { + rclient := redis.NewClient(&redis.Options{ + Addr: "localhost:6379", + Password: "", // no password set + DB: 4, + DialTimeout: 0, + }) + _, err := rclient.Ping().Result() + if err != nil { + fmt.Printf("failed to connect to redis server %v", err) + } + return rclient +} + +/* Unloads the Config DB based on JSON File. */ +func unloadConfigDB(rclient *redis.Client, key string, data map[string]string) { + _, err := rclient.Del(key).Result() + + if err != nil { + fmt.Printf("Failed to delete for key %s, data %v, err %v", key, data, err) + } + +} + +/* Loads the Config DB based on JSON File. */ +func loadConfigDB(rclient *redis.Client, key string, data map[string]string) { + + dataTmp := make(map[string]interface{}) + + for k, v := range data { + dataTmp[k] = v + } + + _, err := rclient.HMSet(key, dataTmp).Result() + + if err != nil { + fmt.Printf("Failed to add for key %s, data %v, err %v", key, data, err) + } + +} + +func main() { + start := time.Now() + count := 0 + + cvl.Initialize() + if ((len(os.Args) > 1) && (os.Args[1] == "debug")) { + cvl.Debug(true) + } + + rclient := getConfigDbClient() + + if ((len(os.Args) > 1) && (os.Args[1] == "add")) { + + //Add ACL + vlanNoStart, _ := strconv.Atoi(os.Args[2]) + vlanNoEnd, _ := strconv.Atoi(os.Args[3]) + for vlanNum:= vlanNoStart ;vlanNum <= vlanNoEnd; vlanNum++ { + cvSess, _ := cvl.ValidationSessOpen() + + cfgDataVlan := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + fmt.Sprintf("VLAN|Vlan%d", vlanNum), + map[string]string { + "vlanid": fmt.Sprintf("%d", vlanNum), + "members@": "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28", + }, + }, + } + + _, ret := cvSess.ValidateEditConfig(cfgDataVlan) + + if (ret != cvl.CVL_SUCCESS) { + fmt.Printf("Validation failure\n") + return + } + + cfgDataVlan[0].VType = cvl.VALIDATE_NONE + + for i:=0; i<7; i++ { + cfgDataVlan = append(cfgDataVlan, cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + fmt.Sprintf("VLAN_MEMBER|Vlan%d|Ethernet%d", vlanNum, i * 4), + map[string]string { + "tagging_mode" : "tagged", + }, + }) + + _, ret1 := cvSess.ValidateEditConfig(cfgDataVlan) + if (ret1 != cvl.CVL_SUCCESS) { + fmt.Printf("Validation failure\n") + return + } + + cfgDataVlan[1 + i].VType = cvl.VALIDATE_NONE + } + + //Write to DB + for _, cfgDataItem := range cfgDataVlan { + loadConfigDB(rclient, cfgDataItem.Key, cfgDataItem.Data) + } + + cvl.ValidationSessClose(cvSess) + } + + return + } else if ((len(os.Args) > 1) && (os.Args[1] == "del")) { + vlanNoStart, _ := strconv.Atoi(os.Args[2]) + vlanNoEnd, _ := strconv.Atoi(os.Args[3]) + for vlanNum:= vlanNoStart ;vlanNum <= vlanNoEnd; vlanNum++ { + cvSess,_ := cvl.ValidationSessOpen() + + //Delete ACL + + cfgDataVlan := []cvl.CVLEditConfigData{} + + //Create 7 ACL rules + for i:=0; i<7; i++ { + cfgDataVlan = append(cfgDataVlan, cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + fmt.Sprintf("VLAN_MEMBER|Vlan%d|Ethernet%d", vlanNum, i * 4), + map[string]string { + }, + }) + + _, ret := cvSess.ValidateEditConfig(cfgDataVlan) + if (ret != cvl.CVL_SUCCESS) { + fmt.Printf("Validation failure\n") + //return + } + + cfgDataVlan[i].VType = cvl.VALIDATE_NONE + } + + cfgDataVlan = append(cfgDataVlan, cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + fmt.Sprintf("VLAN|Vlan%d", vlanNum), + map[string]string { + }, + }) + + _, ret := cvSess.ValidateEditConfig(cfgDataVlan) + if (ret != cvl.CVL_SUCCESS) { + fmt.Printf("Validation failure\n") + //return + } + + //Write to DB + for _, cfgDataItem := range cfgDataVlan { + unloadConfigDB(rclient, cfgDataItem.Key, cfgDataItem.Data) + } + + cvl.ValidationSessClose(cvSess) + } + return + } + cv, ret := cvl.ValidationSessOpen() + if (ret != cvl.CVL_SUCCESS) { + fmt.Printf("NewDB: Could not create CVL session") + return + } + + { + count++ + keyData := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL|ch1", + map[string]string { + "admin_status": "up", + "mtu": "9100", + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL|ch2", + map[string]string { + "admin_status": "up", + "mtu": "9100", + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL_MEMBER|ch1|Ethernet4", + map[string]string { + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL_MEMBER|ch1|Ethernet8", + map[string]string { + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL_MEMBER|ch2|Ethernet12", + map[string]string { + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL_MEMBER|ch2|Ethernet16", + map[string]string { + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_NONE, + cvl.OP_NONE, + "PORTCHANNEL_MEMBER|ch2|Ethernet20", + map[string]string { + }, + }, + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_CREATE, + "VLAN|Vlan1001", + map[string]string { + "vlanid": "1001", + "members@": "Ethernet24,ch1,Ethernet8", + }, + }, + } + + fmt.Printf("\nValidating data for must = %v\n\n", keyData); + + _, err := cv.ValidateEditConfig(keyData) + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + + } + + { + keyData := []cvl.CVLEditConfigData { + cvl.CVLEditConfigData { + cvl.VALIDATE_ALL, + cvl.OP_DELETE, + "ACL_TABLE|MyACL1_ACL_IPV4", + map[string]string { + "type": "L3", + }, + }, + } + + _, err := cv.ValidateEditConfig(keyData) + + fmt.Printf("\nValidating field delete...\n\n"); + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + + } + + { + count++ + jsonData :=`{ + "VLAN": { + "Vlan100": { + "members": [ + "Ethernet44", + "Ethernet64" + ], + "vlanid": "100" + } + } + }` + + + err := cv.ValidateConfig(jsonData) + + fmt.Printf("\nValidating data = %v\n\n", jsonData); + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + + { + count++ + jsonData :=`{ + "VLAN": { + "Vln100": { + "members": [ + "Ethernet44", + "Ethernet64" + ], + "vlanid": "100" + } + } + }` + + + err := cv.ValidateConfig(jsonData) + + fmt.Printf("\nValidating data for key syntax = %v\n\n", jsonData); + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + + { + count++ + jsonData :=`{ + "VLAN": { + "Vlan4096": { + "members": [ + "Ethernet44", + "Ethernet64" + ], + "vlanid": "100" + } + } + }` + + + err := cv.ValidateConfig(jsonData) + + fmt.Printf("\nValidating data for range check = %v\n\n", jsonData); + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + jsonData :=`{ + "VLAN": { + "Vlan201": { + "members": [ + "Ethernet44", + "Ethernet64" + ], + "vlanid": "100" + } + } + }` + + + err := cv.ValidateConfig(jsonData) + + fmt.Printf("\nValidating data for internal dependency check = %v\n\n", jsonData); + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + { + count++ + /*jsonData :=`{ + "VLAN": { + "Vlan100": { + "members": [ + "Ethernet44", + "Ethernet964" + ], + "vlanid": "100" + }, + "Vlan1200": { + "members": [ + "Ethernet64", + "Ethernet1008" + ], + "vlanid": "1200" + } + } + }`*/ + jsonData :=`{ + "VLAN": { + "Vlan4095": { + "vlanid": "4995" + } + } + }` + + err := cv.ValidateConfig(jsonData) + + fmt.Printf("\nValidating data for external dependency check = %v\n\n", jsonData); + + if (err == cvl.CVL_SUCCESS) { + fmt.Printf("\nConfig Validation succeeded.\n\n"); + } else { + fmt.Printf("\nConfig Validation failed.\n\n"); + } + } + + cvl.ValidationSessClose(cv) + + cvl.Finish() + + fmt.Printf("\n\n\n Time taken for %v requests = %v\n", count, time.Since(start)) +} diff --git a/src/cvl/tests/run_test.sh b/src/cvl/tests/run_test.sh new file mode 100755 index 0000000000..e786ac0144 --- /dev/null +++ b/src/cvl/tests/run_test.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +profiling="" +testcase="" +coverpkgs="-coverpkg=cvl,cvl/internal/util,cvl/internal/yparser" + +if [ "${BUILD}:" != ":" ] ; then + go test -v -c -gcflags="all=-N -l" +fi + +if [ "${TESTCASE}:" != ":" ] ; then + testcase="-run ${TESTCASE}" +fi + +if [ "${PROFILE}:" != ":" ] ; then + profiling="-bench=. -benchmem -cpuprofile profile.out" +fi + +#Run test and display report +if [ "${NOREPORT}:" != ":" ] ; then + go test -v -cover ${coverpkgs} ${testcase} +elif [ "${COVERAGE}:" != ":" ] ; then + go test -v -cover -coverprofile coverage.out ${coverpkgs} ${testcase} + go tool cover -html=coverage.out +else + go test -v -cover -json ${profiling} ${testcase} | tparse -smallscreen -all +fi + +#With profiling +#go test -v -cover -json -bench=. -benchmem -cpuprofile profile.out | tparse -smallscreen -all + diff --git a/src/rest/Makefile b/src/rest/Makefile new file mode 100644 index 0000000000..f4f4d335d7 --- /dev/null +++ b/src/rest/Makefile @@ -0,0 +1,84 @@ +################################################################################ +# # +# Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or # +# its subsidiaries. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# # +################################################################################ + +TOPDIR ?= ../.. +ABS_TOPDIR ?= $(abspath $(TOPDIR)) +BUILD_DIR ?= $(TOPDIR)/build + +GO ?= go +GOPATH ?= $(ABS_TOPDIR)/gopkgs:$(ABS_TOPDIR):$(shell $(GO) env GOPATH) +GOROOT ?= $(shell $(GO) env GOROOT) + + +REST_BUILD_DIR := $(BUILD_DIR)/rest_server +REST_BIN := $(REST_BUILD_DIR)/main +REST_TEST_BIN := $(BUILD_DIR)/tests/rest/server.test + +ALL_GO_SRCS = $(shell find $(TOPDIR)/src -name '*.go' | grep -v '_test.go' | grep -v '/tests\?/') +REST_TEST_SRCS = $(shell find . -name '*_test.go') + +# Source files affecting REST server +REST_SRCS := $(ALL_GO_SRCS) \ + $(shell find $(TOPDIR)/models/yang -name '*.yang' | sort) \ + $(shell find $(TOPDIR)/models/openapi -name '*.yaml' | sort) + +REST_GOPATH := $(GOPATH):$(abspath $(REST_BUILD_DIR)/dist) + +# Certificate generator tool for generating temp certificates. +# Compiled from standard crypto/tls/generate_cert.go +CERTGEN_BIN := $(REST_BUILD_DIR)/generate_cert + + +# Default target +all: $(REST_BIN) $(CERTGEN_BIN) $(REST_TEST_BIN) + +$(REST_BUILD_DIR)/: + mkdir -p $@ + +# REST Server binary +# Invokes yang and model make to generate swagger artifcats. +$(REST_BIN): $(REST_SRCS) | $(REST_BUILD_DIR)/ + $(MAKE) -C $(TOPDIR)/models/yang + $(MAKE) -C $(TOPDIR)/models/yang/sonic + $(MAKE) -C $(TOPDIR)/models +ifeq ($(SONIC_COVERAGE_ON),y) + GOPATH=$(REST_GOPATH) $(GO) test -coverpkg=".././..." -c -o $@ main/main.go main/main_test.go +else + GOPATH=$(REST_GOPATH) $(GO) build -gcflags="all=-N -l" -v -o $@ main/main.go +endif + +# Gotest binary for REST Server +$(REST_TEST_BIN): $(REST_TEST_SRCS) $(ALL_GO_SRCS) | $(REST_BUILD_DIR)/ + GOPATH=$(REST_GOPATH) $(GO) test -cover -c rest/server -o $@ + +# Compile a certificate generator temporary certificates from +# standard crypto/tls/generate_cert.go file. Source file will be +# available in GOROOT/src. +$(CERTGEN_BIN): | $(REST_BUILD_DIR)/ + $(GO) build -o $@ $(GOROOT)/src/crypto/tls/generate_cert.go + +test: + GOPATH=$(REST_GOPATH) $(GO) test -cover -v rest/server + +clean: + $(MAKE) -C $(TOPDIR)/models clean + $(MAKE) -C $(TOPDIR)/models/yang clean + rm -f $(REST_BIN) $(CERTGEN_BIN) + rm -f $(REST_TEST_BIN) + diff --git a/src/rest/main/main.go b/src/rest/main/main.go new file mode 100644 index 0000000000..e44056c733 --- /dev/null +++ b/src/rest/main/main.go @@ -0,0 +1,206 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package main + +import ( + "crypto/tls" + "crypto/x509" + "flag" + "fmt" + "io/ioutil" + "net/http" + "os" + "os/signal" + "rest/server" + "swagger" + "syscall" + + "github.com/golang/glog" + "github.com/pkg/profile" +) + +// Command line parameters +var ( + port int // Server port + uiDir string // SwaggerUI directory + certFile string // Server certificate file path + keyFile string // Server private key file path + caFile string // Client CA certificate file path + clientAuth string // Client auth mode +) + +func init() { + // Parse command line + flag.IntVar(&port, "port", 443, "Listen port") + flag.StringVar(&uiDir, "ui", "/rest_ui", "UI directory") + flag.StringVar(&certFile, "cert", "", "Server certificate file path") + flag.StringVar(&keyFile, "key", "", "Server private key file path") + flag.StringVar(&caFile, "cacert", "", "CA certificate for client certificate validation") + flag.StringVar(&clientAuth, "client_auth", "none", "Client auth mode - none|cert|user") + flag.Parse() + // Suppress warning messages related to logging before flag parse + flag.CommandLine.Parse([]string{}) +} + +// Start REST server +func main() { + + /* Enable profiling by default. Send SIGUSR1 signal to rest_server to + * stop profiling and save data to /tmp/profile/cpu.pprof file. + * Copy over the cpu.pprof file and rest_server to a Linux host and run + * any of the following commands to generate a report in needed format. + * go tool pprof --txt ./rest_server ./cpu.pprof > report.txt + * go tool pprof --pdf ./rest_server ./cpu.pprof > report.pdf + * Note: install graphviz to generate the graph on a pdf format + */ + prof := profile.Start() + defer prof.Stop() + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGUSR1) + go func() { + <-sigs + prof.Stop() + }() + + swagger.Load() + + server.SetUIDirectory(uiDir) + + if clientAuth == "user" { + server.SetUserAuthEnable(true) + } + + router := server.NewRouter() + + address := fmt.Sprintf(":%d", port) + + // Prepare TLSConfig from the parameters + tlsConfig := tls.Config{ + ClientAuth: getTLSClientAuthType(), + Certificates: prepareServerCertificate(), + ClientCAs: prepareCACertificates(), + MinVersion: tls.VersionTLS12, + CurvePreferences: getPreferredCurveIDs(), + PreferServerCipherSuites: true, + CipherSuites: getPreferredCipherSuites(), + } + + // Prepare HTTPS server + restServer := &http.Server{ + Addr: address, + Handler: router, + TLSConfig: &tlsConfig, + } + + glog.Infof("Server started on %v", address) + glog.Infof("UI directory is %v", uiDir) + + // Start HTTPS server + glog.Fatal(restServer.ListenAndServeTLS("", "")) +} + +// prepareServerCertificate function parses --cert and --key parameter +// values. Both cert and private key PEM files are loaded into a +// tls.Certificate objects. Exits the process if files are not +// specified or not found or corrupted. +func prepareServerCertificate() []tls.Certificate { + if certFile == "" { + glog.Fatal("Server certificate file not specified") + } + + if keyFile == "" { + glog.Fatal("Server private key file not specified") + } + + glog.Infof("Server certificate file: %s", certFile) + glog.Infof("Server private key file: %s", keyFile) + + certificate, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + glog.Fatal("Failed to load server cert/key -- ", err) + } + + return []tls.Certificate{certificate} +} + +// prepareCACertificates function parses --ca parameter, which is the +// path to CA certificate file. Loads file contents to a x509.CertPool +// object. Returns nil if file name is empty (not specified). Exists +// the process if file path is invalid or file is corrupted. +func prepareCACertificates() *x509.CertPool { + if caFile == "" { // no CA file.. + return nil + } + + glog.Infof("Client CA certificate file: %s", caFile) + + caCert, err := ioutil.ReadFile(caFile) + if err != nil { + glog.Fatal("Failed to load CA certificate file -- ", err) + } + + caPool := x509.NewCertPool() + ok := caPool.AppendCertsFromPEM(caCert) + if !ok { + glog.Fatal("Invalid CA certificate") + } + + return caPool +} + +// getTLSClientAuthType function parses the --client_auth parameter. +// Returns corresponding tls.ClientAuthType value. Exits the process +// if value is not valid ('none', 'cert' or 'auth') +func getTLSClientAuthType() tls.ClientAuthType { + switch clientAuth { + case "none": + return tls.RequestClientCert + case "user": + return tls.RequestClientCert + case "cert": + if caFile == "" { + glog.Fatal("--cacert option is mandatory when --client_auth is 'cert'") + } + return tls.RequireAndVerifyClientCert + default: + glog.Fatalf("Invalid '--client_auth' value '%s'. "+ + "Expecting one of 'none', 'cert' or 'user'", clientAuth) + return tls.RequireAndVerifyClientCert // dummy + } +} + +func getPreferredCurveIDs() []tls.CurveID { + return []tls.CurveID{ + tls.CurveP521, + tls.CurveP384, + tls.CurveP256, + } +} + +func getPreferredCipherSuites() []uint16 { + return []uint16{ + tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, + tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + } +} diff --git a/src/rest/main/main_test.go b/src/rest/main/main_test.go new file mode 100644 index 0000000000..50ee1010da --- /dev/null +++ b/src/rest/main/main_test.go @@ -0,0 +1,38 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package main + +import ( + "fmt" + "os" + "os/signal" + "syscall" + "testing" +) + +func TestMain(t *testing.T) { + go main() + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGUSR1) + fmt.Println("Listening on sig kill from TestMain") + <-sigs + fmt.Println("Returning from TestMain on sig kill") +} + diff --git a/src/rest/server/context.go b/src/rest/server/context.go new file mode 100644 index 0000000000..883679e343 --- /dev/null +++ b/src/rest/server/context.go @@ -0,0 +1,190 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package server + +import ( + "context" + "fmt" + "mime" + "net/http" + "regexp" + "sync/atomic" +) + +// RequestContext holds metadata about REST request. +type RequestContext struct { + + // Unique reqiest id + ID string + + // Name represents the operationId from OpenAPI spec + Name string + + // "consumes" and "produces" data from OpenAPI spec + Consumes MediaTypes + Produces MediaTypes + + // Model holds pointer to the OpenAPI data model object for + // the body. When set, the request handler can validate the + // request payload by loading the body into this model object. + Model interface{} +} + +type contextkey int + +const requestContextKey contextkey = 0 + +// Request Id generator +var requestCounter uint64 + +// GetContext function returns the RequestContext object for a +// HTTP request. RequestContext is maintained as a context value of +// the request. Creates a new RequestContext object is not already +// available; in which case this function also creates a copy of +// the HTTP request object with new context. +func GetContext(r *http.Request) (*RequestContext, *http.Request) { + cv := r.Context().Value(requestContextKey) + if cv != nil { + return cv.(*RequestContext), r + } + + rc := new(RequestContext) + rc.ID = fmt.Sprintf("REST-%v", atomic.AddUint64(&requestCounter, 1)) + + r = r.WithContext(context.WithValue(r.Context(), requestContextKey, rc)) + return rc, r +} + +/////////// + +// MediaType represents the parsed media type value. Includes +// a MIME type string and optional parameters. +type MediaType struct { + Type string + Params map[string]string + + TypePrefix string + TypeSuffix string + TypeMiddle string +} + +// mediaTypeExpr is the regex to extract parts from media type string. +var mediaTypeExpr = regexp.MustCompile(`([^/]+)(?:/(?:([^+]+)\+)?(.+))?`) + +// Parse function parses a full media type value with parameters +// into this MediaType object. +func parseMediaType(value string) (*MediaType, error) { + if value == "" { + return nil, nil + } + + mtype, params, err := mime.ParseMediaType(value) + if err != nil { + return nil, err + } + + // Extract parts from the mime type + parts := mediaTypeExpr.FindStringSubmatch(mtype) + if parts[3] == "*" && parts[2] == "" { // for patterns like "text/*" + parts[2] = "*" + } + + return &MediaType{Type: mtype, Params: params, + TypePrefix: parts[1], TypeMiddle: parts[2], TypeSuffix: parts[3]}, nil +} + +// Format function returns the full media type string - including +// MIME type and parameters. +func (m *MediaType) Format() string { + return mime.FormatMediaType(m.Type, m.Params) +} + +// Matches verifies if this Mediatype matches the another MediaType. +func (m *MediaType) Matches(other *MediaType) bool { + return m.Type == other.Type || + (matchPart(m.TypePrefix, other.TypePrefix) && + matchPart(m.TypeMiddle, other.TypeMiddle) && + matchPart(m.TypeSuffix, other.TypeSuffix)) +} + +// isJSON function checks if this media type represents a json +// content. Uses the suffix part of media type string. +func (m *MediaType) isJSON() bool { + return m.TypeSuffix == "json" +} + +func matchPart(x, y string) bool { + return x == y || x == "*" || y == "*" +} + +////////// + +// MediaTypes is a collection of parsed media type values +type MediaTypes []MediaType + +// Add function parses and adds a media type to the MediaTypes +// object. Any parameters in the media type value are ignored. +func (m *MediaTypes) Add(mimeType string) error { + mtype, err := parseMediaType(mimeType) + if err == nil { + *m = append(*m, *mtype) + } + + return err +} + +// Contains function checks if a given media type value is +// present in the ContentTypes. Ignores the media type parameters. +func (m *MediaTypes) Contains(mimeType string) bool { + t, _, _ := mime.ParseMediaType(mimeType) + for _, entry := range *m { + if entry.Type == t { + return true + } + } + + return false +} + +// GetMatching returns registered full content type value +// matching a given hint. +func (m *MediaTypes) GetMatching(mimeType string) MediaTypes { + mtype, err := parseMediaType(mimeType) + if err != nil { + return nil // TODO return error + } + + var matchList MediaTypes + for _, entry := range *m { + if entry.Matches(mtype) { + matchList = append(matchList, entry) + } + } + + return matchList +} + +func (m MediaTypes) String() string { + types := make([]string, 0, len(m)) + for _, entry := range m { + types = append(types, entry.Type) + } + return fmt.Sprintf("%v", types) +} diff --git a/src/rest/server/context_test.go b/src/rest/server/context_test.go new file mode 100644 index 0000000000..1df7fc3857 --- /dev/null +++ b/src/rest/server/context_test.go @@ -0,0 +1,228 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package server + +import ( + "fmt" + "net/http" + "reflect" + "strings" + "testing" +) + +func init() { + fmt.Println("+++++ init context_test +++++") +} + +func TestGetContext(t *testing.T) { + r, err := http.NewRequest("GET", "/index.html", nil) + if err != nil { + t.Fatalf("Unexpected error; %v", err) + } + + idSufix := fmt.Sprintf("-%v", requestCounter+1) + + rc1, r := GetContext(r) + rc2, r := GetContext(r) + rc3, r := GetContext(r) + + if rc1 != rc2 || rc1 != rc3 { + t.Fatalf("Got duplicate contexts!!") + } + + if !strings.HasSuffix(rc1.ID, idSufix) { + t.Fatalf("Unexpected id '%s'; expected suffix '%s", rc1.ID, idSufix) + } +} + +func TestParseEmptyMtype(t *testing.T) { + m, e := parseMediaType("") + if m != nil || e != nil { + t.Errorf("Unexpected return values; m=%v, e=%v", m, e) + } +} + +func TestParseMtype(t *testing.T) { + t.Run("X/Y", testParseMtype("application/json", + "application/json", "application", "", "json", mkmap())) + + t.Run("X/Y+Z", testParseMtype("application/yang-data+json", + "application/yang-data+json", "application", "yang-data", "json", mkmap())) + + t.Run("X/Z; A=B", testParseMtype("application/xml; q=5", + "application/xml", "application", "", "xml", mkmap("q", "5"))) + + t.Run("X/Z; A=B; C=D", testParseMtype("application/xml; q=5; ver=0.1", + "application/xml", "application", "", "xml", mkmap("q", "5", "ver", "0.1"))) + + t.Run("*/*", testParseMtype("*/*", + "*/*", "*", "*", "*", mkmap())) + + t.Run("text/*", testParseMtype("text/*", + "text/*", "text", "*", "*", mkmap())) + + t.Run("*/xml", testParseMtype("*/xml", + "*/xml", "*", "", "xml", mkmap())) + + t.Run("text/*+xml", testParseMtype("text/*+xml", + "text/*+xml", "text", "*", "xml", mkmap())) + + // invalid media types + t.Run("Partial", testBadMtype("application/")) + t.Run("WithSpace", testBadMtype("app lication/json")) + t.Run("WithSpace2", testBadMtype("application/ json")) + t.Run("BadParam", testBadMtype("application/json;q=10 x=20")) +} + +func testParseMtype(v, mimeType, prefix, middle, suffix string, params map[string]string) func(*testing.T) { + return func(t *testing.T) { + m := toMtype(t, v) + if m.Type != mimeType || m.TypePrefix != prefix || + m.TypeMiddle != middle || m.TypeSuffix != suffix || + reflect.DeepEqual(m.Params, params) == false { + t.Fatalf("\"%s\" did not tokenize into mime=\"%s\", prefix=\"%s\", middle=\"%s\", suffix=\"%s\", params=%v", + v, mimeType, prefix, middle, suffix, params) + } + if m.Format() != v { + t.Logf("Could not reconstruct \"%s\" from %v", v, m) + } + } +} + +func testBadMtype(v string) func(*testing.T) { + return func(t *testing.T) { + _, e := parseMediaType(v) + if e == nil { + t.Errorf("Invalid media type \"%s\" not flagged", v) + } + } +} + +func toMtype(t *testing.T, v string) *MediaType { + m, e := parseMediaType(v) + if e != nil { + t.Fatalf("Bad media type \"%s\"; err=%v", v, e) + } + return m +} + +func mkmap(args ...string) map[string]string { + m := make(map[string]string) + for i := 0; i < len(args); i += 2 { + m[args[i]] = args[i+1] + } + return m +} + +func TestMtypeMatch(t *testing.T) { + t.Run("A/B=~A/B", testMtypeMatch("text/json", "text/json", true)) + t.Run("A/B!~A/C", testMtypeMatch("text/json", "text/xml", false)) + t.Run("A/B!~C/B", testMtypeMatch("text/json", "new/json", false)) + t.Run("A/B=~*/*", testMtypeMatch("text/json", "*/*", true)) + t.Run("A/B=~A/*", testMtypeMatch("text/json", "text/*", true)) + t.Run("A/B=~*/B", testMtypeMatch("text/json", "*/json", true)) + t.Run("A/B!~*/C+B", testMtypeMatch("text/json", "*/new+json", false)) + t.Run("A/B!~*/B+*", testMtypeMatch("text/json", "*/json+*", false)) + t.Run("A/B=~A/*+B", testMtypeMatch("text/json", "text/*+json", true)) + t.Run("A/B=~A/*+*", testMtypeMatch("text/json", "text/*+*", true)) + t.Run("A/V+B=~A/V+B", testMtypeMatch("text/v1+json", "text/v1+json", true)) + t.Run("A/V+B=~A/V+*", testMtypeMatch("text/v1+json", "text/v1+*", true)) + t.Run("A/V+B=~A/*+B", testMtypeMatch("text/v1+json", "text/*+json", true)) + t.Run("A/V+B=~A/*", testMtypeMatch("text/v1+json", "text/*", true)) + t.Run("A/V+B=~*/*", testMtypeMatch("text/v1+json", "*/*", true)) + t.Run("A/V+B!~A/B", testMtypeMatch("text/v1+json", "text/json", false)) +} + +func testMtypeMatch(lhs, rhs string, exp bool) func(*testing.T) { + return func(t *testing.T) { + x := toMtype(t, lhs) + y := toMtype(t, rhs) + if x.Matches(y) != exp { + t.Fatalf("condition failed: \"%s\" match \"%s\" == %v", lhs, rhs, exp) + } + } +} + +func TestIsJSON(t *testing.T) { + t.Run("A/json", testIsJSON("text/json", true)) + t.Run("A/V+json", testIsJSON("text/v1+json", true)) + t.Run("A/json+V", testIsJSON("text/json+V", false)) + t.Run("A/xml", testIsJSON("text/xml", false)) + t.Run("json/A", testIsJSON("json/text", false)) +} + +func testIsJSON(v string, exp bool) func(*testing.T) { + return func(t *testing.T) { + m := toMtype(t, v) + if m.isJSON() != exp { + t.Fatalf("condition failed: isJson(\"%s\") == %v", v, exp) + } + } +} + +func TestMtypes(t *testing.T) { + var m MediaTypes + + // add 3 values to MediaTypes + m.Add("text/xml; q=5") + m.Add("text/json; q=2; r=3") + m.Add("text/v1+json") + + // check length + if len(m) != 3 { + t.Fatalf("Expected 3 items; found %d", len(m)) + } + + // check String() + expStrValue := "[text/xml text/json text/v1+json]" + if m.String() != expStrValue { + t.Fatalf("String() check failed.. expected \"%s\"; found \"%s\"", expStrValue, m) + } + + // check Contains() + t.Run("Contains#1", testMtypesContains(m, "text/xml", true)) + t.Run("Contains#2", testMtypesContains(m, "text/json", true)) + t.Run("Contains#3", testMtypesContains(m, "text/v1+json", true)) + t.Run("NotContains", testMtypesContains(m, "text/plain", false)) + + // check GetMatching() + t.Run("Match 1", testMtypesGetMatching(m, "text/xml", "[text/xml]")) + t.Run("Match 2", testMtypesGetMatching(m, "text/*+json", "[text/json text/v1+json]")) + t.Run("Match 0", testMtypesGetMatching(m, "text/plain", "[]")) + t.Run("Match Err", testMtypesGetMatching(m, "text plain", "[]")) +} + +func testMtypesContains(m MediaTypes, v string, exp bool) func(*testing.T) { + return func(t *testing.T) { + if m.Contains(v) != exp { + t.Fatalf("condition failed: %v.Contains(\"%s\") == %v", m, v, exp) + } + } +} + +func testMtypesGetMatching(m MediaTypes, v, exp string) func(*testing.T) { + return func(t *testing.T) { + m1 := m.GetMatching(v) + if m1.String() != exp { + t.Logf("Items matching \"%s\" from %s are %s", v, m, m1) + t.Fatalf("Expected %s", exp) + } + } +} diff --git a/src/rest/server/error.go b/src/rest/server/error.go new file mode 100644 index 0000000000..0335e70eac --- /dev/null +++ b/src/rest/server/error.go @@ -0,0 +1,202 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package server + +import ( + "encoding/json" + "fmt" + "net/http" + + "cvl" + "translib/tlerr" +) + +// errorResponse defines the RESTCONF compliant error response +// payload. It includes a list of errorEntry object. +type errorResponse struct { + Err struct { + Arr []errorEntry `json:"error"` + } `json:"ietf-restconf:errors"` +} + +// errorEntry defines the RESTCONF compilant error information +// payload. +type errorEntry struct { + Type errtype `json:"error-type"` + Tag errtag `json:"error-tag"` + AppTag string `json:"error-app-tag,omitempty"` + Path string `json:"error-path,omitempty"` + Message string `json:"error-message,omitempty"` +} + +type errtype string +type errtag string + +const ( + // error-type values + errtypeProtocol errtype = "protocol" + errtypeApplication errtype = "application" + + // error-tag values + errtagInvalidValue errtag = "invalid-value" + errtagOperationFailed errtag = "operation-failed" + errtagOperationNotSupported errtag = "operation-not-supported" + errtagAccessDenied errtag = "access-denied" + errtagResourceDenied errtag = "resource-denied" + errtagInUse errtag = "in-use" + errtagMalformedMessage errtag = "malformed-message" +) + +// httpErrorType is an error structure for indicating HTTP protocol +// errors. Includes HTTP status code and user displayable message. +type httpErrorType struct { + status int + message string +} + +func (e httpErrorType) Error() string { + return e.message +} + +func httpError(status int, msg string, args ...interface{}) error { + return httpErrorType{ + status: status, + message: fmt.Sprintf(msg, args...)} +} + +func httpBadRequest(msg string, args ...interface{}) error { + return httpError(http.StatusBadRequest, msg, args...) +} + +func httpServerError(msg string, args ...interface{}) error { + return httpError(http.StatusInternalServerError, msg, args...) +} + +// prepareErrorResponse returns HTTP status code and response payload +// for an error object. Response payalod is formatted as per RESTCONF +// specification (RFC8040, section 7.1). Uses json encoding. +func prepareErrorResponse(err error, r *http.Request) (status int, data []byte, mimeType string) { + status, entry := toErrorEntry(err, r) + var resp errorResponse + resp.Err.Arr = append(resp.Err.Arr, entry) + data, _ = json.Marshal(&resp) + mimeType = "application/yang-data+json" + return +} + +// toErrorEntry translates an error object into HTTP status and an +// errorEntry object. +func toErrorEntry(err error, r *http.Request) (status int, errInfo errorEntry) { + // By default everything is 500 Internal Server Error + status = http.StatusInternalServerError + errInfo.Type = errtypeApplication + errInfo.Tag = errtagOperationFailed + + switch e := err.(type) { + case httpErrorType: + status = e.status + errInfo.Type = errtypeProtocol + errInfo.Message = e.message + + // Guess error app tag from http status code + switch status { + case http.StatusBadRequest: // 400 + errInfo.Tag = errtagInvalidValue + case http.StatusUnauthorized: // 401 + errInfo.Tag = errtagAccessDenied + case http.StatusForbidden: // 403 + errInfo.Tag = errtagAccessDenied + case http.StatusNotFound: // 404 + errInfo.Tag = errtagInvalidValue + case http.StatusMethodNotAllowed: // 405 + errInfo.Tag = errtagOperationNotSupported + case http.StatusUnsupportedMediaType: + errInfo.Tag = errtagInvalidValue + default: // 5xx and others + errInfo.Tag = errtagOperationFailed + } + + case tlerr.TranslibSyntaxValidationError: + status = http.StatusBadRequest + errInfo.Type = errtypeProtocol + errInfo.Tag = errtagInvalidValue + errInfo.Message = e.ErrorStr.Error() + + case tlerr.TranslibRedisClientEntryNotExist: + status = http.StatusNotFound + errInfo.Tag = errtagInvalidValue + errInfo.Message = "Entry not found" + + case tlerr.TranslibCVLFailure: + status = http.StatusInternalServerError + errInfo.Tag = errtagInvalidValue + errInfo.Message = e.CVLErrorInfo.ConstraintErrMsg + errInfo.AppTag = e.CVLErrorInfo.ErrAppTag + + switch cvl.CVLRetCode(e.Code) { + case cvl.CVL_SEMANTIC_KEY_ALREADY_EXIST, cvl.CVL_SEMANTIC_KEY_DUPLICATE: + status = http.StatusConflict + errInfo.Tag = errtagResourceDenied + errInfo.Message = "Entry already exists" + + case cvl.CVL_SEMANTIC_KEY_NOT_EXIST: + status = http.StatusNotFound + errInfo.Tag = errtagInvalidValue + errInfo.Message = "Entry not found" + } + + case tlerr.TranslibTransactionFail: + status = http.StatusConflict + errInfo.Type = errtypeProtocol + errInfo.Tag = errtagInUse + errInfo.Message = "Transaction failed. Please try again." + + case tlerr.InternalError: + errInfo.Message = e.Error() + errInfo.Path = e.Path + + case tlerr.NotSupportedError: + status = http.StatusMethodNotAllowed + errInfo.Tag = errtagOperationNotSupported + errInfo.Message = e.Error() + errInfo.Path = e.Path + + case tlerr.InvalidArgsError: + status = http.StatusBadRequest + errInfo.Tag = errtagInvalidValue + errInfo.Message = e.Error() + errInfo.Path = e.Path + + case tlerr.NotFoundError: + status = http.StatusNotFound + errInfo.Tag = errtagInvalidValue + errInfo.Message = e.Error() + errInfo.Path = e.Path + + case tlerr.AlreadyExistsError: + status = http.StatusConflict + errInfo.Tag = errtagResourceDenied + errInfo.Message = e.Error() + errInfo.Path = e.Path + + } + + return +} diff --git a/src/rest/server/error_test.go b/src/rest/server/error_test.go new file mode 100644 index 0000000000..7dfdfce3df --- /dev/null +++ b/src/rest/server/error_test.go @@ -0,0 +1,229 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package server + +import ( + "errors" + "fmt" + "strings" + "testing" + + "cvl" + "translib/tlerr" +) + +func init() { + fmt.Println("+++++ init error_test +++++") +} + +func TestProtoError(t *testing.T) { + t.Run("400", testProtoError( + httpBadRequest("Bad %s", "json"), 400, "Bad json")) + + t.Run("500", testProtoError( + httpServerError("Failed"), 500, "Failed")) + + t.Run("XXX", testProtoError( + httpError(401, "Invalid user"), 401, "Invalid user")) +} + +func testProtoError(err error, status int, msg string) func(*testing.T) { + return func(t *testing.T) { + e, ok := err.(httpErrorType) + if !ok { + t.Error("not a httpErrorType") + } else if e.status != status || chkmsg(e.message, msg) == false { + t.Errorf("expecting %d/'%s'; found %d/'%s'", + status, msg, e.status, e.message) + } + } +} + +func TestErrorEntry(t *testing.T) { + + // errorEntry mapping for server errors + + t.Run("RequestReadError", testErrorEntry( + httpBadRequest("hii"), + 400, "protocol", "invalid-value", "", "hii")) + + t.Run("GenericServerError", testErrorEntry( + httpServerError("hii"), + 500, "protocol", "operation-failed", "", "hii")) + + t.Run("AuthenticationFailed", testErrorEntry( + httpError(401, "hii"), + 401, "protocol", "access-denied", "", "hii")) + + t.Run("AuthorizationFailed", testErrorEntry( + httpError(403, "hii"), + 403, "protocol", "access-denied", "", "hii")) + + t.Run("NotFound", testErrorEntry( + httpError(404, "404 NotFound."), + 404, "protocol", "invalid-value", "", "404 NotFound.")) + + t.Run("NotSupported", testErrorEntry( + httpError(405, "405 NotSupported."), + 405, "protocol", "operation-not-supported", "", "405 NotSupported.")) + + t.Run("UnknownMediaType", testErrorEntry( + httpError(415, "hii"), + 415, "protocol", "invalid-value", "", "hii")) + + // errorEntry mapping for unknown errors + + t.Run("UnknownError", testErrorEntry( + errors.New("hii"), + 500, "application", "operation-failed", "", "")) + + // errorEntry mapping for app errors + + t.Run("InvalidArgs", testErrorEntry( + tlerr.InvalidArgsError{Format: "hii", Path: "xyz"}, + 400, "application", "invalid-value", "xyz", "hii")) + + t.Run("ResourceNotFound", testErrorEntry( + tlerr.NotFoundError{Format: "hii", Path: "xyz"}, + 404, "application", "invalid-value", "xyz", "hii")) + + t.Run("AlreadyExists", testErrorEntry( + tlerr.AlreadyExistsError{Format: "hii", Path: "xyz"}, + 409, "application", "resource-denied", "xyz", "hii")) + + t.Run("UnsupportedOper", testErrorEntry( + tlerr.NotSupportedError{Format: "hii", Path: "xyz"}, + 405, "application", "operation-not-supported", "xyz", "hii")) + + t.Run("AppGenericErr", testErrorEntry( + tlerr.InternalError{Format: "hii", Path: "xyz"}, + 500, "application", "operation-failed", "xyz", "hii")) + + // errorEntry mapping for DB errors + + t.Run("DB_EntryNotExist", testErrorEntry( + tlerr.TranslibRedisClientEntryNotExist{}, + 404, "application", "invalid-value", "", "Entry not found")) + + t.Run("TransactionFailed", testErrorEntry( + tlerr.TranslibTransactionFail{}, + 409, "protocol", "in-use", "", "*")) + + t.Run("DB_CannotOpen", testErrorEntry( + tlerr.TranslibDBCannotOpen{}, + 500, "application", "operation-failed", "", "")) + + t.Run("DB_NotInit", testErrorEntry( + tlerr.TranslibDBNotInit{}, + 500, "application", "operation-failed", "", "")) + + t.Run("DB_SubscribeFailed", testErrorEntry( + tlerr.TranslibDBSubscribeFail{}, + 500, "application", "operation-failed", "", "")) + + // errorEntry mapping for CVL errors + + t.Run("CVL_KeyNotExists", testErrorEntry( + cvlError(cvl.CVL_SEMANTIC_KEY_NOT_EXIST, "hii"), + 404, "application", "invalid-value", "", "Entry not found")) + + t.Run("CVL_KeyExists", testErrorEntry( + cvlError(cvl.CVL_SEMANTIC_KEY_ALREADY_EXIST, "hii"), + 409, "application", "resource-denied", "", "Entry already exists")) + + t.Run("CVL_KeyDup", testErrorEntry( + cvlError(cvl.CVL_SEMANTIC_KEY_DUPLICATE, "hii"), + 409, "application", "resource-denied", "", "Entry already exists")) + + t.Run("CVL_SemanticErr", testErrorEntry( + cvlError(cvl.CVL_SEMANTIC_ERROR, "hii"), + 500, "application", "invalid-value", "", "hii")) + + // errorEntry mapping for YGOT errors + t.Run("YGOT_400", testErrorEntry( + tlerr.TranslibSyntaxValidationError{ErrorStr: errors.New("ygot")}, + 400, "protocol", "invalid-value", "", "ygot")) + +} + +func testErrorEntry(err error, + expStatus int, expType, expTag, expPath, expMessage string) func(*testing.T) { + return func(t *testing.T) { + status, entry := toErrorEntry(err, nil) + if status != expStatus || string(entry.Type) != expType || + string(entry.Tag) != expTag || entry.Path != expPath || + chkmsg(entry.Message, expMessage) == false { + t.Errorf("%T: expecting %d/%s/%s/\"%s\"/\"%s\"; found %d/%s/%s/\"%s\"/\"%s\"", + err, expStatus, expType, expTag, expPath, expMessage, + status, entry.Type, entry.Tag, entry.Path, entry.Message) + } + } +} + +func TestErrorResponse(t *testing.T) { + t.Run("WithMsg", testErrorResponse( + tlerr.NotFoundError{Format: "hii", Path: "xyz"}, + 404, "{\"ietf-restconf:errors\":{\"error\":[{"+ + "\"error-type\":\"application\",\"error-tag\":\"invalid-value\","+ + "\"error-path\":\"xyz\",\"error-message\":\"hii\"}]}}")) + + t.Run("NoMsg", testErrorResponse( + errors.New("hii"), + 500, "{\"ietf-restconf:errors\":{\"error\":[{"+ + "\"error-type\":\"application\",\"error-tag\":\"operation-failed\"}]}}")) +} + +func testErrorResponse(err error, expStatus int, expData string) func(*testing.T) { + return func(t *testing.T) { + status, data, ctype := prepareErrorResponse(err, nil) + + if status != expStatus { + t.Errorf("FAIL: bad status %d; expected %d", status, expStatus) + } else if ctype != "application/yang-data+json" { + t.Errorf("FAIL: bad content-type '%s'", ctype) + } else if string(data) != expData { + t.Errorf("FAIL: bad data %s", data) + t.Errorf("expected %s", expData) + } + } +} + +func chkmsg(actual, expected string) bool { + if expected == "*" { + return true + } + if strings.HasPrefix(expected, "!") { + return actual != expected[1:] + } + return actual == expected +} + +func cvlError(code cvl.CVLRetCode, msg string) error { + return tlerr.TranslibCVLFailure{ + Code: int(code), + CVLErrorInfo: cvl.CVLErrorInfo{ + ErrCode: code, + TableName: "unknown", + CVLErrDetails: "blah blah blah", + Msg: "ignore me", + ConstraintErrMsg: msg, + }, + } +} diff --git a/src/rest/server/handler.go b/src/rest/server/handler.go new file mode 100644 index 0000000000..5596c310f9 --- /dev/null +++ b/src/rest/server/handler.go @@ -0,0 +1,258 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package server + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "strings" + + "translib" + + "github.com/golang/glog" + "github.com/gorilla/mux" +) + +// Process function is the common landing place for all REST requests. +// Swagger code-gen should be configured to invoke this function +// from all generated stub functions. +func Process(w http.ResponseWriter, r *http.Request) { + rc, r := GetContext(r) + reqID := rc.ID + path := r.URL.Path + + var status int + var data []byte + var rtype string + + glog.Infof("[%s] %s %s; content-len=%d", reqID, r.Method, path, r.ContentLength) + _, body, err := getRequestBody(r, rc) + if err != nil { + status, data, rtype = prepareErrorResponse(err, r) + goto write_resp + } + + path = getPathForTranslib(r) + glog.Infof("[%s] Translated path = %s", reqID, path) + + status, data, err = invokeTranslib(reqID, r.Method, path, body) + if err != nil { + glog.Errorf("[%s] Translib error %T - %v", reqID, err, err) + status, data, rtype = prepareErrorResponse(err, r) + goto write_resp + } + + rtype, err = resolveResponseContentType(data, r, rc) + if err != nil { + glog.Errorf("[%s] Failed to resolve response content-type, err=%v", rc.ID, err) + status, data, rtype = prepareErrorResponse(err, r) + goto write_resp + } + +write_resp: + glog.Infof("[%s] Sending response %d, type=%s, data=%s", reqID, status, rtype, data) + + // Write http response.. Following strict order should be + // maintained to form proper response. + // 1. Set custom headers via w.Header().Set("N", "V") + // 2. Set status code via w.WriteHeader(code) + // 3. Finally, write response body via w.Write(bytes) + if len(data) != 0 { + w.Header().Set("Content-Type", rtype) + w.WriteHeader(status) + w.Write([]byte(data)) + } else { + // No data, status only + w.WriteHeader(status) + } +} + +// getRequestBody returns the validated request body +func getRequestBody(r *http.Request, rc *RequestContext) (*MediaType, []byte, error) { + if r.ContentLength == 0 { + glog.Infof("[%s] No body", rc.ID) + return nil, nil, nil + } + + // read body + body, err := ioutil.ReadAll(r.Body) + if err != nil { + glog.Errorf("[%s] Failed to read body; err=%v", rc.ID, err) + return nil, nil, httpError(http.StatusInternalServerError, "") + } + + // Parse content-type header value + ctype := r.Header.Get("Content-Type") + + // Guess the contet type if client did not provide it + if ctype == "" { + glog.Infof("[%s] Content-type not provided in request. Guessing it...", rc.ID) + ctype = http.DetectContentType(body) + } + + ct, err := parseMediaType(ctype) + if err != nil { + glog.Errorf("[%s] Bad content-type '%s'; err=%v", + rc.ID, r.Header.Get("Content-Type"), err) + return nil, nil, httpBadRequest("Bad content-type") + } + + // Check if content type is one of the acceptable types specified + // in "consumes" section in OpenAPI spec. + if !rc.Consumes.Contains(ct.Type) { + glog.Errorf("[%s] Content-type '%s' not supported. Valid types %v", rc.ID, ct.Type, rc.Consumes) + return nil, nil, httpError(http.StatusUnsupportedMediaType, "Unsupported content-type") + } + + // Do payload validation if model info is set in the context. + if rc.Model != nil { + body, err = RequestValidate(body, ct, rc) + if err != nil { + return nil, nil, err + } + } + + glog.Infof("[%s] Content-type=%s; data=%s", rc.ID, ctype, body) + return ct, body, nil +} + +// resolveResponseContentType +func resolveResponseContentType(data []byte, r *http.Request, rc *RequestContext) (string, error) { + if len(data) == 0 { + return "", nil + } + + // If OpenAPI spec has only one "produces" option, assume that + // app module will return that exact type data!! + if len(rc.Produces) == 1 { + return rc.Produces[0].Format(), nil + } + + //TODO validate against Accept header + + return http.DetectContentType(data), nil +} + +// getPathForTranslib converts REST URIs into GNMI paths +func getPathForTranslib(r *http.Request) string { + // Return the URL path if no variables in the template.. + vars := mux.Vars(r) + if len(vars) == 0 { + return trimRestconfPrefix(r.URL.Path) + } + + path, err := mux.CurrentRoute(r).GetPathTemplate() + if err != nil { + glog.Infof("No path template for this route") + return trimRestconfPrefix(r.URL.Path) + } + + // Path is a template.. Convert it into GNMI style path + // WARNING: does not handle duplicate key attribute names + // + // Template = /openconfig-acl:acl/acl-sets/acl-set={name},{type} + // REST style = /openconfig-acl:acl/acl-sets/acl-set=TEST,ACL_IPV4 + // GNMI style = /openconfig-acl:acl/acl-sets/acl-set[name=TEST][type=ACL_IPV4] + path = trimRestconfPrefix(path) + path = strings.Replace(path, "={", "{", -1) + path = strings.Replace(path, "},{", "}{", -1) + + for k, v := range vars { + restStyle := fmt.Sprintf("{%v}", k) + gnmiStyle := fmt.Sprintf("[%v=%v]", k, v) + path = strings.Replace(path, restStyle, gnmiStyle, 1) + } + + return path +} + +// trimRestconfPrefix removes "/restconf/data" prefix from the path. +func trimRestconfPrefix(path string) string { + pattern := "/restconf/data/" + k := strings.Index(path, pattern) + if k >= 0 { + path = path[k+len(pattern)-1:] + } + + return path +} + +// invokeTranslib calls appropriate TransLib API for the given HTTP +// method. Returns response status code and content. +func invokeTranslib(reqID, method, path string, payload []byte) (int, []byte, error) { + var status = 400 + var content []byte + var err error + + switch method { + case "GET": + req := translib.GetRequest{Path: path} + resp, err1 := translib.Get(req) + if err1 == nil { + status = 200 + content = []byte(resp.Payload) + } else { + err = err1 + } + + case "POST": + //TODO return 200 for operations request + status = 201 + req := translib.SetRequest{Path: path, Payload: payload} + _, err = translib.Create(req) + + case "PUT": + //TODO send 201 if PUT resulted in creation + status = 204 + req := translib.SetRequest{Path: path, Payload: payload} + _, err = translib.Replace(req) + + case "PATCH": + status = 204 + req := translib.SetRequest{Path: path, Payload: payload} + _, err = translib.Update(req) + + case "DELETE": + status = 204 + req := translib.SetRequest{Path: path} + _, err = translib.Delete(req) + + default: + glog.Errorf("[%s] Unknown method '%v'", reqID, method) + err = httpBadRequest("Invalid method") + } + + return status, content, err +} + +// hostMetadataHandler function handles "GET /.well-known/host-meta" +// request as per RFC6415. RESTCONF specification requires this for +// advertising the RESTCONF root path ("/restconf" in our case). +func hostMetadataHandler(w http.ResponseWriter, r *http.Request) { + var data bytes.Buffer + data.WriteString("") + data.WriteString("") + data.WriteString("") + + w.Header().Set("Content-Type", "application/xrd+xml") + w.Write(data.Bytes()) +} diff --git a/src/rest/server/handler_test.go b/src/rest/server/handler_test.go new file mode 100644 index 0000000000..16e1ca21f5 --- /dev/null +++ b/src/rest/server/handler_test.go @@ -0,0 +1,524 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package server + +import ( + "encoding/xml" + "errors" + "fmt" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/gorilla/mux" +) + +func init() { + fmt.Println("+++++ init handler_test +++++") +} + +var testRouter *mux.Router + +// Basic mux.Router tests +func TestRoutes(t *testing.T) { + initCount := countRoutes(NewRouter()) + + // Add couple of test handlers + + AddRoute("one", "GET", "/test/1", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(1) + }) + + AddRoute("two", "GET", "/test/2", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(2) + }) + + SetUIDirectory("/tmp/ui") // !!? + testRouter = NewRouter() + newCount := countRoutes(testRouter) + + if newCount != initCount+2 { + t.Fatalf("Expected route count %d; found %d", initCount+2, newCount) + } + + // Try the test URLs and an unknown URL. The unknonw path + // should return 404 + t.Run("Get1", testGet("/test/1", 1)) + t.Run("Get2", testGet("/test/2", 2)) + t.Run("GetUnknown", testGet("/test/unknown", 404)) + t.Run("Meta", testGet("/.well-known/host-meta", 200)) + + // Try the test URLs with authentication enabled.. This should + // fail the requests with 401 error. Unknown path should still + // return 404. + SetUserAuthEnable(true) + testRouter = NewRouter() + t.Run("Get1_auth", testGet("/test/1", 401)) + t.Run("Get2_auth", testGet("/test/2", 401)) + t.Run("GetUnknown_auth", testGet("/test/unknown", 404)) + + // Meta handler should not be affected by user auth + t.Run("Meta_auth", testGet("/.well-known/host-meta", 200)) + + // Cleanup for next tests + SetUserAuthEnable(false) + testRouter = nil +} + +// countRoutes counts the registered routes in a mux.Router +// object by walking it +func countRoutes(r *mux.Router) int { + var count int + r.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error { + count++ + return nil + }) + + return count +} + +// Try the url and check response code +func testGet(url string, expStatus int) func(*testing.T) { + return func(t *testing.T) { + w := httptest.NewRecorder() + testRouter.ServeHTTP(w, httptest.NewRequest("GET", url, nil)) + if w.Code != expStatus { + t.Fatalf("Expected response code %d; found %d", expStatus, w.Code) + } + } +} + +func TestMetadataHandler(t *testing.T) { + r := httptest.NewRequest("GET", "/.well-known/host-meta", nil) + w := httptest.NewRecorder() + + NewRouter().ServeHTTP(w, r) + + if w.Code != 200 { + t.Fatalf("Request failed with status %d", w.Code) + } + + ct, _ := parseMediaType(w.Header().Get("content-type")) + if ct == nil || ct.Type != "application/xrd+xml" { + t.Fatalf("Unexpected content-type '%s'", w.Header().Get("content-type")) + } + + data := w.Body.Bytes() + if len(data) == 0 { + t.Fatalf("No response body") + } + + var payload struct { + XMLName xml.Name `xml:"XRD"` + Links []struct { + Rel string `xml:"rel,attr"` + Href string `xml:"href,attr"` + } `xml:"Link"` + } + + err := xml.Unmarshal(data, &payload) + if err != nil { + t.Fatalf("Response parsing failed; err=%v", err) + } + + if payload.XMLName.Local != "XRD" || + payload.XMLName.Space != "http://docs.oasis-open.org/ns/xri/xrd-1.0" { + t.Fatalf("Invalid response '%s'", data) + } + + var rcRoot string + for _, x := range payload.Links { + if x.Rel == "restconf" { + rcRoot = x.Href + } + } + + t.Logf("Restconf root = '%s'", rcRoot) + if rcRoot != "/restconf" { + t.Fatalf("Invalid restconf root; expected '/restconf'") + } +} + +// Test REST to Translib path conversions +func TestPathConv(t *testing.T) { + + t.Run("novar", testPathConv( + "/simple/url/with/no/vars", + "/simple/url/with/no/vars", + "/simple/url/with/no/vars")) + + t.Run("1var", testPathConv( + "/sample/id={name}", + "/sample/id=TEST1", + "/sample/id[name=TEST1]")) + + t.Run("1var_no=", testPathConv( + "/sample/{name}", + "/sample/TEST1", + "/sample/[name=TEST1]")) + + t.Run("1var_middle", testPathConv( + "/sample/id={name}/test/suffix", + "/sample/id=TEST1/test/suffix", + "/sample/id[name=TEST1]/test/suffix")) + + t.Run("2vars", testPathConv( + "/sample/id={name},{type}", + "/sample/id=TEST2,NEW", + "/sample/id[name=TEST2][type=NEW]")) + + t.Run("2vars_middle", testPathConv( + "/sample/id={name},{type}/hey", + "/sample/id=TEST2,NEW/hey", + "/sample/id[name=TEST2][type=NEW]/hey")) + + t.Run("5vars", testPathConv( + "/sample/key={name},{type},{subtype},{color},{ver}", + "/sample/key=TEST2,NEW,LATEST,RED,1.0", + "/sample/key[name=TEST2][type=NEW][subtype=LATEST][color=RED][ver=1.0]")) + + t.Run("5vars_no=", testPathConv( + "/sample/{name},{type},{subtype},{color},{ver}", + "/sample/TEST2,NEW,LATEST,RED,1.0", + "/sample/[name=TEST2][type=NEW][subtype=LATEST][color=RED][ver=1.0]")) + + t.Run("multi", testPathConv( + "/sample/id={name},{type},{subtype}/data/color={colorname},{rgb}/{ver}", + "/sample/id=TEST2,NEW,LATEST/data/color=RED,ff0000/1.0", + "/sample/id[name=TEST2][type=NEW][subtype=LATEST]/data/color[colorname=RED][rgb=ff0000]/[ver=1.0]")) + + t.Run("rcdata_novar", testPathConv( + "/restconf/data/no/vars", + "/restconf/data/no/vars", + "/no/vars")) + + t.Run("xrcdata_novar", testPathConv( + "/myroot/restconf/data/no/vars", + "/myroot/restconf/data/no/vars", + "/no/vars")) + + t.Run("rcdata_1var", testPathConv( + "/restconf/data/id={name}", + "/restconf/data/id=TEST1", + "/id[name=TEST1]")) + + t.Run("xrcdata_1var", testPathConv( + "/myroot/restconf/data/id={name}", + "/myroot/restconf/data/id=TEST1", + "/id[name=TEST1]")) + + t.Run("no_template", testPathConv( + "*", + "/test/id=NOTEMPLATE", + "/test/id=NOTEMPLATE")) +} + +// test handler to invoke getPathForTranslib and write the conveted +// path into response. Conversion logic depends on context values +// managed by mux router. Hence should be called from a handler. +var pathConvHandler = func(w http.ResponseWriter, r *http.Request) { + // t, err := mux.CurrentRoute(r).GetPathTemplate() + // fmt.Printf("Patt : %v (err=%v)\n", t, err) + // fmt.Printf("Vars : %v\n", mux.Vars(r)) + + w.Write([]byte(getPathForTranslib(r))) +} + +func testPathConv(template, path, expPath string) func(*testing.T) { + return func(t *testing.T) { + router := mux.NewRouter() + if template == "*" { + t.Logf("No template...") + router.Methods("GET").HandlerFunc(pathConvHandler) + } else { + router.HandleFunc(template, pathConvHandler) + } + + w := httptest.NewRecorder() + router.ServeHTTP(w, httptest.NewRequest("GET", path, nil)) + + convPath := w.Body.String() + if convPath != expPath { + t.Logf("Conversion for template '%s' failed", template) + t.Logf("Input path '%s'", path) + t.Logf("Converted '%s'", convPath) + t.Logf("Expected '%s'", expPath) + t.FailNow() + } + } +} + +type errReader string + +func (er errReader) Read(p []byte) (n int, err error) { + return 0, errors.New(string(er)) +} + +func TestReqData_NoBody(t *testing.T) { + r := httptest.NewRequest("GET", "/test", nil) + rc := &RequestContext{ID: t.Name()} + + ct, data, err := getRequestBody(r, rc) + if ct != nil || data != nil || err != nil { + t.Fatalf("Expected nil response; found ct=%v, data=%v, err=%v", ct, data, err) + } +} + +func TestReqData_ReadFailure(t *testing.T) { + r := httptest.NewRequest("PUT", "/test", errReader("e-r-r-o-r")) + rc := &RequestContext{ID: t.Name()} + + testReqError(t, r, rc, 500) +} + +func TestReqData_Unknown(t *testing.T) { + r := httptest.NewRequest("PUT", "/test", strings.NewReader("Hello, world!")) + rc := &RequestContext{ID: t.Name()} + + testReqError(t, r, rc, 415) +} + +func TestReqData_Unknown2(t *testing.T) { + r := httptest.NewRequest("PUT", "/test", strings.NewReader("Hello, world!")) + rc := &RequestContext{ID: t.Name()} + rc.Consumes.Add("text/html") + + testReqError(t, r, rc, 415) +} + +func TestReqData_BadMime(t *testing.T) { + r := httptest.NewRequest("PUT", "/test", strings.NewReader("Hello, world!")) + r.Header.Set("content-type", "b a d") + rc := &RequestContext{ID: t.Name()} + rc.Consumes.Add("b a d") + + testReqError(t, r, rc, 400) +} + +func TestReqData_Text(t *testing.T) { + r := httptest.NewRequest("PUT", "/test", strings.NewReader("Hello, world!")) + rc := &RequestContext{ID: t.Name()} + rc.Consumes.Add("text/plain") + + testReqSuccess(t, r, rc, "text/plain", "Hello, world!") +} + +func TestReqData_Json(t *testing.T) { + input := "{\"one\":1}" + r := httptest.NewRequest("PUT", "/test", strings.NewReader(input)) + r.Header.Set("content-type", "application/json") + + rc := &RequestContext{ID: t.Name()} + rc.Consumes.Add("text/html") + rc.Consumes.Add("text/plain") + rc.Consumes.Add("application/json") + + testReqSuccess(t, r, rc, "application/json", input) +} + +func TestReqData_BadJsonNoValidation(t *testing.T) { + input := "{\"one:1}" + r := httptest.NewRequest("PUT", "/test", strings.NewReader(input)) + r.Header.Set("content-type", "application/json") + + rc := &RequestContext{ID: t.Name()} + rc.Consumes.Add("application/json") + + testReqSuccess(t, r, rc, "application/json", input) +} + +func TestReqData_BadJsonWithValidation(t *testing.T) { + input := "{\"one:1}" + r := httptest.NewRequest("PUT", "/test", strings.NewReader(input)) + r.Header.Set("content-type", "application/json") + + model := make(map[string]int) + rc := &RequestContext{ID: t.Name(), Model: &model} + rc.Consumes.Add("application/json") + + testReqError(t, r, rc, 400) +} + +func testReqSuccess(t *testing.T, r *http.Request, rc *RequestContext, expType, expData string) { + ct, data, err := getRequestBody(r, rc) + + if ct == nil || ct.Type != expType { + t.Fatalf("Expected %s; found %s", expType, ct.Type) + } + if data == nil || string(data) != expData { + t.Fatalf("Expected data \"%s\"; found \"%s\"", expData, data) + } + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } +} + +func testReqError(t *testing.T, r *http.Request, rc *RequestContext, expCode int) { + ct, data, err := getRequestBody(r, rc) + + if ct != nil { + t.Fatalf("Expected nil content-type; found %s", ct.Type) + } + if data != nil { + t.Fatalf("Expected nil data; found \"%s\"", data) + } + + he, ok := err.(httpErrorType) + if !ok { + t.Fatalf("Expecting httpErrorType; got %T", err) + } + if he.status != expCode { + t.Fatalf("Expecting http status %d; got %d", expCode, he.status) + } +} + +func TestRespData_NoContent(t *testing.T) { + rc := &RequestContext{ID: t.Name()} + t.Run("nil", testRespData(nil, rc, nil, "")) + t.Run("empty", testRespData(nil, rc, []byte(""), "")) +} + +func TestRespData_NoProduces(t *testing.T) { + rc := &RequestContext{ID: t.Name()} + t.Run("txt", testRespData(nil, rc, []byte("Hello, world!"), "text/plain")) + t.Run("bin", testRespData(nil, rc, make([]byte, 5), "application/octet-stream")) +} + +func TestRespData_1Produces(t *testing.T) { + rc := &RequestContext{ID: t.Name()} + rc.Produces.Add("application/json") + + t.Run("jsn", testRespData(nil, rc, []byte("{}"), "application/json")) + t.Run("bin", testRespData(nil, rc, make([]byte, 5), "application/json")) +} + +func TestRespData_nProduces(t *testing.T) { + rc := &RequestContext{ID: t.Name()} + rc.Produces.Add("application/json") + rc.Produces.Add("application/xml") + rc.Produces.Add("text/plain") + + t.Run("jsn", testRespData(nil, rc, []byte("{}"), "text/plain")) + t.Run("bin", testRespData(nil, rc, make([]byte, 5), "application/octet-stream")) +} + +func testRespData(r *http.Request, rc *RequestContext, data []byte, expType string) func(*testing.T) { + return func(t *testing.T) { + if r == nil { + r = httptest.NewRequest("GET", "/get", nil) + } + + ctype, err := resolveResponseContentType(data, r, rc) + ct, err := parseMediaType(ctype) + + if (expType == "" && ctype != "") || (ct != nil && ct.Type != expType) { + t.Fatalf("Expected resp content-type \"%s\"; got \"%s\"", expType, ctype) + } + if err != nil { + t.Fatalf("Unexpected error %v", err) + } + } +} + +func TestProcessGET(t *testing.T) { + w := httptest.NewRecorder() + Process(w, prepareRequest(t, "GET", "/test", "")) + verifyResponse(t, w, 500) +} + +func TestProcessGET_ACL(t *testing.T) { + w := httptest.NewRecorder() + Process(w, prepareRequest(t, "GET", "/openconfig-acl:acl", "")) + verifyResponse(t, w, 200) +} + +func TestProcessPUT(t *testing.T) { + w := httptest.NewRecorder() + Process(w, prepareRequest(t, "PUT", "/test", "{}")) + verifyResponse(t, w, 500) +} + +func TestProcessPOST(t *testing.T) { + w := httptest.NewRecorder() + Process(w, prepareRequest(t, "POST", "/test", "{}")) + verifyResponse(t, w, 500) +} + +func TestProcessPATCH(t *testing.T) { + w := httptest.NewRecorder() + Process(w, prepareRequest(t, "PATCH", "/test", "{}")) + verifyResponse(t, w, 500) +} + +func TestProcessDELETE(t *testing.T) { + w := httptest.NewRecorder() + Process(w, prepareRequest(t, "DELETE", "/test", "{}")) + verifyResponse(t, w, 500) +} + +func TestProcessBadMethod(t *testing.T) { + w := httptest.NewRecorder() + Process(w, prepareRequest(t, "TEST", "/test", "{}")) + verifyResponse(t, w, 400) +} + +func TestProcessBadContent(t *testing.T) { + w := httptest.NewRecorder() + r := prepareRequest(t, "PUT", "/test", "{}") + r.Header.Set("content-type", "bad/content") + + Process(w, r) + verifyResponse(t, w, 415) +} + +func TestProcessReadError(t *testing.T) { + w := httptest.NewRecorder() + r := httptest.NewRequest("PUT", "/test", errReader("simulated error")) + r.Header.Set("content-type", "application/json") + + rc, r := GetContext(r) + rc.ID = t.Name() + rc.Consumes.Add("application/json") + + Process(w, r) + verifyResponse(t, w, 500) +} + +func prepareRequest(t *testing.T, method, path, data string) *http.Request { + r := httptest.NewRequest(method, path, strings.NewReader(data)) + rc, r := GetContext(r) + rc.ID = t.Name() + + if data != "" { + r.Header.Set("content-type", "application/json") + rc.Consumes.Add("application/json") + } else { + rc.Produces.Add("application/json") + } + + return r +} + +func verifyResponse(t *testing.T, w *httptest.ResponseRecorder, expCode int) { + if w.Code != expCode { + t.Fatalf("Expecting response status %d; got %d", expCode, w.Code) + } +} diff --git a/src/rest/server/pamAuth.go b/src/rest/server/pamAuth.go new file mode 100644 index 0000000000..4ad9f0180e --- /dev/null +++ b/src/rest/server/pamAuth.go @@ -0,0 +1,165 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package server + +import ( + "net/http" + "os/user" + + "github.com/golang/glog" + //"github.com/msteinert/pam" + "golang.org/x/crypto/ssh" +) + +/* +type UserCredential struct { + Username string + Password string +} + +//PAM conversation handler. +func (u UserCredential) PAMConvHandler(s pam.Style, msg string) (string, error) { + + switch s { + case pam.PromptEchoOff: + return u.Password, nil + case pam.PromptEchoOn: + return u.Password, nil + case pam.ErrorMsg: + return "", nil + case pam.TextInfo: + return "", nil + default: + return "", errors.New("unrecognized conversation message style") + } +} + +// PAMAuthenticate performs PAM authentication for the user credentials provided +func (u UserCredential) PAMAuthenticate() error { + tx, err := pam.StartFunc("login", u.Username, u.PAMConvHandler) + if err != nil { + return err + } + return tx.Authenticate(0) +} + +func PAMAuthUser(u string, p string) error { + + cred := UserCredential{u, p} + err := cred.PAMAuthenticate() + return err +} +*/ + +func IsAdminGroup(username string) bool { + + usr, err := user.Lookup(username) + if err != nil { + return false + } + gids, err := usr.GroupIds() + if err != nil { + return false + } + glog.V(2).Infof("User:%s, groups=%s", username, gids) + admin, err := user.Lookup("admin") + if err != nil { + return false + } + for _, x := range gids { + if x == admin.Gid { + return true + } + } + return false +} + +func PAMAuthenAndAuthor(r *http.Request, rc *RequestContext) error { + + username, passwd, authOK := r.BasicAuth() + if authOK == false { + glog.Errorf("[%s] User info not present", rc.ID) + return httpError(http.StatusUnauthorized, "") + } + + glog.Infof("[%s] Received user=%s", rc.ID, username) + + /* + * mgmt-framework container does not have access to /etc/passwd, /etc/group, + * /etc/shadow and /etc/tacplus_conf files of host. One option is to share + * /etc of host with /etc of container. For now disable this and use ssh + * for authentication. + */ + /* err := PAMAuthUser(username, passwd) + if err != nil { + log.Printf("Authentication failed. user=%s, error:%s", username, err.Error()) + return err + }*/ + + //Use ssh for authentication. + config := &ssh.ClientConfig{ + User: username, + Auth: []ssh.AuthMethod{ + ssh.Password(passwd), + }, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + } + _, err := ssh.Dial("tcp", "127.0.0.1:22", config) + if err != nil { + glog.Infof("[%s] Failed to authenticate; %v", rc.ID, err) + return httpError(http.StatusUnauthorized, "") + } + + glog.Infof("[%s] Authentication passed. user=%s ", rc.ID, username) + + //Allow SET request only if user belong to admin group + if isWriteOperation(r) && IsAdminGroup(username) == false { + glog.Errorf("[%s] Not an admin; cannot allow %s", rc.ID, r.Method) + return httpError(http.StatusForbidden, "Not an admin user") + } + + glog.Infof("[%s] Authorization passed", rc.ID) + return nil +} + +// isWriteOperation checks if the HTTP request is a write operation +func isWriteOperation(r *http.Request) bool { + m := r.Method + return m == "POST" || m == "PUT" || m == "PATCH" || m == "DELETE" +} + +// authMiddleware function creates a middleware for request +// authentication and authorization. This middleware will return +// 401 response if authentication fails and 403 if authorization +// fails. +func authMiddleware(inner http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + rc, r := GetContext(r) + err := PAMAuthenAndAuthor(r, rc) + if err != nil { + status, data, ctype := prepareErrorResponse(err, r) + w.Header().Set("Content-Type", ctype) + w.WriteHeader(status) + w.Write(data) + } else { + inner.ServeHTTP(w, r) + } + }) +} diff --git a/src/rest/server/pamAuth_test.go b/src/rest/server/pamAuth_test.go new file mode 100644 index 0000000000..d3015ea09d --- /dev/null +++ b/src/rest/server/pamAuth_test.go @@ -0,0 +1,195 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// +// +// Test cases for REST Server PAM Authentication module. +// +// Runs various combinations with local and TACACS+ user credentials. +// Test users should be already configured in the system. Below table +// lists various default user name and passwords and corresponding +// command line parameters to override them. +// +// Test user type User name Password Command line param +// ---------------------- ------------- ---------- ------------------- +// Local admin user testadmin password -ladmname -ladmpass +// Local non-admin user testuser password -lusrname -lusrpass +// TACACS+ admin user tactestadmin password -tadmname -tadmpass +// TACACS+ non-admin user tactestuser password -tusrname -tusrpass +// +// By default all test cases are skipped!! This is to avoid seeing test +// failures if target system is not ready. Command line param -authtest +// should be passed to enable the test cases. Valid values are "local" +// or "tacacs" or comma separated list of them. +// +// -authtest=local ==> Tests with only local user credentials +// -authtest=tacacs ==> Tests with only TACACS+ user credentials +// -authtest=local,tacacs ==> Tests with both local and TACACS+ users +// +/////////////////////////////////////////////////////////////////////// + +package server + +import ( + "flag" + "fmt" + "net/http" + "net/http/httptest" + "os" + "strings" + "testing" +) + +var authTest map[string]bool +var lusrName = flag.String("lusrname", "testuser", "Local non-admin username") +var lusrPass = flag.String("lusrpass", "password", "Local non-admin password") +var ladmName = flag.String("ladmname", "testadmin", "Local admin username") +var ladmPass = flag.String("ladmpass", "password", "Local admin password") +var tusrName = flag.String("tusrname", "tactestuser", "TACACS+ non-admin username") +var tusrPass = flag.String("tusrpass", "password", "TACACS+ non-admin password") +var tadmName = flag.String("tadmname", "tactestadmin", "TACACS+ admin username") +var tadmPass = flag.String("tadmpass", "password", "TACACS+ admin password") + +func init() { + fmt.Println("+++++ pamAuth_test +++++") +} + +func TestMain(m *testing.M) { + + t := flag.String("authtest", "", "Comma separated auth types to test (local tacacs)") + flag.Parse() + + var tlist []string + if *t != "" { + authTest = make(map[string]bool) + for _, x := range strings.Split(*t, ",") { + v := strings.ToLower(strings.TrimSpace(x)) + if v == "local" || v == "tacacs" { + authTest[v] = true + tlist = append(tlist, v) + } + } + if len(authTest) != 0 { + authTest[""] = true // Special key for any auth + } + } + + fmt.Println("+++++ Enabled auth test types", tlist) + + os.Exit(m.Run()) +} + +// Dummy test handler which returns 200 on success; 401 on +// authentication failure and 403 on authorization failure +var authTestHandler = authMiddleware(http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(200) + })) + +func TestLocalUser_Get(t *testing.T) { + ensureAuthTestEnabled(t, "local") + testAuthGet(t, *lusrName, *lusrPass, 200) +} + +func TestLocalUser_Set(t *testing.T) { + ensureAuthTestEnabled(t, "local") + testAuthSet(t, *lusrName, *lusrPass, 403) +} + +func TestLocalAdmin_Get(t *testing.T) { + ensureAuthTestEnabled(t, "local") + testAuthGet(t, *ladmName, *ladmPass, 200) +} + +func TestLocalAdmin_Set(t *testing.T) { + ensureAuthTestEnabled(t, "local") + testAuthSet(t, *ladmName, *ladmPass, 200) +} + +func TestTacacsUser_Get(t *testing.T) { + ensureAuthTestEnabled(t, "tacacs") + testAuthGet(t, *tusrName, *tusrPass, 200) +} + +func TestTacacslUser_Set(t *testing.T) { + ensureAuthTestEnabled(t, "tacacs") + testAuthSet(t, *tusrName, *tusrPass, 403) +} + +func TestTacacsAdmin_Get(t *testing.T) { + ensureAuthTestEnabled(t, "tacacs") + testAuthGet(t, *tadmName, *tadmPass, 200) +} + +func TestTacacsAdmin_Set(t *testing.T) { + ensureAuthTestEnabled(t, "tacacs") + testAuthSet(t, *tadmName, *tadmPass, 200) +} + +func TestAuth_NoUser(t *testing.T) { + ensureAuthTestEnabled(t, "") + testAuthGet(t, "", "", 401) + testAuthSet(t, "", "", 401) +} + +func TestAuth_BadUser(t *testing.T) { + ensureAuthTestEnabled(t, "") + testAuthGet(t, "baduserbaduserbaduser", "password", 401) + testAuthSet(t, "baduserbaduserbaduser", "password", 401) +} + +func TestAuth_BadPass(t *testing.T) { + ensureAuthTestEnabled(t, "") + testAuthGet(t, *lusrName, "Hello,world!", 401) + testAuthSet(t, *ladmName, "Hello,world!", 401) +} + +func ensureAuthTestEnabled(t *testing.T, authtype string) { + if _, ok := authTest[authtype]; !ok { + t.Skipf("%s auth tests not enabled.. Rerun with -authtest flag", authtype) + } +} + +func testAuthGet(t *testing.T, username, password string, expStatus int) { + t.Run("GET", testAuth("GET", username, password, expStatus)) + t.Run("HEAD", testAuth("HEAD", username, password, expStatus)) + t.Run("OPTIONS", testAuth("OPTIONS", username, password, expStatus)) +} + +func testAuthSet(t *testing.T, username, password string, expStatus int) { + t.Run("PUT", testAuth("PUT", username, password, expStatus)) + t.Run("POST", testAuth("POST", username, password, expStatus)) + t.Run("PATCH", testAuth("PATCH", username, password, expStatus)) + t.Run("DELETE", testAuth("DELETE", username, password, expStatus)) +} + +func testAuth(method, username, password string, expStatus int) func(*testing.T) { + return func(t *testing.T) { + r := httptest.NewRequest(method, "/auth", nil) + w := httptest.NewRecorder() + + if username != "" { + r.SetBasicAuth(username, password) + } + + authTestHandler.ServeHTTP(w, r) + + if w.Code != expStatus { + t.Fatalf("Expected response %d; got %d", expStatus, w.Code) + } + } +} diff --git a/src/rest/server/req_validate.go b/src/rest/server/req_validate.go new file mode 100644 index 0000000000..4571d8a100 --- /dev/null +++ b/src/rest/server/req_validate.go @@ -0,0 +1,94 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package server + +import ( + "encoding/json" + "reflect" + + "github.com/golang/glog" + "gopkg.in/go-playground/validator.v9" +) + +func isSkipValidation(t reflect.Type) bool { + if t == reflect.TypeOf([]int32{}) { + return true + } + + return false +} + +// RequestValidate performas payload validation of request body. +func RequestValidate(payload []byte, ctype *MediaType, rc *RequestContext) ([]byte, error) { + if ctype.isJSON() { + return validateRequestJSON(payload, rc) + } + + glog.Infof("[%s] Skipping payload validation for content-type '%v'", rc.ID, ctype.Type) + return payload, nil +} + +// validateRequestJSON performs payload validation for JSON data +func validateRequestJSON(jsn []byte, rc *RequestContext) ([]byte, error) { + var err error + v := rc.Model + glog.Infof("[%s] Unmarshalling %d bytes into %T", rc.ID, len(jsn), v) + + err = json.Unmarshal(jsn, v) + if err != nil { + glog.Errorf("[%s] json decoding error; %v", rc.ID, err) + return nil, httpBadRequest("Invalid json") + } + + //log.Printf("Received data: %s\n", jsn) + //log.Printf("Type is: %T, Value is:%v\n", v, v) + val := reflect.ValueOf(v) + if val.Kind() == reflect.Ptr && !val.IsNil() { + val = val.Elem() + } + + if !isSkipValidation(val.Type()) { + glog.Infof("[%s] Going to validate request", rc.ID) + validate := validator.New() + if val.Kind() == reflect.Slice { + //log.Println("Validate using Var") + err = validate.Var(v, "dive") + } else { + //log.Println("Validate using Struct") + err = validate.Struct(v) + } + if err != nil { + glog.Errorf("[%s] validation failed: %v", rc.ID, err) + return nil, httpBadRequest("Content not as per schema") + } + } else { + glog.Infof("[%s] Skipping payload validation for dataType %v", rc.ID, val.Type()) + } + + // Get sanitized json by marshalling validated body. Removes + // extra fields if any.. + newBody, err := json.Marshal(v) + if err != nil { + glog.Errorf("[%s] Failed to marshall; %v", rc.ID, err) + return nil, httpServerError("Internal error") + } + + return newBody, nil +} diff --git a/src/rest/server/router.go b/src/rest/server/router.go new file mode 100644 index 0000000000..aa01d193e5 --- /dev/null +++ b/src/rest/server/router.go @@ -0,0 +1,140 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package server + +import ( + "net/http" + "strings" + "time" + + "github.com/golang/glog" + "github.com/gorilla/mux" +) + +// Root directory for UI files +var swaggerUIDir = "./ui" +var isUserAuthEnabled = false + +// SetUIDirectory functions sets directiry where Swagger UI +// resources are maintained. +func SetUIDirectory(directory string) { + swaggerUIDir = directory +} + +// SetUserAuthEnable function enables/disables the PAM based user +// authentication for REST requests. By default user uthentication +// is disabled. When enabled, the server expects clients to pass +// user credentials as per HTTP Basic Autnetication method. +func SetUserAuthEnable(val bool) { + isUserAuthEnabled = val +} + +// Route registration information +type Route struct { + Name string + Method string + Pattern string + Handler http.HandlerFunc +} + +// Collection of all routes +var allRoutes []Route + +// AddRoute appends specified routes to the routes collection. +// Called by init functions of swagger generated router.go files. +func AddRoute(name, method, pattern string, handler http.HandlerFunc) { + route := Route{ + Name: name, + Method: strings.ToUpper(method), + Pattern: pattern, + Handler: handler, + } + + allRoutes = append(allRoutes, route) +} + +// NewRouter function returns a new http router instance. Collects +// route information from swagger-codegen generated code and makes a +// github.com/gorilla/mux router object. +func NewRouter() *mux.Router { + router := mux.NewRouter().StrictSlash(true) + + glog.Infof("Server has %d paths", len(allRoutes)) + + // Collect swagger generated route information + for _, route := range allRoutes { + handler := withMiddleware(route.Handler, route.Name) + + glog.V(2).Infof( + "Adding %s, %s %s", + route.Name, route.Method, route.Pattern) + + router. + Methods(route.Method). + Path(route.Pattern). + Name(route.Name). + Handler(handler) + } + + // Documentation and test UI + uiHandler := http.StripPrefix("/ui/", http.FileServer(http.Dir(swaggerUIDir))) + router.Methods("GET").PathPrefix("/ui/").Handler(uiHandler) + + // Redirect "/ui" to "/ui/index.html" + router.Methods("GET").Path("/ui"). + Handler(http.RedirectHandler("/ui/index.html", 301)) + + //router.Methods("GET").Path("/model"). + // Handler(http.RedirectHandler("/ui/model.html", 301)) + + // Metadata discovery handler + metadataHandler := http.HandlerFunc(hostMetadataHandler) + router.Methods("GET").Path("/.well-known/host-meta"). + Handler(loggingMiddleware(metadataHandler, "hostMetadataHandler")) + + return router +} + +// loggingMiddleware returns a handler which times and logs the request. +// It should be the top handler in the middleware chain. +func loggingMiddleware(inner http.Handler, name string) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + rc, r := GetContext(r) + rc.Name = name + + glog.Infof("[%s] Recevied %s request from %s", rc.ID, name, r.RemoteAddr) + + start := time.Now() + + inner.ServeHTTP(w, r) + + glog.Infof("[%s] %s took %s", rc.ID, name, time.Since(start)) + }) +} + +// withMiddleware function prepares the default middleware chain for +// REST APIs. +func withMiddleware(h http.Handler, name string) http.Handler { + if isUserAuthEnabled { + h = authMiddleware(h) + } + + return loggingMiddleware(h, name) +} diff --git a/src/translib/Makefile b/src/translib/Makefile new file mode 100644 index 0000000000..69eec34521 --- /dev/null +++ b/src/translib/Makefile @@ -0,0 +1,60 @@ +####################################################################### +# +# Copyright 2019 Broadcom. All rights reserved. +# The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +# +####################################################################### + +ifeq ($(TOPDIR),) +TOPDIR := ../.. +endif + +ifeq ($(BUILD_DIR),) +BUILD_DIR := $(TOPDIR)/build +endif + +ifeq ($(GO),) +GO = /usr/local/go/bin/go +endif + +ifeq ($(GOPATH),) +GOPATH = $(shell $(GO) env GOPATH) +endif + +ifeq ($(GOROOT),) +GOROOT = $(shell $(GO) env GOROOT) +endif + +TRANSLIB_PKG = $(TOPDIR)/pkg/linux_amd64/translib.a + +TRANSLIB_MAIN_SRCS = $(shell find . -name '*.go' | grep -v '_test.go' | grep -v '/test/') +TRANSLIB_TEST_SRCS = $(shell find . -maxdepth 1 -name '*_test.go') +TRANSL_DB_ALL_SRCS = $(shell find db/ -name '*.go' | grep -v '/test/') + +TRANSLIB_TEST_DIR = $(BUILD_DIR)/tests/translib +TRANSLIB_TEST_BIN = $(TRANSLIB_TEST_DIR)/translib.test +TRANSL_DB_TEST_BIN = $(TRANSLIB_TEST_DIR)/db.test + +YANG_FILES = $(shell find $(TOPDIR)/models/yang -name '*.yang') +YGOT_BINDS = ocbinds/ocbinds.go + +all: $(TRANSLIB_PKG) $(TRANSLIB_TEST_BIN) $(TRANSL_DB_TEST_BIN) + +$(TRANSLIB_PKG): $(TRANSLIB_MAIN_SRCS) $(YGOT_BINDS) + $(GO) build -gcflags="all=-N -l" -v translib + $(GO) install translib + +$(TRANSLIB_TEST_BIN): $(TRANSLIB_MAIN_SRCS) $(TRANSLIB_TEST_SRCS) $(YGOT_BINDS) + $(GO) test -cover -coverpkg=translib,translib/tlerr -c translib -o $@ + +$(TRANSL_DB_TEST_BIN) : $(TRANSL_DB_ALL_SRCS) + $(GO) test -cover -c translib/db -o $@ + +$(YGOT_BINDS): $(YANG_FILES) + cd ocbinds && $(GO) generate + +clean: + rm -f $(YGOT_BINDS) + rm -f $(TRANSLIB_PKG) + rm -rf $(TRANSLIB_TEST_DIR) + diff --git a/src/translib/acl_app.go b/src/translib/acl_app.go new file mode 100644 index 0000000000..0678cde7aa --- /dev/null +++ b/src/translib/acl_app.go @@ -0,0 +1,1712 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package translib + +import ( + "bytes" + "fmt" + "reflect" + "strconv" + "strings" + "translib/db" + "translib/ocbinds" + "translib/tlerr" + + log "github.com/golang/glog" + "github.com/openconfig/ygot/util" + "github.com/openconfig/ygot/ygot" +) + +const ( + TABLE_SEPARATOR = "|" + KEY_SEPARATOR = "|" + ACL_TABLE = "ACL_TABLE" + RULE_TABLE = "ACL_RULE" + ACL_TYPE = "type" + ACL_DESCRIPTION = "policy_desc" + SONIC_ACL_TYPE_L2 = "L2" + SONIC_ACL_TYPE_IPV4 = "L3" + SONIC_ACL_TYPE_IPV6 = "L3V6" + OPENCONFIG_ACL_TYPE_IPV4 = "ACL_IPV4" + OPENCONFIG_ACL_TYPE_IPV6 = "ACL_IPV6" + OPENCONFIG_ACL_TYPE_L2 = "ACL_L2" + OC_ACL_APP_MODULE_NAME = "/openconfig-acl:acl" + OC_ACL_YANG_PATH_PREFIX = "/device/acl" + + MIN_PRIORITY = 1 + MAX_PRIORITY = 65536 +) + +var IP_PROTOCOL_MAP = map[ocbinds.E_OpenconfigPacketMatchTypes_IP_PROTOCOL]uint8{ + ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_ICMP: 1, + ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_IGMP: 2, + ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_TCP: 6, + ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_UDP: 17, + ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_RSVP: 46, + ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_GRE: 47, + ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_AUTH: 51, + ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_PIM: 103, + ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_L2TP: 115, +} + +var ETHERTYPE_MAP = map[ocbinds.E_OpenconfigPacketMatchTypes_ETHERTYPE]uint32{ + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_LLDP: 0x88CC, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_VLAN: 0x8100, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_ROCE: 0x8915, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_ARP: 0x0806, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_IPV4: 0x0800, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_IPV6: 0x86DD, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_MPLS: 0x8847, +} + +type AclApp struct { + pathInfo *PathInfo + ygotRoot *ygot.GoStruct + ygotTarget *interface{} + + aclTs *db.TableSpec + ruleTs *db.TableSpec + + aclTableMap map[string]db.Value + ruleTableMap map[string]map[string]db.Value +} + +func init() { + + err := register("/openconfig-acl:acl", + &appInfo{appType: reflect.TypeOf(AclApp{}), + ygotRootType: reflect.TypeOf(ocbinds.OpenconfigAcl_Acl{}), + isNative: false, + tablesToWatch: []*db.TableSpec{&db.TableSpec{Name: ACL_TABLE}, &db.TableSpec{Name: RULE_TABLE}}}) + + if err != nil { + log.Fatal("Register ACL app module with App Interface failed with error=", err) + } + + err = addModel(&ModelData{Name: "openconfig-acl", + Org: "OpenConfig working group", + Ver: "1.0.2"}) + if err != nil { + log.Fatal("Adding model data to appinterface failed with error=", err) + } +} + +func (app *AclApp) initialize(data appData) { + log.Info("initialize:acl:path =", data.path) + pathInfo := NewPathInfo(data.path) + *app = AclApp{pathInfo: pathInfo, ygotRoot: data.ygotRoot, ygotTarget: data.ygotTarget} + + app.aclTs = &db.TableSpec{Name: ACL_TABLE} + app.ruleTs = &db.TableSpec{Name: RULE_TABLE} + + app.aclTableMap = make(map[string]db.Value) + app.ruleTableMap = make(map[string]map[string]db.Value) +} + +func (app *AclApp) getAppRootObject() *ocbinds.OpenconfigAcl_Acl { + deviceObj := (*app.ygotRoot).(*ocbinds.Device) + return deviceObj.Acl +} + +func (app *AclApp) translateCreate(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateCreate:acl:path =", app.pathInfo.Template) + + keys, err = app.translateCRUCommon(d, CREATE) + return keys, err +} + +func (app *AclApp) translateUpdate(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateUpdate:acl:path =", app.pathInfo.Template) + + keys, err = app.translateCRUCommon(d, UPDATE) + return keys, err +} + +func (app *AclApp) translateReplace(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateReplace:acl:path =", app.pathInfo.Template) + + keys, err = app.translateCRUCommon(d, REPLACE) + return keys, err +} + +func (app *AclApp) translateDelete(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateDelete:acl:path =", app.pathInfo.Template) + + return keys, err +} + +func (app *AclApp) translateGet(dbs [db.MaxDB]*db.DB) error { + var err error + log.Info("translateGet:acl:path =", app.pathInfo.Template) + return err +} + +func (app *AclApp) translateSubscribe(dbs [db.MaxDB]*db.DB, path string) (*notificationOpts, *notificationInfo, error) { + pathInfo := NewPathInfo(path) + notifInfo := notificationInfo{dbno: db.ConfigDB} + notSupported := tlerr.NotSupportedError{ + Format: "Subscribe not supported", Path: path} + + if isSubtreeRequest(pathInfo.Template, "/openconfig-acl:acl/acl-sets") { + // Subscribing to top level ACL record is not supported. It requires listening + // to 2 tables (ACL and ACL_RULE); TransLib does not support it yet + if pathInfo.HasSuffix("/acl-sets") || + pathInfo.HasSuffix("/acl-set") || + pathInfo.HasSuffix("/acl-set{}{}") { + log.Errorf("Subscribe not supported for top level ACL %s", pathInfo.Template) + return nil, nil, notSupported + } + + t, err := getAclTypeOCEnumFromName(pathInfo.Var("type")) + if err != nil { + return nil, nil, err + } + + aclkey := getAclKeyStrFromOCKey(pathInfo.Var("name"), t) + + if strings.Contains(pathInfo.Template, "/acl-entry{}") { + // Subscribe for one rule + rulekey := "RULE_" + pathInfo.Var("sequence-id") + notifInfo.table = db.TableSpec{Name: RULE_TABLE} + notifInfo.key = asKey(aclkey, rulekey) + notifInfo.needCache = !pathInfo.HasSuffix("/acl-entry{}") + + } else if pathInfo.HasSuffix("/acl-entries") || pathInfo.HasSuffix("/acl-entry") { + // Subscribe for all rules of an ACL + notifInfo.table = db.TableSpec{Name: RULE_TABLE} + notifInfo.key = asKey(aclkey, "*") + + } else { + // Subscibe for ACL fields only + notifInfo.table = db.TableSpec{Name: ACL_TABLE} + notifInfo.key = asKey(aclkey) + notifInfo.needCache = true + } + + } else if isSubtreeRequest(pathInfo.Template, "/openconfig-acl:acl/interfaces") { + // Right now interface binding config is maintained within ACL + // table itself. Multiple ACLs can be bound to one intf; one + // inname can occur in multiple ACL entries. So we cannot map + // interface binding xpaths to specific ACL table entry keys. + // For now subscribe for full ACL table!! + notifInfo.table = db.TableSpec{Name: ACL_TABLE} + notifInfo.key = asKey("*") + notifInfo.needCache = true + + } else { + log.Errorf("Unknown path %s", pathInfo.Template) + return nil, nil, notSupported + } + + return nil, ¬ifInfo, nil +} + +func (app *AclApp) processCreate(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + + if err = app.processCommon(d, CREATE); err != nil { + log.Error(err) + resp = SetResponse{ErrSrc: AppErr} + } + return resp, err +} + +func (app *AclApp) processUpdate(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + + if err = app.processCommon(d, UPDATE); err != nil { + log.Error(err) + resp = SetResponse{ErrSrc: AppErr} + } + return resp, err +} + +func (app *AclApp) processReplace(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + + if err = app.processCommon(d, REPLACE); err != nil { + log.Error(err) + resp = SetResponse{ErrSrc: AppErr} + } + return resp, err +} + +func (app *AclApp) processDelete(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + + if err = app.processCommon(d, DELETE); err != nil { + log.Error(err) + resp = SetResponse{ErrSrc: AppErr} + } + return resp, err +} + +func (app *AclApp) processGet(dbs [db.MaxDB]*db.DB) (GetResponse, error) { + var err error + var payload []byte + + configDb := dbs[db.ConfigDB] + err = app.processCommon(configDb, GET) + if err != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + + payload, err = generateGetResponsePayload(app.pathInfo.Path, (*app.ygotRoot).(*ocbinds.Device), app.ygotTarget) + if err != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + + return GetResponse{Payload: payload}, err +} + +func (app *AclApp) translateCRUCommon(d *db.DB, opcode int) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateCRUCommon:acl:path =", app.pathInfo.Template) + + app.convertOCAclsToInternal() + app.convertOCAclRulesToInternal(d) + app.convertOCAclBindingsToInternal() + + return keys, err +} + +func (app *AclApp) processCommon(d *db.DB, opcode int) error { + var err error + var topmostPath bool = false + acl := app.getAppRootObject() + + log.Infof("processCommon--Path Received: %s", app.pathInfo.Template) + targetType := reflect.TypeOf(*app.ygotTarget) + if !util.IsValueScalar(reflect.ValueOf(*app.ygotTarget)) && util.IsValuePtr(reflect.ValueOf(*app.ygotTarget)) { + log.Infof("processCommon: Target object is a <%s> of Type: %s", targetType.Kind().String(), targetType.Elem().Name()) + if targetType.Elem().Name() == "OpenconfigAcl_Acl" { + topmostPath = true + } + } + + targetUriPath, _ := getYangPathFromUri(app.pathInfo.Path) + if isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/acl-sets") { + if isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/acl-sets/acl-set{}{}") { + for aclSetKey, _ := range acl.AclSets.AclSet { + aclSet := acl.AclSets.AclSet[aclSetKey] + aclKey := getAclKeyStrFromOCKey(aclSetKey.Name, aclSetKey.Type) + + if isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/acl-sets/acl-set{}{}/acl-entries/acl-entry{}") { + // Subtree of one Rule + for seqId, _ := range aclSet.AclEntries.AclEntry { + ruleKey := "RULE_" + strconv.Itoa(int(seqId)) + entrySet := aclSet.AclEntries.AclEntry[seqId] + + ruleNodeYangPath := getYangPathFromYgotStruct(entrySet, OC_ACL_YANG_PATH_PREFIX, OC_ACL_APP_MODULE_NAME) + isRuleNodeSubtree := len(targetUriPath) > len(ruleNodeYangPath) + switch opcode { + case CREATE: + if isRuleNodeSubtree { + err = app.setAclRuleDataInConfigDb(d, app.ruleTableMap, false) + } else if *app.ygotTarget == entrySet { + err = app.setAclRuleDataInConfigDb(d, app.ruleTableMap, true) + } else { + log.Errorf("processCommon: Given CREATE path %s not handled", targetUriPath) + } + case REPLACE: + err = d.SetEntry(app.ruleTs, db.Key{Comp: []string{aclKey, ruleKey}}, app.ruleTableMap[aclKey][ruleKey]) + case UPDATE: + err = d.ModEntry(app.ruleTs, db.Key{Comp: []string{aclKey, ruleKey}}, app.ruleTableMap[aclKey][ruleKey]) + case DELETE: + if *app.ygotTarget == entrySet { + err = d.DeleteEntry(app.ruleTs, db.Key{Comp: []string{aclKey, ruleKey}}) + } else if isRuleNodeSubtree { + err = app.handleRuleFieldsDeletion(d, aclKey, ruleKey) + if err != nil { + return err + } + //err = d.SetEntry(app.ruleTs, db.Key{Comp: []string{aclKey, ruleKey}}, app.ruleTableMap[aclKey][ruleKey]) + } else { + log.Errorf("processCommon: Given DELETE path %s not handled", targetUriPath) + } + case GET: + err = app.convertDBAclRulesToInternal(d, aclKey, int64(seqId), db.Key{}) + ygot.BuildEmptyTree(entrySet) + app.convertInternalToOCAclRule(aclKey, aclSetKey.Type, int64(seqId), nil, entrySet) + } + } + } else { + isAclEntriesSubtree := isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/acl-sets/acl-set{}{}/acl-entries") + switch opcode { + case CREATE: + if *app.ygotTarget == aclSet { + err = app.setAclDataInConfigDb(d, app.aclTableMap, true) + if err != nil { + return err + } + err = app.setAclRuleDataInConfigDb(d, app.ruleTableMap, true) + } else if isAclEntriesSubtree { + err = app.setAclRuleDataInConfigDb(d, app.ruleTableMap, true) + } else { + err = d.SetEntry(app.aclTs, db.Key{Comp: []string{aclKey}}, app.aclTableMap[aclKey]) + } + case REPLACE: + if *app.ygotTarget == aclSet || isAclEntriesSubtree { + err = d.DeleteKeys(app.ruleTs, db.Key{Comp: []string{aclKey + TABLE_SEPARATOR + "RULE_*"}}) + if err != nil { + return err + } + err = app.setAclRuleDataInConfigDb(d, app.ruleTableMap, true) + if err != nil { + return err + } + } + if !isAclEntriesSubtree { + err = d.ModEntry(app.aclTs, db.Key{Comp: []string{aclKey}}, app.aclTableMap[aclKey]) + } + case UPDATE: + if !isAclEntriesSubtree { + err = app.setAclDataInConfigDb(d, app.aclTableMap, false) + //err = d.ModEntry(app.aclTs, db.Key{Comp: []string{aclKey}}, app.aclTableMap[aclKey]) + if err != nil { + return err + } + } + if *app.ygotTarget == aclSet || isAclEntriesSubtree { + err = app.setAclRuleDataInConfigDb(d, app.ruleTableMap, false) + } + case DELETE: + if *app.ygotTarget == aclSet { + err = d.DeleteKeys(app.ruleTs, db.Key{Comp: []string{aclKey + TABLE_SEPARATOR + "*"}}) + if err != nil { + return err + } + err = d.DeleteEntry(app.aclTs, db.Key{Comp: []string{aclKey}}) + } else if isAclEntriesSubtree { + err = d.DeleteKeys(app.ruleTs, db.Key{Comp: []string{aclKey + TABLE_SEPARATOR + "RULE_*"}}) + } else { + nodeInfo, err := getTargetNodeYangSchema(app.pathInfo.Path, (*app.ygotRoot).(*ocbinds.Device)) + if err != nil { + return err + } + if nodeInfo != nil && nodeInfo.IsLeaf() && nodeInfo.Name == "description" { + err = d.DeleteEntryFields(app.aclTs, asKey(aclKey), createEmptyDbValue(ACL_DESCRIPTION)) + } + //err = d.SetEntry(app.aclTs, db.Key{Comp: []string{aclKey}}, app.aclTableMap[aclKey]) + } + case GET: + err = app.convertDBAclToInternal(d, db.Key{Comp: []string{aclKey}}) + if err != nil { + return err + } + ygot.BuildEmptyTree(aclSet) + app.convertInternalToOCAcl(aclKey, acl.AclSets, aclSet) + } + } + } + } else { + // All Acls and their rules + err = app.processCommonToplevelPath(d, acl, opcode, false) + } + } else if isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/interfaces") { + switch opcode { + case CREATE, REPLACE, UPDATE: + err = app.setAclBindDataInConfigDb(d, app.aclTableMap, opcode) + case DELETE: + err = app.handleBindingsDeletion(d) + case GET: + if isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/interfaces/interface{}") { + for intfId := range acl.Interfaces.Interface { + intfData := acl.Interfaces.Interface[intfId] + ygot.BuildEmptyTree(intfData) + if isSubtreeRequest(targetUriPath, "/openconfig-acl:acl/interfaces/interface/ingress-acl-sets") { + err = app.getAclBindingInfoForInterfaceData(d, intfData, intfId, "INGRESS") + } else if isSubtreeRequest(targetUriPath, "/openconfig-acl:acl/interfaces/interface/egress-acl-sets") { + err = app.getAclBindingInfoForInterfaceData(d, intfData, intfId, "EGRESS") + } else { + // Direction unknown. Check ACL Table for binding information. + err = app.getAclBindingInfoForInterfaceData(d, intfData, intfId, "INGRESS") + if err != nil { + return err + } + err = app.getAclBindingInfoForInterfaceData(d, intfData, intfId, "EGRESS") + } + } + } else { + err = app.getAllBindingsInfo(d) + } + } + } else { + err = app.processCommonToplevelPath(d, acl, opcode, true) + } + + if !topmostPath && !isSubtreeRequest(targetUriPath, "/openconfig-acl:acl/acl-sets") && !isSubtreeRequest(targetUriPath, "/openconfig-acl:acl/interfaces") { + err = tlerr.NotSupported("URL %s is not supported", app.pathInfo.Template) + } + + return err +} + +func (app *AclApp) processCommonToplevelPath(d *db.DB, acl *ocbinds.OpenconfigAcl_Acl, opcode int, isTopmostPath bool) error { + var err error + switch opcode { + case CREATE: + err = app.setAclDataInConfigDb(d, app.aclTableMap, true) + if err != nil { + return err + } + err = app.setAclRuleDataInConfigDb(d, app.ruleTableMap, true) + case REPLACE: + err = d.DeleteTable(app.aclTs) + if err != nil { + return err + } + err = d.DeleteTable(app.ruleTs) + if err != nil { + return err + } + err = app.setAclDataInConfigDb(d, app.aclTableMap, true) + if err != nil { + return err + } + err = app.setAclRuleDataInConfigDb(d, app.ruleTableMap, true) + case UPDATE: + err = app.setAclDataInConfigDb(d, app.aclTableMap, false) + if err != nil { + return err + } + err = app.setAclRuleDataInConfigDb(d, app.ruleTableMap, false) + case DELETE: + err = d.DeleteTable(app.ruleTs) + if err != nil { + return err + } + err = d.DeleteTable(app.aclTs) + case GET: + ygot.BuildEmptyTree(acl) + err = app.convertDBAclToInternal(d, db.Key{}) + if err != nil { + return err + } + app.convertInternalToOCAcl("", acl.AclSets, nil) + if isTopmostPath { + err = app.getAllBindingsInfo(d) + } + } + return err +} + +/*********** These are Translation Helper Function ***********/ +func (app *AclApp) convertDBAclRulesToInternal(dbCl *db.DB, aclName string, seqId int64, ruleKey db.Key) error { + var err error + if seqId != -1 { + ruleKey.Comp = []string{aclName, "RULE_" + strconv.FormatInt(int64(seqId), 10)} + } + if ruleKey.Len() > 1 { + ruleName := ruleKey.Get(1) + if ruleName != "DEFAULT_RULE" { + ruleData, err := dbCl.GetEntry(app.ruleTs, ruleKey) + if err != nil { + return err + } + if app.ruleTableMap[aclName] == nil { + app.ruleTableMap[aclName] = make(map[string]db.Value) + } + app.ruleTableMap[aclName][ruleName] = ruleData + } + } else { + ruleKeys, err := dbCl.GetKeys(app.ruleTs) + if err != nil { + return err + } + for i, _ := range ruleKeys { + if aclName == ruleKeys[i].Get(0) { + app.convertDBAclRulesToInternal(dbCl, aclName, -1, ruleKeys[i]) + } + } + } + return err +} + +func (app *AclApp) convertDBAclToInternal(dbCl *db.DB, aclkey db.Key) error { + var err error + if aclkey.Len() > 0 { + // Get one particular ACL + entry, err := dbCl.GetEntry(app.aclTs, aclkey) + if err != nil { + return err + } + if entry.IsPopulated() { + app.aclTableMap[aclkey.Get(0)] = entry + app.ruleTableMap[aclkey.Get(0)] = make(map[string]db.Value) + err = app.convertDBAclRulesToInternal(dbCl, aclkey.Get(0), -1, db.Key{}) + if err != nil { + return err + } + } else { + return tlerr.NotFound("Acl %s is not configured", aclkey.Get(0)) + } + } else { + // Get all ACLs + tbl, err := dbCl.GetTable(app.aclTs) + if err != nil { + return err + } + keys, _ := tbl.GetKeys() + for i, _ := range keys { + app.convertDBAclToInternal(dbCl, keys[i]) + } + } + return err +} + +func (app *AclApp) convertInternalToOCAcl(aclName string, aclSets *ocbinds.OpenconfigAcl_Acl_AclSets, aclSet *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet) { + if len(aclName) > 0 { + aclData := app.aclTableMap[aclName] + if aclSet != nil { + aclSet.Config.Name = aclSet.Name + aclSet.Config.Type = aclSet.Type + aclSet.State.Name = aclSet.Name + aclSet.State.Type = aclSet.Type + + for k := range aclData.Field { + if ACL_DESCRIPTION == k { + descr := aclData.Get(k) + aclSet.Config.Description = &descr + aclSet.State.Description = &descr + } else if "ports@" == k { + continue + } + } + + app.convertInternalToOCAclRule(aclName, aclSet.Type, -1, aclSet, nil) + } + } else { + for acln := range app.aclTableMap { + acldata := app.aclTableMap[acln] + var aclNameStr string + var aclType ocbinds.E_OpenconfigAcl_ACL_TYPE + if acldata.Get(ACL_TYPE) == SONIC_ACL_TYPE_IPV4 { + aclNameStr = strings.Replace(acln, "_"+OPENCONFIG_ACL_TYPE_IPV4, "", 1) + aclType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4 + } else if acldata.Get(ACL_TYPE) == SONIC_ACL_TYPE_IPV6 { + aclNameStr = strings.Replace(acln, "_"+OPENCONFIG_ACL_TYPE_IPV6, "", 1) + aclType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6 + } else if acldata.Get(ACL_TYPE) == SONIC_ACL_TYPE_L2 { + aclNameStr = strings.Replace(acln, "_"+OPENCONFIG_ACL_TYPE_L2, "", 1) + aclType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2 + } + aclSetPtr, aclErr := aclSets.NewAclSet(aclNameStr, aclType) + if aclErr != nil { + fmt.Println("Error handling: ", aclErr) + } + ygot.BuildEmptyTree(aclSetPtr) + app.convertInternalToOCAcl(acln, nil, aclSetPtr) + } + } +} + +func (app *AclApp) convertInternalToOCAclRule(aclName string, aclType ocbinds.E_OpenconfigAcl_ACL_TYPE, seqId int64, aclSet *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet, entrySet *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry) { + if seqId != -1 { + ruleName := "RULE_" + strconv.FormatInt(int64(seqId), 10) + app.convertInternalToOCAclRuleProperties(app.ruleTableMap[aclName][ruleName], aclType, nil, entrySet) + } else { + for ruleName := range app.ruleTableMap[aclName] { + app.convertInternalToOCAclRuleProperties(app.ruleTableMap[aclName][ruleName], aclType, aclSet, nil) + } + } +} + +func (app *AclApp) convertInternalToOCAclRuleProperties(ruleData db.Value, aclType ocbinds.E_OpenconfigAcl_ACL_TYPE, aclSet *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet, entrySet *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry) { + priority, _ := strconv.ParseInt(ruleData.Get("PRIORITY"), 10, 32) + seqId := uint32(MAX_PRIORITY - priority) + //ruleDescr := ruleData.Get("RULE_DESCRIPTION") + + if entrySet == nil { + if aclSet != nil { + entrySet_, _ := aclSet.AclEntries.NewAclEntry(seqId) + entrySet = entrySet_ + ygot.BuildEmptyTree(entrySet) + } + } + + entrySet.Config.SequenceId = &seqId + //entrySet.Config.Description = &ruleDescr + entrySet.State.SequenceId = &seqId + //entrySet.State.Description = &ruleDescr + + var num uint64 + num = 0 + entrySet.State.MatchedOctets = &num + entrySet.State.MatchedPackets = &num + + ygot.BuildEmptyTree(entrySet.Transport) + ygot.BuildEmptyTree(entrySet.Actions) + + for ruleKey := range ruleData.Field { + if "L4_SRC_PORT" == ruleKey || "L4_SRC_PORT_RANGE" == ruleKey { + port := ruleData.Get(ruleKey) + srcPort := getTransportSrcDestPorts(port, "src") + entrySet.Transport.Config.SourcePort, _ = entrySet.Transport.Config.To_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union(srcPort) + entrySet.Transport.State.SourcePort, _ = entrySet.Transport.State.To_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_State_SourcePort_Union(srcPort) + } else if "L4_DST_PORT" == ruleKey || "L4_DST_PORT_RANGE" == ruleKey { + port := ruleData.Get(ruleKey) + destPort := getTransportSrcDestPorts(port, "dest") + entrySet.Transport.Config.DestinationPort, _ = entrySet.Transport.Config.To_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union(destPort) + entrySet.Transport.State.DestinationPort, _ = entrySet.Transport.State.To_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_State_DestinationPort_Union(destPort) + } else if "TCP_FLAGS" == ruleKey { + tcpFlags := ruleData.Get(ruleKey) + entrySet.Transport.Config.TcpFlags = getTransportConfigTcpFlags(tcpFlags) + entrySet.Transport.State.TcpFlags = getTransportConfigTcpFlags(tcpFlags) + } else if "PACKET_ACTION" == ruleKey { + if "FORWARD" == ruleData.Get(ruleKey) { + entrySet.Actions.Config.ForwardingAction = ocbinds.OpenconfigAcl_FORWARDING_ACTION_ACCEPT + entrySet.Actions.State.ForwardingAction = ocbinds.OpenconfigAcl_FORWARDING_ACTION_ACCEPT + } else { + entrySet.Actions.Config.ForwardingAction = ocbinds.OpenconfigAcl_FORWARDING_ACTION_DROP + entrySet.Actions.State.ForwardingAction = ocbinds.OpenconfigAcl_FORWARDING_ACTION_DROP + } + } + } + + if aclType == ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4 { + ygot.BuildEmptyTree(entrySet.Ipv4) + for ruleKey := range ruleData.Field { + if "IP_PROTOCOL" == ruleKey { + ipProto, _ := strconv.ParseInt(ruleData.Get(ruleKey), 10, 64) + protocolVal := getIpProtocol(ipProto) + entrySet.Ipv4.Config.Protocol, _ = entrySet.Ipv4.Config.To_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_Config_Protocol_Union(protocolVal) + entrySet.Ipv4.State.Protocol, _ = entrySet.Ipv4.State.To_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_State_Protocol_Union(protocolVal) + } else if "DSCP" == ruleKey { + var dscp uint8 + dscpData, _ := strconv.ParseInt(ruleData.Get(ruleKey), 10, 64) + dscp = uint8(dscpData) + entrySet.Ipv4.Config.Dscp = &dscp + entrySet.Ipv4.State.Dscp = &dscp + } else if "SRC_IP" == ruleKey { + addr := ruleData.Get(ruleKey) + entrySet.Ipv4.Config.SourceAddress = &addr + entrySet.Ipv4.State.SourceAddress = &addr + } else if "DST_IP" == ruleKey { + addr := ruleData.Get(ruleKey) + entrySet.Ipv4.Config.DestinationAddress = &addr + entrySet.Ipv4.State.DestinationAddress = &addr + } + } + } else if aclType == ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6 { + ygot.BuildEmptyTree(entrySet.Ipv6) + for ruleKey := range ruleData.Field { + if "IP_PROTOCOL" == ruleKey { + ipProto, _ := strconv.ParseInt(ruleData.Get(ruleKey), 10, 64) + protocolVal := getIpProtocol(ipProto) + entrySet.Ipv6.Config.Protocol, _ = entrySet.Ipv6.Config.To_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv6_Config_Protocol_Union(protocolVal) + entrySet.Ipv6.State.Protocol, _ = entrySet.Ipv6.State.To_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv6_State_Protocol_Union(protocolVal) + } else if "DSCP" == ruleKey { + var dscp uint8 + dscpData, _ := strconv.ParseInt(ruleData.Get(ruleKey), 10, 64) + dscp = uint8(dscpData) + entrySet.Ipv6.Config.Dscp = &dscp + entrySet.Ipv6.State.Dscp = &dscp + } else if "SRC_IPV6" == ruleKey { + addr := ruleData.Get(ruleKey) + entrySet.Ipv6.Config.SourceAddress = &addr + entrySet.Ipv6.State.SourceAddress = &addr + } else if "DST_IPV6" == ruleKey { + addr := ruleData.Get(ruleKey) + entrySet.Ipv6.Config.DestinationAddress = &addr + entrySet.Ipv6.State.DestinationAddress = &addr + } + } + } else if aclType == ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2 { + ygot.BuildEmptyTree(entrySet.L2) + for ruleKey := range ruleData.Field { + if "ETHER_TYPE" == ruleKey { + ethType, _ := strconv.ParseUint(strings.Replace(ruleData.Get(ruleKey), "0x", "", -1), 16, 32) + ethertype := getL2EtherType(ethType) + entrySet.L2.Config.Ethertype, _ = entrySet.L2.Config.To_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_Config_Ethertype_Union(ethertype) + entrySet.L2.State.Ethertype, _ = entrySet.L2.State.To_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_State_Ethertype_Union(ethertype) + } + } + } +} + +func convertInternalToOCAclRuleBinding(d *db.DB, priority uint32, seqId int64, direction string, aclSet ygot.GoStruct, entrySet ygot.GoStruct) { + if seqId == -1 { + seqId = int64(MAX_PRIORITY - priority) + } + + var num uint64 + num = 0 + var ruleId uint32 = uint32(seqId) + + if direction == "INGRESS" { + var ingressEntrySet *ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_AclEntries_AclEntry + var ok bool + if entrySet == nil { + ingressAclSet := aclSet.(*ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet) + if ingressEntrySet, ok = ingressAclSet.AclEntries.AclEntry[ruleId]; !ok { + ingressEntrySet, _ = ingressAclSet.AclEntries.NewAclEntry(ruleId) + } + } else { + ingressEntrySet = entrySet.(*ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_AclEntries_AclEntry) + } + if ingressEntrySet != nil { + ygot.BuildEmptyTree(ingressEntrySet) + ingressEntrySet.State.SequenceId = &ruleId + ingressEntrySet.State.MatchedPackets = &num + ingressEntrySet.State.MatchedOctets = &num + } + } else if direction == "EGRESS" { + var egressEntrySet *ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_AclEntries_AclEntry + var ok bool + if entrySet == nil { + egressAclSet := aclSet.(*ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet) + if egressEntrySet, ok = egressAclSet.AclEntries.AclEntry[ruleId]; !ok { + egressEntrySet, _ = egressAclSet.AclEntries.NewAclEntry(ruleId) + } + } else { + egressEntrySet = entrySet.(*ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_AclEntries_AclEntry) + } + if egressEntrySet != nil { + ygot.BuildEmptyTree(egressEntrySet) + egressEntrySet.State.SequenceId = &ruleId + egressEntrySet.State.MatchedPackets = &num + egressEntrySet.State.MatchedOctets = &num + } + } +} + +func (app *AclApp) convertInternalToOCAclBinding(d *db.DB, aclName string, intfId string, direction string, intfAclSet ygot.GoStruct) error { + var err error + if _, ok := app.aclTableMap[aclName]; !ok { + aclEntry, err1 := d.GetEntry(app.aclTs, db.Key{Comp: []string{aclName}}) + if err1 != nil { + return err1 + } + if !contains(aclEntry.GetList("ports"), intfId) { + return tlerr.InvalidArgs("Acl %s not binded with %s", aclName, intfId) + } + } + + if _, ok := app.ruleTableMap[aclName]; !ok { + ruleKeys, _ := d.GetKeys(app.ruleTs) + for i, _ := range ruleKeys { + rulekey := ruleKeys[i] + // Rulekey has two keys, first aclkey and second rulename + if rulekey.Get(0) == aclName && rulekey.Get(1) != "DEFAULT_RULE" { + seqId, _ := strconv.Atoi(strings.Replace(rulekey.Get(1), "RULE_", "", 1)) + convertInternalToOCAclRuleBinding(d, 0, int64(seqId), direction, intfAclSet, nil) + } + } + } else { + for ruleName := range app.ruleTableMap[aclName] { + if ruleName != "DEFAULT_RULE" { + seqId, _ := strconv.Atoi(strings.Replace(ruleName, "RULE_", "", 1)) + convertInternalToOCAclRuleBinding(d, 0, int64(seqId), direction, intfAclSet, nil) + } + } + } + + return err +} + +func (app *AclApp) getAllBindingsInfo(d *db.DB) error { + var err error + acl := app.getAppRootObject() + if len(app.aclTableMap) == 0 { + aclKeys, _ := d.GetKeys(app.aclTs) + for i, _ := range aclKeys { + aclEntry, _ := d.GetEntry(app.aclTs, aclKeys[i]) + app.aclTableMap[(aclKeys[i]).Get(0)] = aclEntry + } + } + var interfaces []string + for aclName := range app.aclTableMap { + aclData := app.aclTableMap[aclName] + if len(aclData.Get("ports@")) > 0 { + aclIntfs := aclData.GetList("ports") + for i, _ := range aclIntfs { + if !contains(interfaces, aclIntfs[i]) && aclIntfs[i] != "" { + interfaces = append(interfaces, aclIntfs[i]) + } + } + } + } + + for _, intfId := range interfaces { + var intfData *ocbinds.OpenconfigAcl_Acl_Interfaces_Interface + intfData, ok := acl.Interfaces.Interface[intfId] + if !ok { + intfData, _ = acl.Interfaces.NewInterface(intfId) + } + ygot.BuildEmptyTree(intfData) + err = app.getAclBindingInfoForInterfaceData(d, intfData, intfId, "INGRESS") + err = app.getAclBindingInfoForInterfaceData(d, intfData, intfId, "EGRESS") + } + return err +} + +func (app *AclApp) getAclBindingInfoForInterfaceData(d *db.DB, intfData *ocbinds.OpenconfigAcl_Acl_Interfaces_Interface, intfId string, direction string) error { + var err error + if intfData != nil { + intfData.Config.Id = intfData.Id + intfData.State.Id = intfData.Id + } + if direction == "INGRESS" { + if intfData.IngressAclSets != nil && len(intfData.IngressAclSets.IngressAclSet) > 0 { + for ingressAclSetKey, _ := range intfData.IngressAclSets.IngressAclSet { + aclName := strings.Replace(strings.Replace(ingressAclSetKey.SetName, " ", "_", -1), "-", "_", -1) + aclType := ingressAclSetKey.Type.ΛMap()["E_OpenconfigAcl_ACL_TYPE"][int64(ingressAclSetKey.Type)].Name + aclKey := aclName + "_" + aclType + + ingressAclSet := intfData.IngressAclSets.IngressAclSet[ingressAclSetKey] + if ingressAclSet != nil && ingressAclSet.AclEntries != nil && len(ingressAclSet.AclEntries.AclEntry) > 0 { + for seqId, _ := range ingressAclSet.AclEntries.AclEntry { + rulekey := "RULE_" + strconv.Itoa(int(seqId)) + entrySet := ingressAclSet.AclEntries.AclEntry[seqId] + _, err := d.GetEntry(app.ruleTs, db.Key{Comp: []string{aclKey, rulekey}}) + if err != nil { + return err + } + convertInternalToOCAclRuleBinding(d, 0, int64(seqId), direction, nil, entrySet) + } + } else { + ygot.BuildEmptyTree(ingressAclSet) + ingressAclSet.Config = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_Config{SetName: &aclName, Type: ingressAclSetKey.Type} + ingressAclSet.State = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_State{SetName: &aclName, Type: ingressAclSetKey.Type} + err = app.convertInternalToOCAclBinding(d, aclKey, intfId, direction, ingressAclSet) + } + } + } else { + err = app.findAndGetAclBindingInfoForInterfaceData(d, intfId, direction, intfData) + } + } else if direction == "EGRESS" { + if intfData.EgressAclSets != nil && len(intfData.EgressAclSets.EgressAclSet) > 0 { + for egressAclSetKey, _ := range intfData.EgressAclSets.EgressAclSet { + aclName := strings.Replace(strings.Replace(egressAclSetKey.SetName, " ", "_", -1), "-", "_", -1) + aclType := egressAclSetKey.Type.ΛMap()["E_OpenconfigAcl_ACL_TYPE"][int64(egressAclSetKey.Type)].Name + aclKey := aclName + "_" + aclType + + egressAclSet := intfData.EgressAclSets.EgressAclSet[egressAclSetKey] + if egressAclSet != nil && egressAclSet.AclEntries != nil && len(egressAclSet.AclEntries.AclEntry) > 0 { + for seqId, _ := range egressAclSet.AclEntries.AclEntry { + rulekey := "RULE_" + strconv.Itoa(int(seqId)) + entrySet := egressAclSet.AclEntries.AclEntry[seqId] + _, err := d.GetEntry(app.ruleTs, db.Key{Comp: []string{aclKey, rulekey}}) + if err != nil { + return err + } + convertInternalToOCAclRuleBinding(d, 0, int64(seqId), direction, nil, entrySet) + } + } else { + ygot.BuildEmptyTree(egressAclSet) + egressAclSet.Config = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_Config{SetName: &aclName, Type: egressAclSetKey.Type} + egressAclSet.State = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_State{SetName: &aclName, Type: egressAclSetKey.Type} + err = app.convertInternalToOCAclBinding(d, aclKey, intfId, direction, egressAclSet) + } + } + } else { + err = app.findAndGetAclBindingInfoForInterfaceData(d, intfId, direction, intfData) + } + } else { + log.Error("Unknown direction") + } + return err +} + +func (app *AclApp) findAndGetAclBindingInfoForInterfaceData(d *db.DB, intfId string, direction string, intfData *ocbinds.OpenconfigAcl_Acl_Interfaces_Interface) error { + var err error + if len(app.aclTableMap) == 0 { + aclKeys, _ := d.GetKeys(app.aclTs) + for i, _ := range aclKeys { + aclEntry, _ := d.GetEntry(app.aclTs, aclKeys[i]) + app.aclTableMap[aclKeys[i].Get(0)] = aclEntry + } + } + + for aclName, _ := range app.aclTableMap { + aclData := app.aclTableMap[aclName] + aclIntfs := aclData.GetList("ports") + aclType := aclData.Get(ACL_TYPE) + var aclOrigName string + var aclOrigType ocbinds.E_OpenconfigAcl_ACL_TYPE + if SONIC_ACL_TYPE_IPV4 == aclType { + aclOrigName = strings.Replace(aclName, "_"+OPENCONFIG_ACL_TYPE_IPV4, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4 + } else if SONIC_ACL_TYPE_IPV6 == aclType { + aclOrigName = strings.Replace(aclName, "_"+OPENCONFIG_ACL_TYPE_IPV6, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6 + } else if SONIC_ACL_TYPE_L2 == aclType { + aclOrigName = strings.Replace(aclName, "_"+OPENCONFIG_ACL_TYPE_L2, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2 + } + + if contains(aclIntfs, intfId) && direction == aclData.Get("stage") { + if direction == "INGRESS" { + if intfData.IngressAclSets != nil { + aclSetKey := ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_Key{SetName: aclOrigName, Type: aclOrigType} + ingressAclSet, ok := intfData.IngressAclSets.IngressAclSet[aclSetKey] + if !ok { + ingressAclSet, _ = intfData.IngressAclSets.NewIngressAclSet(aclOrigName, aclOrigType) + ygot.BuildEmptyTree(ingressAclSet) + ingressAclSet.Config = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_Config{SetName: &aclOrigName, Type: aclOrigType} + ingressAclSet.State = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_State{SetName: &aclOrigName, Type: aclOrigType} + } + err = app.convertInternalToOCAclBinding(d, aclName, intfId, direction, ingressAclSet) + if err != nil { + return err + } + } + } else if direction == "EGRESS" { + if intfData.EgressAclSets != nil { + aclSetKey := ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_Key{SetName: aclOrigName, Type: aclOrigType} + egressAclSet, ok := intfData.EgressAclSets.EgressAclSet[aclSetKey] + if !ok { + egressAclSet, _ = intfData.EgressAclSets.NewEgressAclSet(aclOrigName, aclOrigType) + ygot.BuildEmptyTree(egressAclSet) + egressAclSet.Config = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_Config{SetName: &aclOrigName, Type: aclOrigType} + egressAclSet.State = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_State{SetName: &aclOrigName, Type: aclOrigType} + } + err = app.convertInternalToOCAclBinding(d, aclName, intfId, direction, egressAclSet) + if err != nil { + return err + } + } + } + } + } + return err +} + +/*func (app *AclApp) isInterfaceBindWithACL(d *db.DB, intfId string) bool { + var isFound bool = false + + if len(app.aclTableMap) == 0 { + aclKeys, _ := d.GetKeys(app.aclTs) + for i, _ := range aclKeys { + aclEntry, _ := d.GetEntry(app.aclTs, aclKeys[i]) + app.aclTableMap[(aclKeys[i]).Get(0)] = aclEntry + } + } + + var interfaces []string + for aclName := range app.aclTableMap { + aclData := app.aclTableMap[aclName] + if len(aclData.Get("ports@")) > 0 { + aclIntfs := aclData.GetList("ports") + for i, _ := range aclIntfs { + if !contains(interfaces, aclIntfs[i]) && aclIntfs[i] != "" { + interfaces = append(interfaces, aclIntfs[i]) + } + } + } + } + + isFound = contains(interfaces, intfId) + return isFound +}*/ + +func (app *AclApp) handleBindingsDeletion(d *db.DB) error { + var err error + + acl := app.getAppRootObject() + aclKeys, _ := d.GetKeys(app.aclTs) + for i, _ := range aclKeys { + aclEntry, _ := d.GetEntry(app.aclTs, aclKeys[i]) + var isRequestedAclFound = false + if len(aclEntry.GetList("ports")) > 0 { + if isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/interfaces/interface{}") { + direction := aclEntry.Get("stage") + if isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/interfaces/interface{}/ingress-acl-sets") && direction != "INGRESS" { + return tlerr.InvalidArgs("Acl %s is not Ingress", aclKeys[i].Get(0)) + } + if isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/interfaces/interface{}/egress-acl-sets") && direction != "EGRESS" { + return tlerr.InvalidArgs("Acl %s is not Egress", aclKeys[i].Get(0)) + } + for intfId := range acl.Interfaces.Interface { + aclname, acltype := getAclKeysFromStrKey(aclKeys[i].Get(0), aclEntry.Get("type")) + intfData := acl.Interfaces.Interface[intfId] + if isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/interfaces/interface{}/ingress-acl-sets/ingress-acl-set{}{}") { + for k := range intfData.IngressAclSets.IngressAclSet { + if aclname == k.SetName { + if acltype == k.Type { + isRequestedAclFound = true + } else { + return tlerr.InvalidArgs("Acl Type is not matching") + } + } else { + goto SkipDBProcessing + } + } + } else if isSubtreeRequest(app.pathInfo.Template, "/openconfig-acl:acl/interfaces/interface{}/egress-acl-sets/egress-acl-set{}{}") { + for k := range intfData.EgressAclSets.EgressAclSet { + if aclname == k.SetName { + if acltype == k.Type { + isRequestedAclFound = true + } else { + return tlerr.InvalidArgs("Acl Type is not matching") + } + } else { + goto SkipDBProcessing + } + } + } + intfs := aclEntry.GetList("ports") + intfs = removeElement(intfs, intfId) + aclEntry.SetList("ports", intfs) + err = d.SetEntry(app.aclTs, aclKeys[i], aclEntry) + if err != nil { + return err + } + // If last interface removed, then remove stage field also + if len(intfs) == 0 { + aclEntry.Remove("stage") + } + } + SkipDBProcessing: + } else { + aclEntry.Remove("stage") + aclEntry.SetList("ports", []string{}) + err = d.SetEntry(app.aclTs, aclKeys[i], aclEntry) + if err != nil { + return err + } + } + } + if isRequestedAclFound { + break + } + } + + return err +} + +/******************** CREATE related *******************************/ +func (app *AclApp) convertOCAclsToInternal() { + acl := app.getAppRootObject() + if acl != nil { + app.aclTableMap = make(map[string]db.Value) + if acl.AclSets != nil && len(acl.AclSets.AclSet) > 0 { + for aclSetKey, _ := range acl.AclSets.AclSet { + aclSet := acl.AclSets.AclSet[aclSetKey] + aclKey := getAclKeyStrFromOCKey(aclSetKey.Name, aclSetKey.Type) + app.aclTableMap[aclKey] = db.Value{Field: map[string]string{}} + + if aclSet.Config != nil { + if aclSet.Config.Type == ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4 { + app.aclTableMap[aclKey].Field[ACL_TYPE] = SONIC_ACL_TYPE_IPV4 + } else if aclSet.Config.Type == ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6 { + app.aclTableMap[aclKey].Field[ACL_TYPE] = SONIC_ACL_TYPE_IPV6 + } else if aclSet.Config.Type == ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2 { + app.aclTableMap[aclKey].Field[ACL_TYPE] = SONIC_ACL_TYPE_L2 + } + + if aclSet.Config.Description != nil && len(*aclSet.Config.Description) > 0 { + app.aclTableMap[aclKey].Field[ACL_DESCRIPTION] = *aclSet.Config.Description + } + } + } + } + } +} + +func (app *AclApp) convertOCAclRulesToInternal(d *db.DB) { + acl := app.getAppRootObject() + if acl != nil { + app.ruleTableMap = make(map[string]map[string]db.Value) + if acl.AclSets != nil && len(acl.AclSets.AclSet) > 0 { + for aclSetKey, _ := range acl.AclSets.AclSet { + aclSet := acl.AclSets.AclSet[aclSetKey] + aclKey := getAclKeyStrFromOCKey(aclSetKey.Name, aclSetKey.Type) + app.ruleTableMap[aclKey] = make(map[string]db.Value) + + if aclSet.AclEntries != nil { + for seqId, _ := range aclSet.AclEntries.AclEntry { + entrySet := aclSet.AclEntries.AclEntry[seqId] + ruleName := "RULE_" + strconv.Itoa(int(seqId)) + app.ruleTableMap[aclKey][ruleName] = db.Value{Field: map[string]string{}} + convertOCAclRuleToInternalAclRule(app.ruleTableMap[aclKey][ruleName], seqId, aclKey, aclSet.Type, entrySet) + } + } + + yangPathStr, _ := getYangPathFromUri(app.pathInfo.Path) + if yangPathStr != "/openconfig-acl:acl/acl-sets/acl-set/acl-entries" && yangPathStr != "/openconfig-acl:acl/acl-sets/acl-set/acl-entries/acl-entry" { + app.createDefaultDenyAclRule(d, aclKey, app.ruleTableMap[aclKey]) + } + } + } + } +} + +func (app *AclApp) convertOCAclBindingsToInternal() { + aclObj := app.getAppRootObject() + + if aclObj.Interfaces != nil && len(aclObj.Interfaces.Interface) > 0 { + aclInterfacesMap := make(map[string][]string) + // Below code assumes that an ACL can be either INGRESS or EGRESS but not both. + for intfId, _ := range aclObj.Interfaces.Interface { + intf := aclObj.Interfaces.Interface[intfId] + if intf != nil { + if intf.IngressAclSets != nil && len(intf.IngressAclSets.IngressAclSet) > 0 { + for inAclKey, _ := range intf.IngressAclSets.IngressAclSet { + aclName := getAclKeyStrFromOCKey(inAclKey.SetName, inAclKey.Type) + // TODO: Need to handle Subinterface also + if intf.InterfaceRef != nil && intf.InterfaceRef.Config.Interface != nil { + aclInterfacesMap[aclName] = append(aclInterfacesMap[aclName], *intf.InterfaceRef.Config.Interface) + } else { + aclInterfacesMap[aclName] = append(aclInterfacesMap[aclName], *intf.Id) + } + if len(app.aclTableMap) == 0 { + app.aclTableMap[aclName] = db.Value{Field: map[string]string{}} + } + app.aclTableMap[aclName].Field["stage"] = "INGRESS" + } + } + + if intf.EgressAclSets != nil && len(intf.EgressAclSets.EgressAclSet) > 0 { + for outAclKey, _ := range intf.EgressAclSets.EgressAclSet { + aclName := getAclKeyStrFromOCKey(outAclKey.SetName, outAclKey.Type) + if intf.InterfaceRef != nil && intf.InterfaceRef.Config.Interface != nil { + aclInterfacesMap[aclName] = append(aclInterfacesMap[aclName], *intf.InterfaceRef.Config.Interface) + } else { + aclInterfacesMap[aclName] = append(aclInterfacesMap[aclName], *intf.Id) + } + if len(app.aclTableMap) == 0 { + app.aclTableMap[aclName] = db.Value{Field: map[string]string{}} + } + app.aclTableMap[aclName].Field["stage"] = "EGRESS" + } + } + } + } + for k, _ := range aclInterfacesMap { + val := app.aclTableMap[k] + (&val).SetList("ports", aclInterfacesMap[k]) + } + } +} + +func (app *AclApp) createDefaultDenyAclRule(d *db.DB, aclName string, rulesInfo map[string]db.Value) { + existingRuleEntry, err := d.GetEntry(app.ruleTs, db.Key{Comp: []string{aclName, "DEFAULT_RULE"}}) + // If Default Rule already exists, Do not add new Default Rule + if existingRuleEntry.IsPopulated() && err == nil { + return + } + m := make(map[string]string) + rulesInfo["DEFAULT_RULE"] = db.Value{Field: m} + rulesInfo["DEFAULT_RULE"].Field["PRIORITY"] = strconv.FormatInt(int64(MIN_PRIORITY), 10) + rulesInfo["DEFAULT_RULE"].Field["PACKET_ACTION"] = "DROP" + rulesInfo["DEFAULT_RULE"].Field["IP_TYPE"] = "ANY" +} + +func convertOCAclRuleToInternalAclRule(ruleData db.Value, seqId uint32, aclName string, aclType ocbinds.E_OpenconfigAcl_ACL_TYPE, rule *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry) { + ruleIndex := seqId + ruleData.Field["PRIORITY"] = strconv.FormatInt(int64(MAX_PRIORITY-ruleIndex), 10) + // Rule Description is not supported in Sonic. So commenting this out. + /* + if rule.Config != nil && rule.Config.Description != nil { + ruleData.Field["RULE_DESCRIPTION"] = *rule.Config.Description + } + */ + + if ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4 == aclType { + convertOCToInternalIPv4(ruleData, aclName, ruleIndex, rule) + } else if ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6 == aclType { + convertOCToInternalIPv6(ruleData, aclName, ruleIndex, rule) + } else if ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2 == aclType { + convertOCToInternalL2(ruleData, aclName, ruleIndex, rule) + } /*else if ocbinds.OpenconfigAcl_ACL_TYPE_ACL_MIXED == aclType { + } */ + + convertOCToInternalTransport(ruleData, aclName, ruleIndex, rule) + convertOCToInternalInputInterface(ruleData, aclName, ruleIndex, rule) + convertOCToInternalInputAction(ruleData, aclName, ruleIndex, rule) +} + +func convertOCToInternalL2(ruleData db.Value, aclName string, ruleIndex uint32, rule *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry) { + if rule.L2 == nil { + return + } + if rule.L2.Config.Ethertype != nil && util.IsTypeStructPtr(reflect.TypeOf(rule.L2.Config.Ethertype)) { + ethertypeType := reflect.TypeOf(rule.L2.Config.Ethertype).Elem() + var b bytes.Buffer + switch ethertypeType { + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_Config_Ethertype_Union_E_OpenconfigPacketMatchTypes_ETHERTYPE{}): + v := (rule.L2.Config.Ethertype).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_Config_Ethertype_Union_E_OpenconfigPacketMatchTypes_ETHERTYPE) + //ruleData["ETHER_TYPE"] = v.E_OpenconfigPacketMatchTypes_ETHERTYPE.ΛMap()["E_OpenconfigPacketMatchTypes_ETHERTYPE"][int64(v.E_OpenconfigPacketMatchTypes_ETHERTYPE)].Name + fmt.Fprintf(&b, "0x%0.4x", ETHERTYPE_MAP[v.E_OpenconfigPacketMatchTypes_ETHERTYPE]) + ruleData.Field["ETHER_TYPE"] = b.String() + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_Config_Ethertype_Union_Uint16{}): + v := (rule.L2.Config.Ethertype).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_Config_Ethertype_Union_Uint16) + fmt.Fprintf(&b, "0x%0.4x", v.Uint16) + ruleData.Field["ETHER_TYPE"] = b.String() + } + } +} + +func convertOCToInternalIPv4(ruleData db.Value, aclName string, ruleIndex uint32, rule *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry) { + if rule.Ipv4.Config.Protocol != nil && util.IsTypeStructPtr(reflect.TypeOf(rule.Ipv4.Config.Protocol)) { + protocolType := reflect.TypeOf(rule.Ipv4.Config.Protocol).Elem() + switch protocolType { + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_Config_Protocol_Union_E_OpenconfigPacketMatchTypes_IP_PROTOCOL{}): + v := (rule.Ipv4.Config.Protocol).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_Config_Protocol_Union_E_OpenconfigPacketMatchTypes_IP_PROTOCOL) + //ruleData["IP_PROTOCOL"] = v.E_OpenconfigPacketMatchTypes_IP_PROTOCOL.ΛMap()["E_OpenconfigPacketMatchTypes_IP_PROTOCOL"][int64(v.E_OpenconfigPacketMatchTypes_IP_PROTOCOL)].Name + ruleData.Field["IP_PROTOCOL"] = strconv.FormatInt(int64(IP_PROTOCOL_MAP[v.E_OpenconfigPacketMatchTypes_IP_PROTOCOL]), 10) + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_Config_Protocol_Union_Uint8{}): + v := (rule.Ipv4.Config.Protocol).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_Config_Protocol_Union_Uint8) + ruleData.Field["IP_PROTOCOL"] = strconv.FormatInt(int64(v.Uint8), 10) + } + } + + if rule.Ipv4.Config.Dscp != nil { + ruleData.Field["DSCP"] = strconv.FormatInt(int64(*rule.Ipv4.Config.Dscp), 10) + } + if rule.Ipv4.Config.SourceAddress != nil { + ruleData.Field["SRC_IP"] = *rule.Ipv4.Config.SourceAddress + } + if rule.Ipv4.Config.DestinationAddress != nil { + ruleData.Field["DST_IP"] = *rule.Ipv4.Config.DestinationAddress + } +} + +func convertOCToInternalIPv6(ruleData db.Value, aclName string, ruleIndex uint32, rule *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry) { + if rule.Ipv6.Config.Protocol != nil && util.IsTypeStructPtr(reflect.TypeOf(rule.Ipv6.Config.Protocol)) { + protocolType := reflect.TypeOf(rule.Ipv6.Config.Protocol).Elem() + switch protocolType { + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv6_Config_Protocol_Union_E_OpenconfigPacketMatchTypes_IP_PROTOCOL{}): + v := (rule.Ipv6.Config.Protocol).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv6_Config_Protocol_Union_E_OpenconfigPacketMatchTypes_IP_PROTOCOL) + //ruleData["IP_PROTOCOL"] = v.E_OpenconfigPacketMatchTypes_IP_PROTOCOL.ΛMap()["E_OpenconfigPacketMatchTypes_IP_PROTOCOL"][int64(v.E_OpenconfigPacketMatchTypes_IP_PROTOCOL)].Name + ruleData.Field["IP_PROTOCOL"] = strconv.FormatInt(int64(IP_PROTOCOL_MAP[v.E_OpenconfigPacketMatchTypes_IP_PROTOCOL]), 10) + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv6_Config_Protocol_Union_Uint8{}): + v := (rule.Ipv6.Config.Protocol).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv6_Config_Protocol_Union_Uint8) + ruleData.Field["IP_PROTOCOL"] = strconv.FormatInt(int64(v.Uint8), 10) + } + } + + if rule.Ipv6.Config.Dscp != nil { + ruleData.Field["DSCP"] = strconv.FormatInt(int64(*rule.Ipv6.Config.Dscp), 10) + } + if rule.Ipv6.Config.SourceAddress != nil { + ruleData.Field["SRC_IPV6"] = *rule.Ipv6.Config.SourceAddress + } + if rule.Ipv6.Config.DestinationAddress != nil { + ruleData.Field["DST_IPV6"] = *rule.Ipv6.Config.DestinationAddress + } + if rule.Ipv6.Config.SourceFlowLabel != nil { + ruleData.Field["SRC_FLOWLABEL"] = strconv.FormatInt(int64(*rule.Ipv6.Config.SourceFlowLabel), 10) + } + if rule.Ipv6.Config.DestinationFlowLabel != nil { + ruleData.Field["DST_FLOWLABEL"] = strconv.FormatInt(int64(*rule.Ipv6.Config.DestinationFlowLabel), 10) + } +} + +func convertOCToInternalTransport(ruleData db.Value, aclName string, ruleIndex uint32, rule *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry) { + if rule.Transport == nil { + return + } + if rule.Transport.Config.SourcePort != nil && util.IsTypeStructPtr(reflect.TypeOf(rule.Transport.Config.SourcePort)) { + sourceportType := reflect.TypeOf(rule.Transport.Config.SourcePort).Elem() + switch sourceportType { + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort{}): + v := (rule.Transport.Config.SourcePort).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort) + ruleData.Field["L4_SRC_PORT"] = v.E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort.ΛMap()["E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort"][int64(v.E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort)].Name + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_String{}): + v := (rule.Transport.Config.SourcePort).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_String) + ruleData.Field["L4_SRC_PORT_RANGE"] = strings.Replace(v.String, "..", "-", 1) + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_Uint16{}): + v := (rule.Transport.Config.SourcePort).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_Uint16) + ruleData.Field["L4_SRC_PORT"] = strconv.FormatInt(int64(v.Uint16), 10) + } + } + + if rule.Transport.Config.DestinationPort != nil && util.IsTypeStructPtr(reflect.TypeOf(rule.Transport.Config.DestinationPort)) { + destportType := reflect.TypeOf(rule.Transport.Config.DestinationPort).Elem() + switch destportType { + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort{}): + v := (rule.Transport.Config.DestinationPort).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort) + ruleData.Field["L4_DST_PORT"] = v.E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort.ΛMap()["E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort"][int64(v.E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort)].Name + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_String{}): + v := (rule.Transport.Config.DestinationPort).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_String) + ruleData.Field["L4_DST_PORT_RANGE"] = strings.Replace(v.String, "..", "-", 1) + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_Uint16{}): + v := (rule.Transport.Config.DestinationPort).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_Uint16) + ruleData.Field["L4_DST_PORT"] = strconv.FormatInt(int64(v.Uint16), 10) + } + } + + var tcpFlags uint32 = 0x00 + if len(rule.Transport.Config.TcpFlags) > 0 { + for _, flag := range rule.Transport.Config.TcpFlags { + switch flag { + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_FIN: + tcpFlags |= 0x01 + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_SYN: + tcpFlags |= 0x02 + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_RST: + tcpFlags |= 0x04 + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_PSH: + tcpFlags |= 0x08 + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_ACK: + tcpFlags |= 0x10 + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_URG: + tcpFlags |= 0x20 + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_ECE: + tcpFlags |= 0x40 + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_CWR: + tcpFlags |= 0x80 + } + } + var b bytes.Buffer + fmt.Fprintf(&b, "0x%0.2x/0x%0.2x", tcpFlags, tcpFlags) + ruleData.Field["TCP_FLAGS"] = b.String() + } +} + +func convertOCToInternalInputInterface(ruleData db.Value, aclName string, ruleIndex uint32, rule *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry) { + if rule.InputInterface != nil && rule.InputInterface.InterfaceRef != nil { + ruleData.Field["IN_PORTS"] = *rule.InputInterface.InterfaceRef.Config.Interface + } +} + +func convertOCToInternalInputAction(ruleData db.Value, aclName string, ruleIndex uint32, rule *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry) { + if rule.Actions != nil && rule.Actions.Config != nil { + switch rule.Actions.Config.ForwardingAction { + case ocbinds.OpenconfigAcl_FORWARDING_ACTION_ACCEPT: + ruleData.Field["PACKET_ACTION"] = "FORWARD" + case ocbinds.OpenconfigAcl_FORWARDING_ACTION_DROP, ocbinds.OpenconfigAcl_FORWARDING_ACTION_REJECT: + ruleData.Field["PACKET_ACTION"] = "DROP" + default: + } + } +} + +func (app *AclApp) handleRuleFieldsDeletion(d *db.DB, aclKey string, ruleKey string) error { + var err error + + ruleEntry, err := d.GetEntry(app.ruleTs, asKey(aclKey, ruleKey)) + if err != nil { + return err + } + nodeInfo, err := getTargetNodeYangSchema(app.pathInfo.Path, (*app.ygotRoot).(*ocbinds.Device)) + if err != nil { + return err + } + if nodeInfo.IsLeaf() { + switch nodeInfo.Name { + case "description": + (&ruleEntry).Remove("RULE_DESCRIPTION") + // L2 + case "ethertype": + (&ruleEntry).Remove("ETHER_TYPE") + // IPv4/IPv6 + case "source-address": + if strings.Contains(app.pathInfo.Path, "ipv4/config") { + (&ruleEntry).Remove("SRC_IP") + } else if strings.Contains(app.pathInfo.Path, "ipv6/config") { + (&ruleEntry).Remove("SRC_IPV6") + } + case "destination-address": + if strings.Contains(app.pathInfo.Path, "ipv4/config") { + (&ruleEntry).Remove("DST_IP") + } else if strings.Contains(app.pathInfo.Path, "ipv6/config") { + (&ruleEntry).Remove("DST_IPV6") + } + case "dscp": + (&ruleEntry).Remove("DSCP") + case "protocol": + (&ruleEntry).Remove("IP_PROTOCOL") + // transport + case "source-port": + (&ruleEntry).Remove("L4_SRC_PORT") + (&ruleEntry).Remove("L4_SRC_PORT_RANGE") + case "destination-port": + (&ruleEntry).Remove("L4_DST_PORT") + (&ruleEntry).Remove("L4_DST_PORT_RANGE") + // actions + case "forwarding-action": + (&ruleEntry).Remove("PACKET_ACTION") + //input-interface + case "interface": + (&ruleEntry).Remove("IN_PORTS") + //case "subinterface": + } + } else if nodeInfo.IsContainer() { + targetType := reflect.TypeOf(*app.ygotTarget) + switch targetType.Elem().Name() { + case "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2", "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_Config": + (&ruleEntry).Remove("ETHER_TYPE") + case "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4", "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_Config": + (&ruleEntry).Remove("IP_PROTOCOL") + (&ruleEntry).Remove("SRC_IP") + (&ruleEntry).Remove("DST_IP") + (&ruleEntry).Remove("DSCP") + case "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv6", "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv6_Config": + (&ruleEntry).Remove("IP_PROTOCOL") + (&ruleEntry).Remove("SRC_IPV6") + (&ruleEntry).Remove("DST_IPV6") + (&ruleEntry).Remove("DSCP") + case "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport", "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config": + (&ruleEntry).Remove("L4_SRC_PORT") + (&ruleEntry).Remove("L4_SRC_PORT_RANGE") + (&ruleEntry).Remove("L4_DST_PORT") + (&ruleEntry).Remove("L4_DST_PORT_RANGE") + (&ruleEntry).Remove("TCP_FLAGS") + case "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_InputInterface", "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_InputInterface_InterfaceRef", "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_InputInterface_InterfaceRef_Config": + (&ruleEntry).Remove("IN_PORTS") + case "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Actions", "OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Actions_Config": + (&ruleEntry).Remove("PACKET_ACTION") + } + } else if nodeInfo.IsLeafList() { + switch nodeInfo.Name { + case "tcp-flags": + (&ruleEntry).Remove("TCP_FLAGS") + } + } else { + log.Error("This yang type is not handled currently") + } + err = d.SetEntry(app.ruleTs, asKey(aclKey, ruleKey), ruleEntry) + + return err +} + +func (app *AclApp) setAclDataInConfigDb(d *db.DB, aclData map[string]db.Value, createFlag bool) error { + var err error + for key := range aclData { + existingEntry, err := d.GetEntry(app.aclTs, db.Key{Comp: []string{key}}) + // If Create ACL request comes and ACL already exists, throw error + if createFlag && existingEntry.IsPopulated() { + return tlerr.AlreadyExists("Acl %s already exists", key) + } + if createFlag || (!createFlag && err != nil && !existingEntry.IsPopulated()) { + err := d.CreateEntry(app.aclTs, db.Key{Comp: []string{key}}, aclData[key]) + if err != nil { + return err + } + } else { + if existingEntry.IsPopulated() { + if existingEntry.Get(ACL_DESCRIPTION) != aclData[key].Field[ACL_DESCRIPTION] { + err := d.ModEntry(app.aclTs, db.Key{Comp: []string{key}}, aclData[key]) + if err != nil { + return err + } + } + } + } + } + return err +} + +func (app *AclApp) setAclRuleDataInConfigDb(d *db.DB, ruleData map[string]map[string]db.Value, createFlag bool) error { + var err error + for aclName := range ruleData { + for ruleName := range ruleData[aclName] { + existingRuleEntry, err := d.GetEntry(app.ruleTs, db.Key{Comp: []string{aclName, ruleName}}) + // If Create Rule request comes and Rule already exists, throw error + if createFlag && existingRuleEntry.IsPopulated() { + return tlerr.AlreadyExists("Rule %s already exists", ruleName) + } + if createFlag || (!createFlag && err != nil && !existingRuleEntry.IsPopulated()) { + err := d.CreateEntry(app.ruleTs, db.Key{Comp: []string{aclName, ruleName}}, ruleData[aclName][ruleName]) + if err != nil { + return err + } + } else { + if existingRuleEntry.IsPopulated() && ruleName != "DEFAULT_RULE" { + err := d.ModEntry(app.ruleTs, db.Key{Comp: []string{aclName, ruleName}}, ruleData[aclName][ruleName]) + if err != nil { + return err + } + } + } + } + } + return err +} + +func (app *AclApp) setAclBindDataInConfigDb(d *db.DB, aclData map[string]db.Value, opcode int) error { + var err error + for aclKey, aclInfo := range aclData { + // Get ACL info from DB + dbAcl, err := d.GetEntry(app.aclTs, db.Key{Comp: []string{aclKey}}) + if err != nil { + return err + } + if REPLACE == opcode { + dbAcl.SetList("ports", aclInfo.GetList("ports")) + dbAcl.Set("stage", aclInfo.Get("stage")) + } else { + dbAclIntfs := dbAcl.GetList("ports") + if len(dbAclIntfs) > 0 { + dbAclDirec := dbAcl.Get("stage") + newDirec := aclInfo.Get("stage") + if (UPDATE == opcode) && (len(dbAclDirec) > 0) && (len(newDirec) > 0) && (dbAclDirec != newDirec) { + return tlerr.InvalidArgs("Acl direction of %s not allowed when it is already configured as %s", newDirec, dbAclDirec) + } + // Merge interfaces from DB to list in aclInfo and set back in DB + intfs := aclInfo.GetList("ports") + for _, ifId := range dbAclIntfs { + if !contains(intfs, ifId) { + intfs = append(intfs, ifId) + } + } + dbAcl.SetList("ports", intfs) + } else { + dbAcl.SetList("ports", aclInfo.GetList("ports")) + } + + if len(dbAcl.Get("stage")) == 0 { + dbAcl.Set("stage", aclInfo.Get("stage")) + } + } + err = d.SetEntry(app.aclTs, db.Key{Comp: []string{aclKey}}, dbAcl) + //err = d.ModEntry(app.aclTs, db.Key{Comp: []string{aclKey}}, dbAcl) + if err != nil { + return err + } + } + return err +} + +func getIpProtocol(proto int64) interface{} { + for k, v := range IP_PROTOCOL_MAP { + if uint8(proto) == v { + return k + } + } + return uint8(proto) +} + +func getTransportSrcDestPorts(portVal string, portType string) interface{} { + var portRange string = "" + + portNum, err := strconv.Atoi(portVal) + if err != nil && strings.Contains(portVal, "-") { + portRange = portVal + } + + if len(portRange) > 0 { + return portRange + } else if portNum > 0 { + return uint16(portNum) + } else { + if "src" == portType { + return ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_ANY + } else if "dest" == portType { + return ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_ANY + } + } + return nil +} + +func getTransportConfigTcpFlags(tcpFlags string) []ocbinds.E_OpenconfigPacketMatchTypes_TCP_FLAGS { + var flags []ocbinds.E_OpenconfigPacketMatchTypes_TCP_FLAGS + if len(tcpFlags) > 0 { + flagStr := strings.Split(tcpFlags, "/")[0] + flagNumber, _ := strconv.ParseUint(strings.Replace(flagStr, "0x", "", -1), 16, 32) + for i := 0; i < 8; i++ { + mask := 1 << uint(i) + if (int(flagNumber) & mask) > 0 { + switch int(flagNumber) & mask { + case 0x01: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_FIN) + case 0x02: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_SYN) + case 0x04: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_RST) + case 0x08: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_PSH) + case 0x10: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_ACK) + case 0x20: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_URG) + case 0x40: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_ECE) + case 0x80: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_CWR) + default: + } + } + } + } + return flags +} + +func getL2EtherType(etherType uint64) interface{} { + for k, v := range ETHERTYPE_MAP { + if uint32(etherType) == v { + return k + } + } + return uint16(etherType) +} + +func getAclKeysFromStrKey(aclKey string, aclType string) (string, ocbinds.E_OpenconfigAcl_ACL_TYPE) { + var aclOrigName string + var aclOrigType ocbinds.E_OpenconfigAcl_ACL_TYPE + + if SONIC_ACL_TYPE_IPV4 == aclType { + aclOrigName = strings.Replace(aclKey, "_"+OPENCONFIG_ACL_TYPE_IPV4, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4 + } else if SONIC_ACL_TYPE_IPV6 == aclType { + aclOrigName = strings.Replace(aclKey, "_"+OPENCONFIG_ACL_TYPE_IPV6, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6 + } else if SONIC_ACL_TYPE_L2 == aclType { + aclOrigName = strings.Replace(aclKey, "_"+OPENCONFIG_ACL_TYPE_L2, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2 + } + return aclOrigName, aclOrigType +} + +// getAclTypeOCEnumFromName returns the ACL_TYPE enum from name +func getAclTypeOCEnumFromName(val string) (ocbinds.E_OpenconfigAcl_ACL_TYPE, error) { + switch val { + case "ACL_IPV4", "openconfig-acl:ACL_IPV4": + return ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4, nil + case "ACL_IPV6", "openconfig-acl:ACL_IPV6": + return ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6, nil + case "ACL_L2", "openconfig-acl:ACL_L2": + return ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2, nil + default: + return ocbinds.OpenconfigAcl_ACL_TYPE_UNSET, + tlerr.NotSupported("ACL Type '%s' not supported", val) + } +} + +func getAclKeyStrFromOCKey(aclname string, acltype ocbinds.E_OpenconfigAcl_ACL_TYPE) string { + aclN := strings.Replace(strings.Replace(aclname, " ", "_", -1), "-", "_", -1) + aclT := acltype.ΛMap()["E_OpenconfigAcl_ACL_TYPE"][int64(acltype)].Name + return aclN + "_" + aclT +} + +/* Check if targetUriPath is child (subtree) of nodePath +The return value can be used to decide if subtrees needs +to visited to fill the data or not. +*/ +func isSubtreeRequest(targetUriPath string, nodePath string) bool { + return strings.HasPrefix(targetUriPath, nodePath) +} diff --git a/src/translib/acl_app_test.go b/src/translib/acl_app_test.go new file mode 100644 index 0000000000..d1773866ac --- /dev/null +++ b/src/translib/acl_app_test.go @@ -0,0 +1,572 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package translib + +import ( + "errors" + "fmt" + "os" + "reflect" + "strings" + "testing" + db "translib/db" +) + +func init() { + fmt.Println("+++++ Init acl_app_test +++++") +} + +func TestMain(m *testing.M) { + if err := clearAclDataFromDb(); err != nil { + os.Exit(-1) + } + fmt.Println("+++++ Removed All Acl Data from Db +++++") + + ret := m.Run() + + if err := clearAclDataFromDb(); err != nil { + os.Exit(-1) + } + + os.Exit(ret) +} + +// This will test GET on /openconfig-acl:acl +func Test_AclApp_TopLevelPath(t *testing.T) { + url := "/openconfig-acl:acl" + + t.Run("Empty_Response_Top_Level", processGetRequest(url, emptyJson, false)) + + t.Run("Bulk_Create_Top_Level", processSetRequest(url, bulkAclCreateJsonRequest, "POST", false)) + + t.Run("Get_Full_Acl_Tree_Top_Level", processGetRequest(url, bulkAclCreateJsonResponse, false)) + + // Delete all bindings before deleting at top level + t.Run("Delete_All_Bindings_Top_Level", processDeleteRequest("/openconfig-acl:acl/interfaces")) + t.Run("Delete_Full_ACl_Tree_Top_Level", processDeleteRequest(url)) + + t.Run("Verify_Top_Level_Delete", processGetRequest(url, emptyJson, false)) +} + +func Test_AclApp_SingleAclOperations(t *testing.T) { + url := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL3][type=ACL_IPV4]" + + t.Run("Create_One_Acl_With_Multiple_Rules(PATCH)", processSetRequest(url, oneAclCreateWithRulesJsonRequest, "PATCH", false)) + + t.Run("Verify_Create_One_Acl_With_Multiple_Rules", processGetRequest(url, oneAclCreateWithRulesJsonResponse, false)) + + aclDescrUrl := url + "/config/description" + t.Run("Delete Acl_Description", processDeleteRequest(aclDescrUrl)) + t.Run("Verify_Acl_Description_Deletion", processGetRequest(aclDescrUrl, emptyAclDescriptionJson, false)) + + createAclDescrUrl := url + "/config" + t.Run("Create_new_Acl_Description", processSetRequest(createAclDescrUrl, aclDescrUpdateJson, "POST", false)) + t.Run("Verify_Description_of_Acl", processGetRequest(aclDescrUrl, aclDescrUpdateJson, false)) + + t.Run("Delete_One_Acl_With_All_Its_Rules", processDeleteRequest(url)) + + t.Run("Verify_One_Acl_Delete", processGetRequest(url, "", true)) +} + +func Test_AclApp_SingleRuleOperations(t *testing.T) { + aclUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]" + ruleUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]/acl-entries/acl-entry[sequence-id=8]" + + t.Run("Create_One_Acl_Without_Rule", processSetRequest(aclUrl, oneAclCreateJsonRequest, "POST", false)) + t.Run("Get_One_Acl_Without_Rule", processGetRequest(aclUrl, oneAclCreateJsonResponse, false)) + + t.Run("Create_One_Rule", processSetRequest(ruleUrl, requestOneRulePostJson, "POST", false)) + t.Run("Get_One_Rule", processGetRequest(ruleUrl, responseOneRuleJson, false)) + + // Change Source/Desination address and protocol + t.Run("Update_Existing_Rule", processSetRequest(ruleUrl, requestOneRulePatchJson, "PATCH", false)) + t.Run("Verify_One_Rule_Updation", processGetRequest(ruleUrl, responseOneRulePatchJson, false)) + + tcpFlagsUrl := ruleUrl + "/transport/config/tcp-flags" + t.Run("Delete_Tcp_Flags_Field", processDeleteRequest(tcpFlagsUrl)) + t.Run("Verify_Tcp_Flags_Deletion", processGetRequest(tcpFlagsUrl, emptyJson, false)) + + dscpUrl := ruleUrl + "/ipv4/config/dscp" + t.Run("Delete_IPv4_Dscp_Field", processDeleteRequest(dscpUrl)) + t.Run("Verify_IPv4_Dscp_Deletion", processGetRequest(dscpUrl, emptyRuleDscpJson, false)) + + protocolUrl := ruleUrl + "/ipv4/config/protocol" + t.Run("Delete_IPv4_Protocol_Field", processDeleteRequest(protocolUrl)) + t.Run("Verify_IPv4_Protocol_Deletion", processGetRequest(protocolUrl, emptyJson, false)) + + transportConfigUrl := ruleUrl + "/transport" + t.Run("Delete_Transport_Container", processDeleteRequest(transportConfigUrl)) + t.Run("Verify_Transport_Container_Deletion", processGetRequest(transportConfigUrl, emptyJson, false)) + + ipv4ConfigUrl := ruleUrl + "/ipv4/config" + t.Run("Delete_IPv4_Config_Container", processDeleteRequest(ipv4ConfigUrl)) + t.Run("Verify_IPv4_Config_Container_Deletion", processGetRequest(ipv4ConfigUrl, emptyJson, false)) + + t.Run("Delete_One_Rule", processDeleteRequest(ruleUrl)) + t.Run("Verify_One_Rule_Delete", processGetRequest(ruleUrl, "", true)) + + t.Run("Delete_One_Acl", processDeleteRequest(aclUrl)) + t.Run("Verify_One_Acl_Delete", processGetRequest(aclUrl, "", true)) +} + +// This will test PUT (Replace) operation by Replacing multiple Rules with one Rule in an Acl +func Test_AclApp_ReplaceMultipleRulesWithOneRule(t *testing.T) { + url := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL3][type=ACL_IPV4]" + + t.Run("Create_One_Acl_With_Multiple_Rules(PATCH)", processSetRequest(url, oneAclCreateWithRulesJsonRequest, "PATCH", false)) + t.Run("Verify_Create_One_Acl_With_Multiple_Rules", processGetRequest(url, oneAclCreateWithRulesJsonResponse, false)) + + t.Run("Replace_All_Rules_With_One_Rule", processSetRequest(url, replaceMultiRulesWithOneRuleJsonRequest, "PUT", false)) + t.Run("Verify_Acl_With_Replaced_Rules", processGetRequest(url, replaceMultiRulesWithOneRuleJsonResponse, false)) + + t.Run("Delete_One_Acl_With_All_Its_Rules", processDeleteRequest(url)) + t.Run("Verify_One_Acl_Delete", processGetRequest(url, "", true)) +} + +// This will test PATCH operation by modifying Description of an Acl +func Test_AclApp_AclDescriptionUpdation(t *testing.T) { + aclUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]" + descrUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]/config/description" + + t.Run("Create_One_Acl_Without_Rule", processSetRequest(aclUrl, oneAclCreateJsonRequest, "POST", false)) + + t.Run("Update_Description_of_Acl", processSetRequest(descrUrl, aclDescrUpdateJson, "PATCH", false)) + t.Run("Verify_Description_of_Acl", processGetRequest(descrUrl, aclDescrUpdateJson, false)) + + t.Run("Delete_One_Acl", processDeleteRequest(aclUrl)) + t.Run("Verify_One_Acl_Delete", processGetRequest(aclUrl, "", true)) +} + +func Test_AclApp_AclIngressBindingOperations(t *testing.T) { + aclUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]" + ruleUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]/acl-entries/acl-entry[sequence-id=8]" + bindingUrl := "/openconfig-acl:acl/interfaces/interface[id=Ethernet4]/ingress-acl-sets/ingress-acl-set[set-name=MyACL5][type=ACL_IPV4]" + + t.Run("Create_One_Acl_Without_Rule", processSetRequest(aclUrl, oneAclCreateJsonRequest, "POST", false)) + + t.Run("Create_One_Rule", processSetRequest(ruleUrl, requestOneRulePostJson, "POST", false)) + + t.Run("Create_Ingress_Acl_set", processSetRequest(bindingUrl, ingressAclSetCreateJsonRequest, "POST", false)) + t.Run("Verify_Ingress_Aclset_Creation", processGetRequest(bindingUrl, ingressAclSetCreateJsonResponse, false)) + t.Run("Get_Port_Binding_From_Ingress_AclEntry_Level", processGetRequest(bindingUrl+"/acl-entries/acl-entry[sequence-id=8]", getBindingAclEntryResponse, false)) + + t.Run("Delete_Binding_From_Ingress_Aclset", processDeleteRequest(bindingUrl)) + t.Run("Verify_Binding_From_Ingress_Aclset_Deletion", processGetRequest(bindingUrl, "", true)) + t.Run("Delete_One_Rule", processDeleteRequest(ruleUrl)) + t.Run("Verify_One_Rule_Delete", processGetRequest(ruleUrl, "", true)) + + t.Run("Delete_One_Acl", processDeleteRequest(aclUrl)) + t.Run("Verify_One_Acl_Delete", processGetRequest(aclUrl, "", true)) +} + +func Test_AclApp_AclEgressBindingOperations(t *testing.T) { + aclUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]" + ruleUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]/acl-entries/acl-entry[sequence-id=8]" + bindingUrl := "/openconfig-acl:acl/interfaces/interface[id=Ethernet4]/egress-acl-sets/egress-acl-set[set-name=MyACL5][type=ACL_IPV4]" + + t.Run("Create_One_Acl_Without_Rule", processSetRequest(aclUrl, oneAclCreateJsonRequest, "POST", false)) + + t.Run("Create_One_Rule", processSetRequest(ruleUrl, requestOneRulePostJson, "POST", false)) + + t.Run("Create_Egress_Acl_set", processSetRequest(bindingUrl, ingressAclSetCreateJsonRequest, "POST", false)) + t.Run("Verify_Egress_Aclset_Creation", processGetRequest(bindingUrl, egressAclSetCreateJsonResponse, false)) + t.Run("Get_Port_Binding_From_Egress_AclEntry_Level", processGetRequest(bindingUrl+"/acl-entries/acl-entry[sequence-id=8]", getBindingAclEntryResponse, false)) + + t.Run("Delete_Binding_From_Egress_Aclset", processDeleteRequest(bindingUrl)) + t.Run("Verify_Binding_From_Egress_Aclset_Deletion", processGetRequest(bindingUrl, "", true)) + t.Run("Delete_One_Rule", processDeleteRequest(ruleUrl)) + t.Run("Verify_One_Rule_Delete", processGetRequest(ruleUrl, "", true)) + + t.Run("Delete_One_Acl", processDeleteRequest(aclUrl)) + t.Run("Verify_One_Acl_Delete", processGetRequest(aclUrl, "", true)) +} + +func Test_AclApp_GetOperationsFromMultipleTreeLevels(t *testing.T) { + aclUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]" + ruleUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]/acl-entries/acl-entry[sequence-id=8]" + bindingUrl := "/openconfig-acl:acl/interfaces/interface[id=Ethernet4]/egress-acl-sets/egress-acl-set[set-name=MyACL5][type=ACL_IPV4]" + + t.Run("Create_One_Acl_Without_Rule", processSetRequest(aclUrl, oneAclCreateJsonRequest, "POST", false)) + t.Run("Create_One_Rule", processSetRequest(ruleUrl, requestOneRulePostJson, "POST", false)) + t.Run("Create_Egress_Acl_set_Port_Binding", processSetRequest(bindingUrl, ingressAclSetCreateJsonRequest, "POST", false)) + + t.Run("Get_Acl_Tree_From_AclSets_level", processGetRequest("/openconfig-acl:acl/acl-sets", getFromAclSetsTreeLevelResponse, false)) + + t.Run("Get_All_Ports_Bindings_From_Interfaces_Tree_Level", processGetRequest("/openconfig-acl:acl/interfaces", getAllPortsFromInterfacesTreeLevelResponse, false)) + + t.Run("Get_One_Port_Binding_From_Interface_Tree_Level", processGetRequest("/openconfig-acl:acl/interfaces/interface[id=Ethernet4]", getPortBindingFromInterfaceTreeLevelResponse, false)) + + t.Run("Delete_Binding_From_Egress_Aclset", processDeleteRequest(bindingUrl)) + t.Run("Verify_Binding_From_Egress_Aclset_Deletion", processGetRequest(bindingUrl, "", true)) + + t.Run("Delete_One_Rule", processDeleteRequest(ruleUrl)) + t.Run("Verify_One_Rule_Delete", processGetRequest(ruleUrl, "", true)) + + t.Run("Delete_One_Acl", processDeleteRequest(aclUrl)) + t.Run("Verify_One_Acl_Delete", processGetRequest(aclUrl, "", true)) +} + +func Test_AclApp_AddNewPortBindingToAlreadyBindedAcl(t *testing.T) { + aclUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]" + ruleUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]/acl-entries/acl-entry[sequence-id=8]" + bindingUrl := "/openconfig-acl:acl/interfaces/interface[id=Ethernet4]/egress-acl-sets/egress-acl-set[set-name=MyACL5][type=ACL_IPV4]" + + t.Run("Create_One_Acl_Without_Rule", processSetRequest(aclUrl, oneAclCreateJsonRequest, "POST", false)) + t.Run("Create_One_Rule", processSetRequest(ruleUrl, requestOneRulePostJson, "POST", false)) + t.Run("Create_Egress_Acl_set_Port_Binding", processSetRequest(bindingUrl, ingressAclSetCreateJsonRequest, "POST", false)) + + newBindingUrl := "/openconfig-acl:acl/interfaces/interface[id=Ethernet0]/egress-acl-sets/egress-acl-set[set-name=MyACL5][type=ACL_IPV4]" + t.Run("Create_New_Egress_Acl_set_Port_Binding", processSetRequest(newBindingUrl, ingressAclSetCreateJsonRequest, "POST", false)) + + t.Run("Get_All_Ports_Bindings_From_Interfaces_Tree_Level", processGetRequest("/openconfig-acl:acl/interfaces", getMultiportBindingOnSingleAclResponse, false)) + + t.Run("Delete_All_Bindings_Top_Level", processDeleteRequest("/openconfig-acl:acl/interfaces")) + t.Run("Delete_All_Rules_Not_Acl", processDeleteRequest("/openconfig-acl:acl/acl-sets/acl-set[name=MyACL5][type=ACL_IPV4]/acl-entries")) + + t.Run("Delete_One_Acl", processDeleteRequest(aclUrl)) + t.Run("Verify_One_Acl_Delete", processGetRequest(aclUrl, "", true)) + + t.Run("Verify_Top_Level_Delete", processGetRequest("/openconfig-acl:acl", emptyJson, false)) +} + +func Test_AclApp_IPv6AclAndRule(t *testing.T) { + aclUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL6][type=ACL_IPV6]" + ruleUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL6][type=ACL_IPV6]/acl-entries/acl-entry[sequence-id=6]" + bindingUrl := "/openconfig-acl:acl/interfaces/interface[id=Ethernet4]/ingress-acl-sets/ingress-acl-set[set-name=MyACL6][type=ACL_IPV6]" + + t.Run("Create_One_IPv6_Acl_Without_Rule", processSetRequest(aclUrl, oneIPv6AclCreateJsonRequest, "POST", false)) + t.Run("Verify_One_IPv6_Acl_Without_Rule_Creation", processGetRequest(aclUrl, oneIPv6AclCreateJsonResponse, false)) + + t.Run("Create_One_IPv6_Rule", processSetRequest(ruleUrl, oneIPv6RuleCreateJsonRequest, "POST", false)) + t.Run("Verify_One_IPv6_Rule_Creation", processGetRequest(ruleUrl, oneIPv6RuleCreateJsonResponse, false)) + + t.Run("Create_Ingress_Acl_set", processSetRequest(bindingUrl, ingressIPv6AclSetCreateJsonRequest, "POST", false)) + t.Run("Verify_Ingress_Aclset_Creation", processGetRequest(bindingUrl, ingressIPv6AclSetCreateJsonResponse, false)) + + t.Run("Get_Acl_Tree_From_AclSet_level", processGetRequest("/openconfig-acl:acl/acl-sets/acl-set", getIPv6AclsFromAclSetListLevelResponse, false)) + t.Run("Get_All_Ports_Bindings_From_Interfaces_Tree_Level", processGetRequest("/openconfig-acl:acl/interfaces", getIPv6AllPortsBindingsResponse, false)) + + t.Run("Delete_Binding_From_Ingress_Aclset", processDeleteRequest(bindingUrl)) + t.Run("Verify_Binding_From_Ingress_Aclset_Deletion", processGetRequest(bindingUrl, "", true)) + + pktActionUrl := ruleUrl + "/actions/config/forwarding-action" + t.Run("Delete_Packet_Action_Field", processDeleteRequest(pktActionUrl)) + t.Run("Verify_Packet_Action_Field_Deletion", processGetRequest(pktActionUrl, emptyJson, false)) + + ipv6ConfigUrl := ruleUrl + "/ipv6/config" + t.Run("Delete_IPv6_Config", processDeleteRequest(ipv6ConfigUrl)) + t.Run("Verify_IPv6_Config_Deletion", processGetRequest(ipv6ConfigUrl, emptyJson, false)) + + t.Run("Delete_One_Rule", processDeleteRequest(ruleUrl)) + t.Run("Delete_One_Acl", processDeleteRequest(aclUrl)) + t.Run("Verify_One_Acl_Delete", processGetRequest(aclUrl, "", true)) +} + +func Test_AclApp_L2AclAndRule(t *testing.T) { + aclUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL2][type=ACL_L2]" + ruleUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL2][type=ACL_L2]/acl-entries/acl-entry[sequence-id=2]" + bindingUrl := "/openconfig-acl:acl/interfaces/interface[id=Ethernet0]/ingress-acl-sets/ingress-acl-set[set-name=MyACL2][type=ACL_L2]" + + t.Run("Create_One_L2_Acl_Without_Rule", processSetRequest(aclUrl, oneL2AclCreateJsonRequest, "POST", false)) + t.Run("Verify_One_L2_Acl_Without_Rule_Creation", processGetRequest(aclUrl, oneL2AclCreateJsonResponse, false)) + + t.Run("Create_One_L2_Rule", processSetRequest(ruleUrl, oneL2RuleCreateJsonRequest, "POST", false)) + t.Run("Verify_One_L2_Rule_Creation", processGetRequest(ruleUrl, oneL2RuleCreateJsonResponse, false)) + + t.Run("Create_Ingress_L2_Acl_set", processSetRequest(bindingUrl, ingressL2AclSetCreateJsonRequest, "POST", false)) + t.Run("Verify_Ingress_L2_Aclset_Creation", processGetRequest(bindingUrl, ingressL2AclSetCreateJsonResponse, false)) + + t.Run("Get_Acl_Tree_From_AclSet_level", processGetRequest("/openconfig-acl:acl/acl-sets/acl-set", getL2AclsFromAclSetListLevelResponse, false)) + t.Run("Get_All_Ports_Bindings_From_Interfaces_Tree_Level", processGetRequest("/openconfig-acl:acl/interfaces", getL2AllPortsBindingsResponse, false)) + + t.Run("Delete_Binding_From_Ingress_Aclset", processDeleteRequest(bindingUrl)) + t.Run("Verify_Binding_From_Ingress_Aclset_Deletion", processGetRequest(bindingUrl, "", true)) + + etherTypeUrl := ruleUrl + "/l2/config/ethertype" + t.Run("Delete_Ethertype_Field", processDeleteRequest(etherTypeUrl)) + t.Run("Verify_L2_Ethertype_Field_Deletion", processGetRequest(ruleUrl+"/l2/config", emptyJson, false)) + + t.Run("Delete_Transport_Src_Port_Field", processDeleteRequest(ruleUrl+"/transport/config/source-port")) + t.Run("Delete_Transport_Dst_Port_Field", processDeleteRequest(ruleUrl+"/transport/config/destination-port")) + t.Run("Delete_Transport_Tcp_Flags_Field", processDeleteRequest(ruleUrl+"/transport/config/tcp-flags")) + t.Run("Verify_Transport_Src_Dst_Fields_Deletion", processGetRequest(ruleUrl+"/transport/config", emptyJson, false)) + + t.Run("Delete_One_Rule", processDeleteRequest(ruleUrl)) + t.Run("Delete_One_Acl", processDeleteRequest(aclUrl)) + t.Run("Verify_One_Acl_Delete", processGetRequest(aclUrl, "", true)) +} + +func Test_AclApp_NegativeTests(t *testing.T) { + // Verify GET returns errors for non-existing ACL + aclUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL2][type=ACL_L2]" + t.Run("Verify_Non_Existing_Acl_GET_Error", processGetRequest(aclUrl, "", true)) + + // Verify GET returns errors for non-existing Rule + ruleUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL2][type=ACL_L2]/acl-entries/acl-entry[sequence-id=2]" + t.Run("Verify_Non_Existing_Rule_GET_Error", processGetRequest(ruleUrl, "", true)) + + // Verify Error on giving Invalid Interface in payload during binding creation + url := "/openconfig-acl:acl" + t.Run("Create_Acl_With_Invalid_Interface_Binding", processSetRequest(url, aclCreateWithInvalidInterfaceBinding, "POST", true)) + + // Verify error if duplicate Acl is created using POST + t.Run("Create_One_L2_Acl_Without_Rule", processSetRequest(aclUrl, oneL2AclCreateJsonRequest, "POST", false)) + t.Run("Verify_One_L2_Acl_Without_Rule_Creation", processGetRequest(aclUrl, oneL2AclCreateJsonResponse, false)) + t.Run("Verify_Error_On_Create_Duplicate_L2_Acl", processSetRequest(aclUrl, oneL2AclCreateJsonRequest, "POST", true)) + + // Verify error if duplicate Rule is created using POST + multiRuleUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL3][type=ACL_IPV4]" + t.Run("Create_One_Acl_With_Multiple_Rules(PATCH)", processSetRequest(multiRuleUrl, oneAclCreateWithRulesJsonRequest, "PATCH", false)) + t.Run("Verify_Create_One_Acl_With_Multiple_Rules", processGetRequest(multiRuleUrl, oneAclCreateWithRulesJsonResponse, true)) + + duplicateRuleUrl := "/openconfig-acl:acl/acl-sets/acl-set[name=MyACL3][type=ACL_IPV4]/acl-entries/acl-entry[sequence-id=1]" + t.Run("Create_One_Duplicate_Rule", processSetRequest(duplicateRuleUrl, requestOneDuplicateRulePostJson, "POST", true)) + + topLevelUrl := "/openconfig-acl:acl" + t.Run("Delete_Full_ACl_Tree_Top_Level", processDeleteRequest(topLevelUrl)) + t.Run("Verify_Top_Level_Delete", processGetRequest(topLevelUrl, emptyJson, false)) +} + +func processGetRequest(url string, expectedRespJson string, errorCase bool) func(*testing.T) { + return func(t *testing.T) { + response, err := Get(GetRequest{url}) + if err != nil && !errorCase { + t.Errorf("Error %v received for Url: %s", err, url) + } + + respJson := response.Payload + if string(respJson) != expectedRespJson { + t.Errorf("Response for Url: %s received is not expected:\n%s", url, string(respJson)) + } + } +} + +func processSetRequest(url string, jsonPayload string, oper string, errorCase bool) func(*testing.T) { + return func(t *testing.T) { + var err error + switch oper { + case "POST": + _, err = Create(SetRequest{Path: url, Payload: []byte(jsonPayload)}) + case "PATCH": + _, err = Update(SetRequest{Path: url, Payload: []byte(jsonPayload)}) + case "PUT": + _, err = Replace(SetRequest{Path: url, Payload: []byte(jsonPayload)}) + default: + t.Errorf("Operation not supported") + } + if err != nil && !errorCase { + t.Errorf("Error %v received for Url: %s", err, url) + } + } +} + +func processDeleteRequest(url string) func(*testing.T) { + return func(t *testing.T) { + _, err := Delete(SetRequest{Path: url}) + if err != nil { + t.Errorf("Error %v received for Url: %s", err, url) + } + } +} + +// THis will delete ACL table and Rules Table from DB +func clearAclDataFromDb() error { + var err error + ruleTable := db.TableSpec{Name: "ACL_RULE"} + aclTable := db.TableSpec{Name: "ACL_TABLE"} + + d := getConfigDb() + if d == nil { + err = errors.New("Failed to connect to config Db") + return err + } + if err = d.DeleteTable(&ruleTable); err != nil { + err = errors.New("Failed to delete Rules Table") + return err + } + if err = d.DeleteTable(&aclTable); err != nil { + err = errors.New("Failed to delete Acl Table") + return err + } + return err +} + +func getConfigDb() *db.DB { + configDb, _ := db.NewDB(db.Options{ + DBNo: db.ConfigDB, + InitIndicator: "CONFIG_DB_INITIALIZED", + TableNameSeparator: "|", + KeySeparator: "|", + }) + + return configDb +} + +func Test_AclApp_Subscribe(t *testing.T) { + app := new(AclApp) + + t.Run("top", testSubsError(app, "/")) + t.Run("unknown", testSubsError(app, "/some/unknown/path")) + t.Run("topacl", testSubsError(app, "/openconfig-acl:acl")) + t.Run("aclsets", testSubsError(app, "/openconfig-acl:acl/acl-sets")) + t.Run("aclset*", testSubsError(app, "/openconfig-acl:acl/acl-sets/acl-set")) + t.Run("aclset", testSubsError(app, "/openconfig-acl:acl/acl-sets/acl-set[name=X][type=ACL_IPV4]")) + + t.Run("acl_config", testSubs(app, + "/openconfig-acl:acl/acl-sets/acl-set[name=X][type=ACL_IPV4]/config/description", + "ACL_TABLE", "X_ACL_IPV4", true)) + + t.Run("acl_state", testSubs(app, + "/openconfig-acl:acl/acl-sets/acl-set[name=X][type=ACL_IPV4]/state", + "ACL_TABLE", "X_ACL_IPV4", true)) + + t.Run("entries", testSubs(app, + "/openconfig-acl:acl/acl-sets/acl-set[name=X][type=ACL_IPV4]/acl-entries", + "ACL_RULE", "X_ACL_IPV4|*", false)) + + t.Run("rule*", testSubs(app, + "/openconfig-acl:acl/acl-sets/acl-set[name=X][type=ACL_IPV4]/acl-entries/acl-entry", + "ACL_RULE", "X_ACL_IPV4|*", false)) + + t.Run("rule", testSubs(app, + "/openconfig-acl:acl/acl-sets/acl-set[name=X][type=ACL_IPV4]/acl-entries/acl-entry[sequence-id=1]", + "ACL_RULE", "X_ACL_IPV4|RULE_1", false)) + + t.Run("rule_state", testSubs(app, + "/openconfig-acl:acl/acl-sets/acl-set[name=X][type=ACL_IPV4]/acl-entries/acl-entry[sequence-id=100]/state", + "ACL_RULE", "X_ACL_IPV4|RULE_100", true)) + + t.Run("rule_sip", testSubs(app, + "/openconfig-acl:acl/acl-sets/acl-set[name=X][type=ACL_IPV4]/acl-entries/acl-entry[sequence-id=200]/ipv4/config/source-address", + "ACL_RULE", "X_ACL_IPV4|RULE_200", true)) + +} + +// testSubs creates a test case which invokes translateSubscribe on an +// app interafce and check returned notificationInfo matches given values. +func testSubs(app appInterface, path, oTable, oKey string, oCache bool) func(*testing.T) { + return func(t *testing.T) { + _, nt, err := app.translateSubscribe([db.MaxDB]*db.DB{}, path) + if err != nil { + t.Fatalf("Unexpected error processing '%s'; err=%v", path, err) + } + if nt == nil || nt.needCache != oCache || nt.table.Name != oTable || + !reflect.DeepEqual(nt.key.Comp, strings.Split(oKey, "|")) { + t.Logf("translateSubscribe for path '%s'", path) + t.Logf("Expected table '%s', key '%v', cache %v", oTable, oKey, oCache) + if nt == nil { + t.Fatalf("Found nil") + } else { + t.Fatalf("Found table '%s', key '%s', cache %v", + nt.table.Name, strings.Join(nt.key.Comp, "|"), nt.needCache) + } + } + } +} + +// testSubsError creates a test case which invokes translateSubscribe on +// an app interafce and expects it to return an error +func testSubsError(app appInterface, path string) func(*testing.T) { + return func(t *testing.T) { + _, _, err := app.translateSubscribe([db.MaxDB]*db.DB{}, path) + if err == nil { + t.Fatalf("Expected error for path '%s'", path) + } + } +} + +/***************************************************************************/ +/////////// JSON Data for Tests /////////////// +/***************************************************************************/ +var emptyJson string = "{}" + +var bulkAclCreateJsonRequest string = "{\"acl-sets\":{\"acl-set\":[{\"name\":\"MyACL1\",\"type\":\"ACL_IPV4\",\"config\":{\"name\":\"MyACL1\",\"type\":\"ACL_IPV4\",\"description\":\"Description for MyACL1\"},\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":1,\"config\":{\"sequence-id\":1,\"description\":\"Description for MyACL1 Rule Seq 1\"},\"ipv4\":{\"config\":{\"source-address\":\"11.1.1.1/32\",\"destination-address\":\"21.1.1.1/32\",\"dscp\":1,\"protocol\":\"IP_TCP\"}},\"transport\":{\"config\":{\"source-port\":101,\"destination-port\":201}},\"actions\":{\"config\":{\"forwarding-action\":\"ACCEPT\"}}},{\"sequence-id\":2,\"config\":{\"sequence-id\":2,\"description\":\"Description for MyACL1 Rule Seq 2\"},\"ipv4\":{\"config\":{\"source-address\":\"11.1.1.2/32\",\"destination-address\":\"21.1.1.2/32\",\"dscp\":2,\"protocol\":\"IP_TCP\"}},\"transport\":{\"config\":{\"source-port\":102,\"destination-port\":202}},\"actions\":{\"config\":{\"forwarding-action\":\"DROP\"}}},{\"sequence-id\":3,\"config\":{\"sequence-id\":3,\"description\":\"Description for MyACL1 Rule Seq 3\"},\"ipv4\":{\"config\":{\"source-address\":\"11.1.1.3/32\",\"destination-address\":\"21.1.1.3/32\",\"dscp\":3,\"protocol\":\"IP_TCP\"}},\"transport\":{\"config\":{\"source-port\":103,\"destination-port\":203}},\"actions\":{\"config\":{\"forwarding-action\":\"ACCEPT\"}}},{\"sequence-id\":4,\"config\":{\"sequence-id\":4,\"description\":\"Description for MyACL1 Rule Seq 4\"},\"ipv4\":{\"config\":{\"source-address\":\"11.1.1.4/32\",\"destination-address\":\"21.1.1.4/32\",\"dscp\":4,\"protocol\":\"IP_TCP\"}},\"transport\":{\"config\":{\"source-port\":104,\"destination-port\":204}},\"actions\":{\"config\":{\"forwarding-action\":\"DROP\"}}},{\"sequence-id\":5,\"config\":{\"sequence-id\":5,\"description\":\"Description for MyACL1 Rule Seq 5\"},\"ipv4\":{\"config\":{\"source-address\":\"11.1.1.5/32\",\"destination-address\":\"21.1.1.5/32\",\"dscp\":5,\"protocol\":\"IP_TCP\"}},\"transport\":{\"config\":{\"source-port\":105,\"destination-port\":205}},\"actions\":{\"config\":{\"forwarding-action\":\"ACCEPT\"}}}]}},{\"name\":\"MyACL2\",\"type\":\"ACL_IPV4\",\"config\":{\"name\":\"MyACL2\",\"type\":\"ACL_IPV4\",\"description\":\"Description for MyACL2\"},\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":1,\"config\":{\"sequence-id\":1,\"description\":\"Description for Rule Seq 1\"},\"ipv4\":{\"config\":{\"source-address\":\"12.1.1.1/32\",\"destination-address\":\"22.1.1.1/32\",\"dscp\":1,\"protocol\":\"IP_TCP\"}},\"transport\":{\"config\":{\"source-port\":101,\"destination-port\":201}},\"actions\":{\"config\":{\"forwarding-action\":\"ACCEPT\"}}},{\"sequence-id\":2,\"config\":{\"sequence-id\":2,\"description\":\"Description for Rule Seq 2\"},\"ipv4\":{\"config\":{\"source-address\":\"12.1.1.2/32\",\"destination-address\":\"22.1.1.2/32\",\"dscp\":2,\"protocol\":\"IP_TCP\"}},\"transport\":{\"config\":{\"source-port\":102,\"destination-port\":202}},\"actions\":{\"config\":{\"forwarding-action\":\"ACCEPT\"}}},{\"sequence-id\":3,\"config\":{\"sequence-id\":3,\"description\":\"Description for Rule Seq 3\"},\"ipv4\":{\"config\":{\"source-address\":\"12.1.1.3/32\",\"destination-address\":\"22.1.1.3/32\",\"dscp\":3,\"protocol\":\"IP_TCP\"}},\"transport\":{\"config\":{\"source-port\":103,\"destination-port\":203}},\"actions\":{\"config\":{\"forwarding-action\":\"ACCEPT\"}}},{\"sequence-id\":4,\"config\":{\"sequence-id\":4,\"description\":\"Description for Rule Seq 4\"},\"ipv4\":{\"config\":{\"source-address\":\"12.1.1.4/32\",\"destination-address\":\"22.1.1.4/32\",\"dscp\":4,\"protocol\":\"IP_TCP\"}},\"transport\":{\"config\":{\"source-port\":104,\"destination-port\":204}},\"actions\":{\"config\":{\"forwarding-action\":\"ACCEPT\"}}},{\"sequence-id\":5,\"config\":{\"sequence-id\":5,\"description\":\"Description for Rule Seq 5\"},\"ipv4\":{\"config\":{\"source-address\":\"12.1.1.5/32\",\"destination-address\":\"22.1.1.5/32\",\"dscp\":5,\"protocol\":\"IP_TCP\"}},\"transport\":{\"config\":{\"source-port\":105,\"destination-port\":205}},\"actions\":{\"config\":{\"forwarding-action\":\"ACCEPT\"}}}]}}]},\"interfaces\":{\"interface\":[{\"id\":\"Ethernet0\",\"config\":{\"id\":\"Ethernet0\"},\"interface-ref\":{\"config\":{\"interface\":\"Ethernet0\"}},\"ingress-acl-sets\":{\"ingress-acl-set\":[{\"set-name\":\"MyACL1\",\"type\":\"ACL_IPV4\",\"config\":{\"set-name\":\"MyACL1\",\"type\":\"ACL_IPV4\"}}]}},{\"id\":\"Ethernet4\",\"config\":{\"id\":\"Ethernet4\"},\"interface-ref\":{\"config\":{\"interface\":\"Ethernet4\"}},\"ingress-acl-sets\":{\"ingress-acl-set\":[{\"set-name\":\"MyACL2\",\"type\":\"ACL_IPV4\",\"config\":{\"set-name\":\"MyACL2\",\"type\":\"ACL_IPV4\"}}]}}]}}" + +var bulkAclCreateJsonResponse string = "{\"openconfig-acl:acl\":{\"acl-sets\":{\"acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":1},\"ipv4\":{\"config\":{\"destination-address\":\"21.1.1.1/32\",\"dscp\":1,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.1/32\"},\"state\":{\"destination-address\":\"21.1.1.1/32\",\"dscp\":1,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.1/32\"}},\"sequence-id\":1,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":1},\"transport\":{\"config\":{\"destination-port\":201,\"source-port\":101},\"state\":{\"destination-port\":201,\"source-port\":101}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:DROP\"},\"state\":{\"forwarding-action\":\"openconfig-acl:DROP\"}},\"config\":{\"sequence-id\":2},\"ipv4\":{\"config\":{\"destination-address\":\"21.1.1.2/32\",\"dscp\":2,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.2/32\"},\"state\":{\"destination-address\":\"21.1.1.2/32\",\"dscp\":2,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.2/32\"}},\"sequence-id\":2,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":2},\"transport\":{\"config\":{\"destination-port\":202,\"source-port\":102},\"state\":{\"destination-port\":202,\"source-port\":102}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":3},\"ipv4\":{\"config\":{\"destination-address\":\"21.1.1.3/32\",\"dscp\":3,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.3/32\"},\"state\":{\"destination-address\":\"21.1.1.3/32\",\"dscp\":3,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.3/32\"}},\"sequence-id\":3,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":3},\"transport\":{\"config\":{\"destination-port\":203,\"source-port\":103},\"state\":{\"destination-port\":203,\"source-port\":103}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:DROP\"},\"state\":{\"forwarding-action\":\"openconfig-acl:DROP\"}},\"config\":{\"sequence-id\":4},\"ipv4\":{\"config\":{\"destination-address\":\"21.1.1.4/32\",\"dscp\":4,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.4/32\"},\"state\":{\"destination-address\":\"21.1.1.4/32\",\"dscp\":4,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.4/32\"}},\"sequence-id\":4,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":4},\"transport\":{\"config\":{\"destination-port\":204,\"source-port\":104},\"state\":{\"destination-port\":204,\"source-port\":104}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":5},\"ipv4\":{\"config\":{\"destination-address\":\"21.1.1.5/32\",\"dscp\":5,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.5/32\"},\"state\":{\"destination-address\":\"21.1.1.5/32\",\"dscp\":5,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.5/32\"}},\"sequence-id\":5,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":5},\"transport\":{\"config\":{\"destination-port\":205,\"source-port\":105},\"state\":{\"destination-port\":205,\"source-port\":105}}}]},\"config\":{\"description\":\"Description for MyACL1\",\"name\":\"MyACL1\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"name\":\"MyACL1\",\"state\":{\"description\":\"Description for MyACL1\",\"name\":\"MyACL1\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"},{\"acl-entries\":{\"acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":1},\"ipv4\":{\"config\":{\"destination-address\":\"22.1.1.1/32\",\"dscp\":1,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"12.1.1.1/32\"},\"state\":{\"destination-address\":\"22.1.1.1/32\",\"dscp\":1,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"12.1.1.1/32\"}},\"sequence-id\":1,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":1},\"transport\":{\"config\":{\"destination-port\":201,\"source-port\":101},\"state\":{\"destination-port\":201,\"source-port\":101}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":2},\"ipv4\":{\"config\":{\"destination-address\":\"22.1.1.2/32\",\"dscp\":2,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"12.1.1.2/32\"},\"state\":{\"destination-address\":\"22.1.1.2/32\",\"dscp\":2,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"12.1.1.2/32\"}},\"sequence-id\":2,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":2},\"transport\":{\"config\":{\"destination-port\":202,\"source-port\":102},\"state\":{\"destination-port\":202,\"source-port\":102}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":3},\"ipv4\":{\"config\":{\"destination-address\":\"22.1.1.3/32\",\"dscp\":3,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"12.1.1.3/32\"},\"state\":{\"destination-address\":\"22.1.1.3/32\",\"dscp\":3,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"12.1.1.3/32\"}},\"sequence-id\":3,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":3},\"transport\":{\"config\":{\"destination-port\":203,\"source-port\":103},\"state\":{\"destination-port\":203,\"source-port\":103}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":4},\"ipv4\":{\"config\":{\"destination-address\":\"22.1.1.4/32\",\"dscp\":4,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"12.1.1.4/32\"},\"state\":{\"destination-address\":\"22.1.1.4/32\",\"dscp\":4,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"12.1.1.4/32\"}},\"sequence-id\":4,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":4},\"transport\":{\"config\":{\"destination-port\":204,\"source-port\":104},\"state\":{\"destination-port\":204,\"source-port\":104}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":5},\"ipv4\":{\"config\":{\"destination-address\":\"22.1.1.5/32\",\"dscp\":5,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"12.1.1.5/32\"},\"state\":{\"destination-address\":\"22.1.1.5/32\",\"dscp\":5,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"12.1.1.5/32\"}},\"sequence-id\":5,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":5},\"transport\":{\"config\":{\"destination-port\":205,\"source-port\":105},\"state\":{\"destination-port\":205,\"source-port\":105}}}]},\"config\":{\"description\":\"Description for MyACL2\",\"name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"name\":\"MyACL2\",\"state\":{\"description\":\"Description for MyACL2\",\"name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]},\"interfaces\":{\"interface\":[{\"config\":{\"id\":\"Ethernet0\"},\"id\":\"Ethernet0\",\"ingress-acl-sets\":{\"ingress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":1,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":1}},{\"sequence-id\":2,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":2}},{\"sequence-id\":3,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":3}},{\"sequence-id\":4,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":4}},{\"sequence-id\":5,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":5}}]},\"config\":{\"set-name\":\"MyACL1\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"set-name\":\"MyACL1\",\"state\":{\"set-name\":\"MyACL1\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]},\"state\":{\"id\":\"Ethernet0\"}},{\"config\":{\"id\":\"Ethernet4\"},\"id\":\"Ethernet4\",\"ingress-acl-sets\":{\"ingress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":1,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":1}},{\"sequence-id\":2,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":2}},{\"sequence-id\":3,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":3}},{\"sequence-id\":4,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":4}},{\"sequence-id\":5,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":5}}]},\"config\":{\"set-name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"set-name\":\"MyACL2\",\"state\":{\"set-name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]},\"state\":{\"id\":\"Ethernet4\"}}]}}}" + +var oneAclCreateWithRulesJsonRequest string = "{ \"name\": \"MyACL3\", \"type\": \"ACL_IPV4\", \"config\": { \"name\": \"MyACL3\", \"type\": \"ACL_IPV4\", \"description\": \"Description for MyACL3\" }, \"acl-entries\": { \"acl-entry\": [ { \"sequence-id\": 1, \"config\": { \"sequence-id\": 1, \"description\": \"Description for MyACL3 Rule Seq 1\" }, \"ipv4\": { \"config\": { \"source-address\": \"11.1.1.1/32\", \"destination-address\": \"21.1.1.1/32\", \"dscp\": 1, \"protocol\": \"IP_TCP\" } }, \"transport\": { \"config\": { \"source-port\": 101, \"destination-port\": 201 } }, \"actions\": { \"config\": { \"forwarding-action\": \"ACCEPT\" } } }, { \"sequence-id\": 2, \"config\": { \"sequence-id\": 2, \"description\": \"Description for MyACL3 Rule Seq 2\" }, \"ipv4\": { \"config\": { \"source-address\": \"11.1.1.2/32\", \"destination-address\": \"21.1.1.2/32\", \"dscp\": 2, \"protocol\": \"IP_UDP\" } }, \"transport\": { \"config\": { \"source-port\": 102, \"destination-port\": 202 } }, \"actions\": { \"config\": { \"forwarding-action\": \"DROP\" } } }, { \"sequence-id\": 3, \"config\": { \"sequence-id\": 3, \"description\": \"Description for MyACL3 Rule Seq 3\" }, \"ipv4\": { \"config\": { \"source-address\": \"11.1.1.3/32\", \"destination-address\": \"21.1.1.3/32\", \"dscp\": 3, \"protocol\": \"IP_TCP\" } }, \"transport\": { \"config\": { \"source-port\": 103, \"destination-port\": 203 } }, \"actions\": { \"config\": { \"forwarding-action\": \"ACCEPT\" } } }, { \"sequence-id\": 4, \"config\": { \"sequence-id\": 4, \"description\": \"Description for MyACL3 Rule Seq 4\" }, \"ipv4\": { \"config\": { \"source-address\": \"11.1.1.4/32\", \"destination-address\": \"21.1.1.4/32\", \"dscp\": 4, \"protocol\": \"IP_TCP\" } }, \"transport\": { \"config\": { \"source-port\": 104, \"destination-port\": 204 } }, \"actions\": { \"config\": { \"forwarding-action\": \"DROP\" } } }, { \"sequence-id\": 5, \"config\": { \"sequence-id\": 5, \"description\": \"Description for MyACL3 Rule Seq 5\" }, \"ipv4\": { \"config\": { \"source-address\": \"11.1.1.5/32\", \"destination-address\": \"21.1.1.5/32\", \"dscp\": 5, \"protocol\": \"IP_TCP\" } }, \"transport\": { \"config\": { \"source-port\": 105, \"destination-port\": 205 } }, \"actions\": { \"config\": { \"forwarding-action\": \"ACCEPT\" } } } ] }}" + +var oneAclCreateWithRulesJsonResponse string = "{\"openconfig-acl:acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":1},\"ipv4\":{\"config\":{\"destination-address\":\"21.1.1.1/32\",\"dscp\":1,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.1/32\"},\"state\":{\"destination-address\":\"21.1.1.1/32\",\"dscp\":1,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.1/32\"}},\"sequence-id\":1,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":1},\"transport\":{\"config\":{\"destination-port\":201,\"source-port\":101},\"state\":{\"destination-port\":201,\"source-port\":101}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:DROP\"},\"state\":{\"forwarding-action\":\"openconfig-acl:DROP\"}},\"config\":{\"sequence-id\":2},\"ipv4\":{\"config\":{\"destination-address\":\"21.1.1.2/32\",\"dscp\":2,\"protocol\":\"openconfig-packet-match-types:IP_UDP\",\"source-address\":\"11.1.1.2/32\"},\"state\":{\"destination-address\":\"21.1.1.2/32\",\"dscp\":2,\"protocol\":\"openconfig-packet-match-types:IP_UDP\",\"source-address\":\"11.1.1.2/32\"}},\"sequence-id\":2,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":2},\"transport\":{\"config\":{\"destination-port\":202,\"source-port\":102},\"state\":{\"destination-port\":202,\"source-port\":102}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":3},\"ipv4\":{\"config\":{\"destination-address\":\"21.1.1.3/32\",\"dscp\":3,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.3/32\"},\"state\":{\"destination-address\":\"21.1.1.3/32\",\"dscp\":3,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.3/32\"}},\"sequence-id\":3,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":3},\"transport\":{\"config\":{\"destination-port\":203,\"source-port\":103},\"state\":{\"destination-port\":203,\"source-port\":103}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:DROP\"},\"state\":{\"forwarding-action\":\"openconfig-acl:DROP\"}},\"config\":{\"sequence-id\":4},\"ipv4\":{\"config\":{\"destination-address\":\"21.1.1.4/32\",\"dscp\":4,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.4/32\"},\"state\":{\"destination-address\":\"21.1.1.4/32\",\"dscp\":4,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.4/32\"}},\"sequence-id\":4,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":4},\"transport\":{\"config\":{\"destination-port\":204,\"source-port\":104},\"state\":{\"destination-port\":204,\"source-port\":104}}},{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":5},\"ipv4\":{\"config\":{\"destination-address\":\"21.1.1.5/32\",\"dscp\":5,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.5/32\"},\"state\":{\"destination-address\":\"21.1.1.5/32\",\"dscp\":5,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11.1.1.5/32\"}},\"sequence-id\":5,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":5},\"transport\":{\"config\":{\"destination-port\":205,\"source-port\":105},\"state\":{\"destination-port\":205,\"source-port\":105}}}]},\"config\":{\"description\":\"Description for MyACL3\",\"name\":\"MyACL3\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"name\":\"MyACL3\",\"state\":{\"description\":\"Description for MyACL3\",\"name\":\"MyACL3\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]}" + +var oneAclCreateJsonRequest string = "{\"config\": {\"name\": \"MyACL5\",\"type\": \"ACL_IPV4\",\"description\": \"Description for MyACL5\"}}" +var oneAclCreateJsonResponse string = "{\"openconfig-acl:acl-set\":[{\"config\":{\"description\":\"Description for MyACL5\",\"name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"name\":\"MyACL5\",\"state\":{\"description\":\"Description for MyACL5\",\"name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]}" + +var aclDescrUpdateJson string = "{\"openconfig-acl:description\":\"Verifying ACL Description Update\"}" + +var requestOneRulePostJson string = "{\"sequence-id\": 8,\"config\": {\"sequence-id\": 8,\"description\": \"Description for MyACL5 Rule Seq 8\"},\"ipv4\": {\"config\": {\"source-address\": \"4.4.4.4/24\",\"destination-address\": \"5.5.5.5/24\",\"protocol\": \"IP_TCP\"}},\"transport\": {\"config\": {\"source-port\": 101,\"destination-port\": 100,\"tcp-flags\": [\"TCP_FIN\",\"TCP_ACK\"]}},\"actions\": {\"config\": {\"forwarding-action\": \"ACCEPT\"}}}" + +var requestOneRulePatchJson string = "{\"sequence-id\": 8,\"config\": {\"sequence-id\": 8,\"description\": \"Description for MyACL5 Rule Seq 8\"},\"ipv4\": {\"config\": {\"source-address\": \"4.8.4.8/24\",\"destination-address\": \"15.5.15.5/24\",\"protocol\": \"IP_L2TP\"}},\"transport\": {\"config\": {\"source-port\": 101,\"destination-port\": 100,\"tcp-flags\": [\"TCP_FIN\",\"TCP_ACK\",\"TCP_RST\",\"TCP_ECE\"]}},\"actions\": {\"config\": {\"forwarding-action\": \"ACCEPT\"}}}" + +var responseOneRuleJson string = "{\"openconfig-acl:acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":8},\"ipv4\":{\"config\":{\"destination-address\":\"5.5.5.5/24\",\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"4.4.4.4/24\"},\"state\":{\"destination-address\":\"5.5.5.5/24\",\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"4.4.4.4/24\"}},\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8},\"transport\":{\"config\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]},\"state\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]}}}]}" + +var responseOneRulePatchJson string = "{\"openconfig-acl:acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":8},\"ipv4\":{\"config\":{\"destination-address\":\"15.5.15.5/24\",\"protocol\":\"openconfig-packet-match-types:IP_L2TP\",\"source-address\":\"4.8.4.8/24\"},\"state\":{\"destination-address\":\"15.5.15.5/24\",\"protocol\":\"openconfig-packet-match-types:IP_L2TP\",\"source-address\":\"4.8.4.8/24\"}},\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8},\"transport\":{\"config\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_RST\",\"openconfig-packet-match-types:TCP_ACK\",\"openconfig-packet-match-types:TCP_ECE\"]},\"state\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_RST\",\"openconfig-packet-match-types:TCP_ACK\",\"openconfig-packet-match-types:TCP_ECE\"]}}}]}" + +var emptyAclDescriptionJson string = "{\"openconfig-acl:description\":\"\"}" +var emptyRuleDscpJson string = "{\"openconfig-acl:dscp\":0}" + +var ingressAclSetCreateJsonRequest string = "{ \"openconfig-acl:config\": { \"set-name\": \"MyACL5\", \"type\": \"ACL_IPV4\" }}" +var ingressAclSetCreateJsonResponse string = "{\"openconfig-acl:ingress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8}}]},\"config\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"set-name\":\"MyACL5\",\"state\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]}" + +var egressAclSetCreateJsonResponse string = "{\"openconfig-acl:egress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8}}]},\"config\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"set-name\":\"MyACL5\",\"state\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]}" + +var replaceMultiRulesWithOneRuleJsonRequest string = "{\"name\": \"MyACL3\",\"type\": \"ACL_IPV4\",\"config\": {\"name\": \"MyACL3\",\"type\": \"ACL_IPV4\",\"description\": \"Description for MyACL3\"},\"acl-entries\": {\"acl-entry\": [{\"sequence-id\": 8,\"config\": {\"sequence-id\": 8,\"description\": \"Description for MyACL3 Rule Seq 8\"},\"ipv4\": {\"config\": {\"source-address\": \"81.1.1.1/32\",\"destination-address\": \"91.1.1.1/32\",\"protocol\": \"IP_TCP\"}},\"transport\": {\"config\": {\"source-port\": \"801..811\",\"destination-port\": \"901..921\"}},\"actions\": {\"config\": {\"forwarding-action\": \"REJECT\"}}}]}}" + +var replaceMultiRulesWithOneRuleJsonResponse string = "{\"openconfig-acl:acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:DROP\"},\"state\":{\"forwarding-action\":\"openconfig-acl:DROP\"}},\"config\":{\"sequence-id\":8},\"ipv4\":{\"config\":{\"destination-address\":\"91.1.1.1/32\",\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"81.1.1.1/32\"},\"state\":{\"destination-address\":\"91.1.1.1/32\",\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"81.1.1.1/32\"}},\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8},\"transport\":{\"config\":{\"destination-port\":\"901-921\",\"source-port\":\"801-811\"},\"state\":{\"destination-port\":\"901-921\",\"source-port\":\"801-811\"}}}]},\"config\":{\"description\":\"Description for MyACL3\",\"name\":\"MyACL3\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"name\":\"MyACL3\",\"state\":{\"description\":\"Description for MyACL3\",\"name\":\"MyACL3\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]}" + +var getFromAclSetsTreeLevelResponse string = "{\"openconfig-acl:acl-sets\":{\"acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":8},\"ipv4\":{\"config\":{\"destination-address\":\"5.5.5.5/24\",\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"4.4.4.4/24\"},\"state\":{\"destination-address\":\"5.5.5.5/24\",\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"4.4.4.4/24\"}},\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8},\"transport\":{\"config\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]},\"state\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]}}}]},\"config\":{\"description\":\"Description for MyACL5\",\"name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"name\":\"MyACL5\",\"state\":{\"description\":\"Description for MyACL5\",\"name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]}}" + +var getAllPortsFromInterfacesTreeLevelResponse string = "{\"openconfig-acl:interfaces\":{\"interface\":[{\"config\":{\"id\":\"Ethernet4\"},\"egress-acl-sets\":{\"egress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8}}]},\"config\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"set-name\":\"MyACL5\",\"state\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]},\"id\":\"Ethernet4\",\"state\":{\"id\":\"Ethernet4\"}}]}}" + +var getPortBindingFromInterfaceTreeLevelResponse string = "{\"openconfig-acl:interface\":[{\"config\":{\"id\":\"Ethernet4\"},\"egress-acl-sets\":{\"egress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8}}]},\"config\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"set-name\":\"MyACL5\",\"state\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]},\"id\":\"Ethernet4\",\"state\":{\"id\":\"Ethernet4\"}}]}" + +var getBindingAclEntryResponse string = "{\"openconfig-acl:acl-entry\":[{\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8}}]}" + +var getMultiportBindingOnSingleAclResponse string = "{\"openconfig-acl:interfaces\":{\"interface\":[{\"config\":{\"id\":\"Ethernet0\"},\"egress-acl-sets\":{\"egress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8}}]},\"config\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"set-name\":\"MyACL5\",\"state\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]},\"id\":\"Ethernet0\",\"state\":{\"id\":\"Ethernet0\"}},{\"config\":{\"id\":\"Ethernet4\"},\"egress-acl-sets\":{\"egress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":8,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":8}}]},\"config\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"set-name\":\"MyACL5\",\"state\":{\"set-name\":\"MyACL5\",\"type\":\"openconfig-acl:ACL_IPV4\"},\"type\":\"openconfig-acl:ACL_IPV4\"}]},\"id\":\"Ethernet4\",\"state\":{\"id\":\"Ethernet4\"}}]}}" + +var oneIPv6AclCreateJsonRequest string = "{\"config\": {\"name\": \"MyACL6\",\"type\": \"ACL_IPV6\",\"description\": \"Description for IPv6 ACL MyACL6\"}}" +var oneIPv6AclCreateJsonResponse string = "{\"openconfig-acl:acl-set\":[{\"config\":{\"description\":\"Description for IPv6 ACL MyACL6\",\"name\":\"MyACL6\",\"type\":\"openconfig-acl:ACL_IPV6\"},\"name\":\"MyACL6\",\"state\":{\"description\":\"Description for IPv6 ACL MyACL6\",\"name\":\"MyACL6\",\"type\":\"openconfig-acl:ACL_IPV6\"},\"type\":\"openconfig-acl:ACL_IPV6\"}]}" + +var oneIPv6RuleCreateJsonRequest string = "{\"sequence-id\": 6,\"config\": {\"sequence-id\": 6,\"description\": \"Description for MyACL6 Rule Seq 6\"},\"ipv6\": {\"config\": {\"source-address\": \"11::67/64\",\"destination-address\": \"22::87/64\",\"protocol\": \"IP_TCP\",\"dscp\": 11}},\"transport\": {\"config\": {\"source-port\": 101,\"destination-port\": 100,\"tcp-flags\": [\"TCP_FIN\",\"TCP_ACK\"]}},\"actions\": {\"config\": {\"forwarding-action\": \"ACCEPT\"}}}" +var oneIPv6RuleCreateJsonResponse string = "{\"openconfig-acl:acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":6},\"ipv6\":{\"config\":{\"destination-address\":\"22::87/64\",\"dscp\":11,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11::67/64\"},\"state\":{\"destination-address\":\"22::87/64\",\"dscp\":11,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11::67/64\"}},\"sequence-id\":6,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":6},\"transport\":{\"config\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]},\"state\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]}}}]}" + +var ingressIPv6AclSetCreateJsonRequest string = "{ \"openconfig-acl:config\": { \"set-name\": \"MyACL6\", \"type\": \"ACL_IPV6\" }}" +var ingressIPv6AclSetCreateJsonResponse string = "{\"openconfig-acl:ingress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":6,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":6}}]},\"config\":{\"set-name\":\"MyACL6\",\"type\":\"openconfig-acl:ACL_IPV6\"},\"set-name\":\"MyACL6\",\"state\":{\"set-name\":\"MyACL6\",\"type\":\"openconfig-acl:ACL_IPV6\"},\"type\":\"openconfig-acl:ACL_IPV6\"}]}" + +var getIPv6AclsFromAclSetListLevelResponse string = "{\"openconfig-acl:acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":6},\"ipv6\":{\"config\":{\"destination-address\":\"22::87/64\",\"dscp\":11,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11::67/64\"},\"state\":{\"destination-address\":\"22::87/64\",\"dscp\":11,\"protocol\":\"openconfig-packet-match-types:IP_TCP\",\"source-address\":\"11::67/64\"}},\"sequence-id\":6,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":6},\"transport\":{\"config\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]},\"state\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]}}}]},\"config\":{\"description\":\"Description for IPv6 ACL MyACL6\",\"name\":\"MyACL6\",\"type\":\"openconfig-acl:ACL_IPV6\"},\"name\":\"MyACL6\",\"state\":{\"description\":\"Description for IPv6 ACL MyACL6\",\"name\":\"MyACL6\",\"type\":\"openconfig-acl:ACL_IPV6\"},\"type\":\"openconfig-acl:ACL_IPV6\"}]}" + +var getIPv6AllPortsBindingsResponse string = "{\"openconfig-acl:interfaces\":{\"interface\":[{\"config\":{\"id\":\"Ethernet4\"},\"id\":\"Ethernet4\",\"ingress-acl-sets\":{\"ingress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":6,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":6}}]},\"config\":{\"set-name\":\"MyACL6\",\"type\":\"openconfig-acl:ACL_IPV6\"},\"set-name\":\"MyACL6\",\"state\":{\"set-name\":\"MyACL6\",\"type\":\"openconfig-acl:ACL_IPV6\"},\"type\":\"openconfig-acl:ACL_IPV6\"}]},\"state\":{\"id\":\"Ethernet4\"}}]}}" + +var oneL2AclCreateJsonRequest string = "{\"config\": {\"name\": \"MyACL2\",\"type\": \"ACL_L2\",\"description\": \"Description for L2 ACL MyACL2\"}}" +var oneL2AclCreateJsonResponse string = "{\"openconfig-acl:acl-set\":[{\"config\":{\"description\":\"Description for L2 ACL MyACL2\",\"name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_L2\"},\"name\":\"MyACL2\",\"state\":{\"description\":\"Description for L2 ACL MyACL2\",\"name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_L2\"},\"type\":\"openconfig-acl:ACL_L2\"}]}" + +var oneL2RuleCreateJsonRequest string = "{\"sequence-id\": 2,\"config\": {\"sequence-id\": 2,\"description\": \"Description for MyACL2 Rule Seq 2\"},\"l2\": {\"config\": {\"ethertype\": \"ETHERTYPE_VLAN\"}},\"transport\": {\"config\": {\"source-port\": 101,\"destination-port\": 100,\"tcp-flags\": [\"TCP_FIN\",\"TCP_ACK\"]}},\"actions\": {\"config\": {\"forwarding-action\": \"ACCEPT\"}}}" + +var oneL2RuleCreateJsonResponse string = "{\"openconfig-acl:acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":2},\"l2\":{\"config\":{\"ethertype\":\"openconfig-packet-match-types:ETHERTYPE_VLAN\"},\"state\":{\"ethertype\":\"openconfig-packet-match-types:ETHERTYPE_VLAN\"}},\"sequence-id\":2,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":2},\"transport\":{\"config\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]},\"state\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]}}}]}" + +var ingressL2AclSetCreateJsonRequest string = "{ \"openconfig-acl:config\": { \"set-name\": \"MyACL2\", \"type\": \"ACL_L2\" }}" +var ingressL2AclSetCreateJsonResponse string = "{\"openconfig-acl:ingress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":2,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":2}}]},\"config\":{\"set-name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_L2\"},\"set-name\":\"MyACL2\",\"state\":{\"set-name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_L2\"},\"type\":\"openconfig-acl:ACL_L2\"}]}" + +var getL2AclsFromAclSetListLevelResponse string = "{\"openconfig-acl:acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"actions\":{\"config\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"},\"state\":{\"forwarding-action\":\"openconfig-acl:ACCEPT\"}},\"config\":{\"sequence-id\":2},\"l2\":{\"config\":{\"ethertype\":\"openconfig-packet-match-types:ETHERTYPE_VLAN\"},\"state\":{\"ethertype\":\"openconfig-packet-match-types:ETHERTYPE_VLAN\"}},\"sequence-id\":2,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":2},\"transport\":{\"config\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]},\"state\":{\"destination-port\":100,\"source-port\":101,\"tcp-flags\":[\"openconfig-packet-match-types:TCP_FIN\",\"openconfig-packet-match-types:TCP_ACK\"]}}}]},\"config\":{\"description\":\"Description for L2 ACL MyACL2\",\"name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_L2\"},\"name\":\"MyACL2\",\"state\":{\"description\":\"Description for L2 ACL MyACL2\",\"name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_L2\"},\"type\":\"openconfig-acl:ACL_L2\"}]}" + +var getL2AllPortsBindingsResponse string = "{\"openconfig-acl:interfaces\":{\"interface\":[{\"config\":{\"id\":\"Ethernet0\"},\"id\":\"Ethernet0\",\"ingress-acl-sets\":{\"ingress-acl-set\":[{\"acl-entries\":{\"acl-entry\":[{\"sequence-id\":2,\"state\":{\"matched-octets\":\"0\",\"matched-packets\":\"0\",\"sequence-id\":2}}]},\"config\":{\"set-name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_L2\"},\"set-name\":\"MyACL2\",\"state\":{\"set-name\":\"MyACL2\",\"type\":\"openconfig-acl:ACL_L2\"},\"type\":\"openconfig-acl:ACL_L2\"}]},\"state\":{\"id\":\"Ethernet0\"}}]}}" + +var aclCreateWithInvalidInterfaceBinding string = "{ \"acl-sets\": { \"acl-set\": [ { \"name\": \"MyACL1\", \"type\": \"ACL_IPV4\", \"config\": { \"name\": \"MyACL1\", \"type\": \"ACL_IPV4\", \"description\": \"Description for MyACL1\" }, \"acl-entries\": { \"acl-entry\": [ { \"sequence-id\": 1, \"config\": { \"sequence-id\": 1, \"description\": \"Description for MyACL1 Rule Seq 1\" }, \"ipv4\": { \"config\": { \"source-address\": \"11.1.1.1/32\", \"destination-address\": \"21.1.1.1/32\", \"dscp\": 1, \"protocol\": \"IP_TCP\" } }, \"transport\": { \"config\": { \"source-port\": 101, \"destination-port\": 201 } }, \"actions\": { \"config\": { \"forwarding-action\": \"ACCEPT\" } } } ] } } ] }, \"interfaces\": { \"interface\": [ { \"id\": \"Ethernet2112\", \"config\": { \"id\": \"Ethernet2112\" }, \"interface-ref\": { \"config\": { \"interface\": \"Ethernet2112\" } }, \"ingress-acl-sets\": { \"ingress-acl-set\": [ { \"set-name\": \"MyACL1\", \"type\": \"ACL_IPV4\", \"config\": { \"set-name\": \"MyACL1\", \"type\": \"ACL_IPV4\" } } ] } } ] }}" + +var requestOneDuplicateRulePostJson string = "{\"sequence-id\": 1,\"config\": {\"sequence-id\": 1,\"description\": \"Description for MyACL3 Rule Seq 1\"},\"ipv4\": {\"config\": {\"source-address\": \"4.4.4.4/24\",\"destination-address\": \"5.5.5.5/24\",\"protocol\": \"IP_TCP\"}},\"transport\": {\"config\": {\"source-port\": 101,\"destination-port\": 100,\"tcp-flags\": [\"TCP_FIN\",\"TCP_ACK\"]}},\"actions\": {\"config\": {\"forwarding-action\": \"ACCEPT\"}}}" diff --git a/src/translib/app_interface.go b/src/translib/app_interface.go new file mode 100644 index 0000000000..0a8b477403 --- /dev/null +++ b/src/translib/app_interface.go @@ -0,0 +1,170 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +/* +Package translib defines the interface for all the app modules + +It exposes register function for all the app modules to register + +It stores all the app module information in a map and presents it + +to the tranlib infra when it asks for the same. +*/ + +package translib + +import ( + "errors" + "reflect" + "strings" + "translib/db" + log "github.com/golang/glog" + "github.com/openconfig/ygot/ygot" +) + +//Structure containing app module information +type appInfo struct { + appType reflect.Type + ygotRootType reflect.Type + isNative bool + tablesToWatch []*db.TableSpec +} + +//Structure containing the app data coming from translib infra +type appData struct { + path string + payload []byte + ygotRoot *ygot.GoStruct + ygotTarget *interface{} +} + +//map containing the base path to app module info +var appMap map[string]*appInfo + +//array containing all the supported models +var models []ModelData + +//Interface for all App Modules +type appInterface interface { + initialize(data appData) + translateCreate(d *db.DB) ([]db.WatchKeys, error) + translateUpdate(d *db.DB) ([]db.WatchKeys, error) + translateReplace(d *db.DB) ([]db.WatchKeys, error) + translateDelete(d *db.DB) ([]db.WatchKeys, error) + translateGet(dbs [db.MaxDB]*db.DB) error + translateSubscribe(dbs [db.MaxDB]*db.DB, path string) (*notificationOpts, *notificationInfo, error) + processCreate(d *db.DB) (SetResponse, error) + processUpdate(d *db.DB) (SetResponse, error) + processReplace(d *db.DB) (SetResponse, error) + processDelete(d *db.DB) (SetResponse, error) + processGet(dbs [db.MaxDB]*db.DB) (GetResponse, error) +} + +//App modules will use this function to register with App interface during boot up +func register(path string, info *appInfo) error { + var err error + log.Info("Registering for path =", path) + + if appMap == nil { + appMap = make(map[string]*appInfo) + } + + if _, ok := appMap[path]; ok == false { + + appMap[path] = info + + } else { + log.Fatal("Duplicate path being registered. Path =", path) + err = errors.New("Duplicate path") + } + + return err +} + +//Adds the model information to the supported models array +func addModel(model *ModelData) error { + var err error + + models = append(models, *model) + + //log.Info("Models = ", models) + return err +} + +//App modules can use this function to unregister itself from the app interface +func unregister(path string) error { + var err error + log.Info("Unregister for path =", path) + + _, ok := appMap[path] + + if ok { + log.Info("deleting for path =", path) + delete(appMap, path) + } + + return err +} + +//Translib infra will use this function get the app info for a given path +func getAppModuleInfo(path string) (*appInfo, error) { + var err error + log.Info("getAppModule called for path =", path) + + for pattern, app := range appMap { + if !strings.HasPrefix(path, pattern) { + continue + } + + log.Info("found the entry in the map for path =", pattern) + + return app, err + } + + errStr := "Unsupported path=" + path + + err = errors.New(errStr) + log.Error(errStr) + + var app *appInfo + + return app, err +} + +//Get all the supported models +func getModels() []ModelData { + + return models +} + +//Creates a new app from the appType and returns it as an appInterface +func getAppInterface(appType reflect.Type) (appInterface, error) { + var err error + appInstance := reflect.New(appType) + app, ok := appInstance.Interface().(appInterface) + + if !ok { + err = errors.New("Invalid appType") + log.Fatal("Appmodule does not confirm to appInterface method conventions for appType=", appType) + } else { + log.Info("cast to appInterface worked", app) + } + + return app, err +} diff --git a/src/translib/app_utils.go b/src/translib/app_utils.go new file mode 100644 index 0000000000..0fa8b66fd3 --- /dev/null +++ b/src/translib/app_utils.go @@ -0,0 +1,231 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package translib + +import ( + "bytes" + "encoding/json" + "reflect" + "strings" + "translib/db" + "translib/ocbinds" + "translib/tlerr" + + log "github.com/golang/glog" + "github.com/openconfig/gnmi/proto/gnmi" + "github.com/openconfig/goyang/pkg/yang" + "github.com/openconfig/ygot/ygot" + "github.com/openconfig/ygot/ytypes" +) + +func getYangPathFromUri(uri string) (string, error) { + var path *gnmi.Path + var err error + + path, err = ygot.StringToPath(uri, ygot.StructuredPath, ygot.StringSlicePath) + if err != nil { + log.Errorf("Error in uri to path conversion: %v", err) + return "", err + } + + yangPath, yperr := ygot.PathToSchemaPath(path) + if yperr != nil { + log.Errorf("Error in Gnmi path to Yang path conversion: %v", yperr) + return "", yperr + } + + return yangPath, err +} + +func getYangPathFromYgotStruct(s ygot.GoStruct, yangPathPrefix string, appModuleName string) string { + tn := reflect.TypeOf(s).Elem().Name() + schema, ok := ocbinds.SchemaTree[tn] + if !ok { + log.Errorf("could not find schema for type %s", tn) + return "" + } else if schema != nil { + yPath := schema.Path() + //yPath = strings.Replace(yPath, "/device/acl", "/openconfig-acl:acl", 1) + yPath = strings.Replace(yPath, yangPathPrefix, appModuleName, 1) + return yPath + } + return "" +} + +func generateGetResponsePayload(targetUri string, deviceObj *ocbinds.Device, ygotTarget *interface{}) ([]byte, error) { + var err error + var payload []byte + + if len(targetUri) == 0 { + return payload, tlerr.InvalidArgs("GetResponse failed as target Uri is not valid") + } + path, err := ygot.StringToPath(targetUri, ygot.StructuredPath, ygot.StringSlicePath) + if err != nil { + return payload, tlerr.InvalidArgs("URI to path conversion failed: %v", err) + } + + // Get current node (corresponds to ygotTarget) and its parent node + var pathList []*gnmi.PathElem = path.Elem + parentPath := &gnmi.Path{} + for i := 0; i < len(pathList); i++ { + if log.V(3) { + log.Infof("pathList[%d]: %s\n", i, pathList[i]) + } + pathSlice := strings.Split(pathList[i].Name, ":") + pathList[i].Name = pathSlice[len(pathSlice)-1] + if i < (len(pathList) - 1) { + parentPath.Elem = append(parentPath.Elem, pathList[i]) + } + } + parentNodeList, err := ytypes.GetNode(ygSchema.RootSchema(), deviceObj, parentPath) + if err != nil { + return payload, err + } + if len(parentNodeList) == 0 { + return payload, tlerr.InvalidArgs("Invalid URI: %s", targetUri) + } + parentNode := parentNodeList[0].Data + + currentNodeList, err := ytypes.GetNode(ygSchema.RootSchema(), deviceObj, path, &(ytypes.GetPartialKeyMatch{})) + if err != nil { + return payload, err + } + if len(currentNodeList) == 0 { + return payload, tlerr.NotFound("Resource not found") + } + //currentNode := currentNodeList[0].Data + currentNodeYangName := currentNodeList[0].Schema.Name + + // Create empty clone of parent node + parentNodeClone := reflect.New(reflect.TypeOf(parentNode).Elem()) + var parentCloneObj ygot.ValidatedGoStruct + var ok bool + if parentCloneObj, ok = (parentNodeClone.Interface()).(ygot.ValidatedGoStruct); ok { + ygot.BuildEmptyTree(parentCloneObj) + pcType := reflect.TypeOf(parentCloneObj).Elem() + pcValue := reflect.ValueOf(parentCloneObj).Elem() + + var currentNodeOCFieldName string + for i := 0; i < pcValue.NumField(); i++ { + fld := pcValue.Field(i) + fldType := pcType.Field(i) + if fldType.Tag.Get("path") == currentNodeYangName { + currentNodeOCFieldName = fldType.Name + // Take value from original parent and set in parent clone + valueFromParent := reflect.ValueOf(parentNode).Elem().FieldByName(currentNodeOCFieldName) + fld.Set(valueFromParent) + break + } + } + if log.V(3) { + log.Infof("Target yang name: %s OC Field name: %s\n", currentNodeYangName, currentNodeOCFieldName) + } + } + + payload, err = dumpIetfJson(parentCloneObj, true) + + return payload, err +} + +func getTargetNodeYangSchema(targetUri string, deviceObj *ocbinds.Device) (*yang.Entry, error) { + if len(targetUri) == 0 { + return nil, tlerr.InvalidArgs("GetResponse failed as target Uri is not valid") + } + path, err := ygot.StringToPath(targetUri, ygot.StructuredPath, ygot.StringSlicePath) + if err != nil { + return nil, tlerr.InvalidArgs("URI to path conversion failed: %v", err) + } + // Get current node (corresponds to ygotTarget) + var pathList []*gnmi.PathElem = path.Elem + for i := 0; i < len(pathList); i++ { + if log.V(3) { + log.Infof("pathList[%d]: %s\n", i, pathList[i]) + } + pathSlice := strings.Split(pathList[i].Name, ":") + pathList[i].Name = pathSlice[len(pathSlice)-1] + } + targetNodeList, err := ytypes.GetNode(ygSchema.RootSchema(), deviceObj, path, &(ytypes.GetPartialKeyMatch{})) + if err != nil { + return nil, tlerr.InvalidArgs("Getting node information failed: %v", err) + } + if len(targetNodeList) == 0 { + return nil, tlerr.NotFound("Resource not found") + } + targetNodeSchema := targetNodeList[0].Schema + //targetNode := targetNodeList[0].Data + if log.V(3) { + log.Infof("Target node yang name: %s\n", targetNodeSchema.Name) + } + return targetNodeSchema, nil +} + +func dumpIetfJson(s ygot.ValidatedGoStruct, skipValidation bool) ([]byte, error) { + jsonStr, err := ygot.EmitJSON(s, &ygot.EmitJSONConfig{ + Format: ygot.RFC7951, + Indent: " ", + SkipValidation: skipValidation, + RFC7951Config: &ygot.RFC7951JSONConfig{ + AppendModuleName: true, + }, + }) + var buf bytes.Buffer + json.Compact(&buf, []byte(jsonStr)) + return []byte(buf.String()), err +} + +func contains(sl []string, str string) bool { + for _, v := range sl { + if v == str { + return true + } + } + return false +} + +func removeElement(sl []string, str string) []string { + for i := 0; i < len(sl); i++ { + if sl[i] == str { + sl = append(sl[:i], sl[i+1:]...) + i-- + sl = sl[:len(sl)] + break + } + } + return sl +} + +// isNotFoundError return true if the error is a 'not found' error +func isNotFoundError(err error) bool { + switch err.(type) { + case tlerr.TranslibRedisClientEntryNotExist, tlerr.NotFoundError: + return true + default: + return false + } +} + +// asKey cretaes a db.Key from given key components +func asKey(parts ...string) db.Key { + return db.Key{Comp: parts} +} + +func createEmptyDbValue(fieldName string) db.Value { + return db.Value{Field: map[string]string{fieldName: ""}} +} diff --git a/src/translib/common_app.go b/src/translib/common_app.go new file mode 100644 index 0000000000..7571bb025c --- /dev/null +++ b/src/translib/common_app.go @@ -0,0 +1,485 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Dell, Inc. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package translib + +import ( + "errors" + "fmt" + "strings" + log "github.com/golang/glog" + "github.com/openconfig/ygot/ygot" + "reflect" + "translib/db" + "translib/ocbinds" + "translib/tlerr" + "translib/transformer" + "encoding/json" +) + +var () + +type CommonApp struct { + pathInfo *PathInfo + ygotRoot *ygot.GoStruct + ygotTarget *interface{} + cmnAppTableMap map[string]map[string]db.Value + cmnAppOrdTbllist []string +} + +var cmnAppInfo = appInfo{appType: reflect.TypeOf(CommonApp{}), + ygotRootType: nil, + isNative: false, + tablesToWatch: nil} + +func init() { + + register_model_path := []string{"/sonic-", "*"} // register yang model path(s) to be supported via common app + for _, mdl_pth := range register_model_path { + err := register(mdl_pth, &cmnAppInfo) + + if err != nil { + log.Fatal("Register Common app module with App Interface failed with error=", err, "for path=", mdl_pth) + } + } + +} + +func (app *CommonApp) initialize(data appData) { + log.Info("initialize:path =", data.path) + pathInfo := NewPathInfo(data.path) + *app = CommonApp{pathInfo: pathInfo, ygotRoot: data.ygotRoot, ygotTarget: data.ygotTarget} + +} + +func (app *CommonApp) translateCreate(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateCreate:path =", app.pathInfo.Path) + + keys, err = app.translateCRUDCommon(d, CREATE) + + return keys, err +} + +func (app *CommonApp) translateUpdate(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateUpdate:path =", app.pathInfo.Path) + + keys, err = app.translateCRUDCommon(d, UPDATE) + + return keys, err +} + +func (app *CommonApp) translateReplace(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateReplace:path =", app.pathInfo.Path) + + keys, err = app.translateCRUDCommon(d, REPLACE) + + return keys, err +} + +func (app *CommonApp) translateDelete(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateDelete:path =", app.pathInfo.Path) + keys, err = app.translateCRUDCommon(d, DELETE) + + return keys, err +} + +func (app *CommonApp) translateGet(dbs [db.MaxDB]*db.DB) error { + var err error + log.Info("translateGet:path =", app.pathInfo.Path) + return err +} + +func (app *CommonApp) translateSubscribe(dbs [db.MaxDB]*db.DB, path string) (*notificationOpts, *notificationInfo, error) { + err := errors.New("Not supported") + notifInfo := notificationInfo{dbno: db.ConfigDB} + return nil, ¬ifInfo, err +} + +func (app *CommonApp) processCreate(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + + log.Info("processCreate:path =", app.pathInfo.Path) + targetType := reflect.TypeOf(*app.ygotTarget) + log.Infof("processCreate: Target object is a <%s> of Type: %s", targetType.Kind().String(), targetType.Elem().Name()) + if err = app.processCommon(d, CREATE); err != nil { + log.Error(err) + resp = SetResponse{ErrSrc: AppErr} + } + + return resp, err +} + +func (app *CommonApp) processUpdate(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + log.Info("processUpdate:path =", app.pathInfo.Path) + if err = app.processCommon(d, UPDATE); err != nil { + log.Error(err) + resp = SetResponse{ErrSrc: AppErr} + } + + return resp, err +} + +func (app *CommonApp) processReplace(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + log.Info("processReplace:path =", app.pathInfo.Path) + if err = app.processCommon(d, REPLACE); err != nil { + log.Error(err) + resp = SetResponse{ErrSrc: AppErr} + } + return resp, err +} + +func (app *CommonApp) processDelete(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + + log.Info("processDelete:path =", app.pathInfo.Path) + + if err = app.processCommon(d, DELETE); err != nil { + log.Error(err) + resp = SetResponse{ErrSrc: AppErr} + } + + return resp, err +} + +func (app *CommonApp) processGet(dbs [db.MaxDB]*db.DB) (GetResponse, error) { + var err error + var payload []byte + var resPayload []byte + log.Info("processGet:path =", app.pathInfo.Path) + + payload, err = transformer.GetAndXlateFromDB(app.pathInfo.Path, app.ygotRoot, dbs) + if err != nil { + log.Error("transformer.transformer.GetAndXlateFromDB failure. error:", err) + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + + targetObj, _ := (*app.ygotTarget).(ygot.GoStruct) + if targetObj != nil { + err = ocbinds.Unmarshal(payload, targetObj) + if err != nil { + log.Error("ocbinds.Unmarshal() failed. error:", err) + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + + resPayload, err = generateGetResponsePayload(app.pathInfo.Path, (*app.ygotRoot).(*ocbinds.Device), app.ygotTarget) + if err != nil { + log.Error("generateGetResponsePayload() failed") + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + var dat map[string]interface{} + err = json.Unmarshal(resPayload, &dat) + } else { + log.Warning("processGet. targetObj is null. Unable to Unmarshal payload") + resPayload = payload + } + + return GetResponse{Payload: resPayload}, err +} + +func (app *CommonApp) translateCRUDCommon(d *db.DB, opcode int) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + var tblsToWatch []*db.TableSpec + var OrdTblList []string + var moduleNm string + log.Info("translateCRUDCommon:path =", app.pathInfo.Path) + + /* retrieve schema table order for incoming module name request */ + moduleNm, err = transformer.GetModuleNmFromPath(app.pathInfo.Path) + if (err != nil) || (len(moduleNm) == 0) { + log.Error("GetModuleNmFromPath() failed") + return keys, err + } + log.Info("getModuleNmFromPath() returned module name = ", moduleNm) + OrdTblList, err = transformer.GetOrdDBTblList(moduleNm) + if (err != nil) || (len(OrdTblList) == 0) { + log.Error("GetOrdDBTblList() failed") + return keys, err + } + + log.Info("GetOrdDBTblList() returned ordered table list = ", OrdTblList) + app.cmnAppOrdTbllist = OrdTblList + + /* enhance this to handle dependent tables - need CVL to provide list of such tables for a given request */ + for _, tblnm := range OrdTblList { // OrdTblList already has has all tables corresponding to a module + tblsToWatch = append(tblsToWatch, &db.TableSpec{Name: tblnm}) + } + log.Info("Tables to watch", tblsToWatch) + + cmnAppInfo.tablesToWatch = tblsToWatch + + // translate yang to db + result, err := transformer.XlateToDb(app.pathInfo.Path, opcode, d, (*app).ygotRoot, (*app).ygotTarget) + fmt.Println(result) + log.Info("transformer.XlateToDb() returned", result) + + if err != nil { + log.Error(err) + return keys, err + } + if len(result) == 0 { + log.Error("XlatetoDB() returned empty map") + err = errors.New("transformer.XlatetoDB() returned empty map") + return keys, err + } + app.cmnAppTableMap = result + + keys, err = app.generateDbWatchKeys(d, false) + + return keys, err +} + +func (app *CommonApp) processCommon(d *db.DB, opcode int) error { + + var err error + + log.Info("Processing DB operation for ", app.cmnAppTableMap) + switch opcode { + case CREATE: + log.Info("CREATE case") + err = app.cmnAppCRUCommonDbOpn(d, opcode) + case UPDATE: + log.Info("UPDATE case") + err = app.cmnAppCRUCommonDbOpn(d, opcode) + case REPLACE: + log.Info("REPLACE case") + err = app.cmnAppCRUCommonDbOpn(d, opcode) + case DELETE: + log.Info("DELETE case") + err = app.cmnAppDelDbOpn(d, opcode) + } + if err != nil { + log.Info("Returning from processCommon() - fail") + } else { + log.Info("Returning from processCommon() - success") + } + return err +} + +func (app *CommonApp) cmnAppCRUCommonDbOpn(d *db.DB, opcode int) error { + var err error + var cmnAppTs *db.TableSpec + + /* currently ordered by schema table order needs to be discussed */ + for _, tblNm := range app.cmnAppOrdTbllist { + log.Info("In Yang to DB map returned from transformer looking for table = ", tblNm) + if tblVal, ok := app.cmnAppTableMap[tblNm]; ok { + cmnAppTs = &db.TableSpec{Name: tblNm} + log.Info("Found table entry in yang to DB map") + for tblKey, tblRw := range tblVal { + log.Info("Processing Table key and row ", tblKey, tblRw) + existingEntry, _ := d.GetEntry(cmnAppTs, db.Key{Comp: []string{tblKey}}) + switch opcode { + case CREATE: + if existingEntry.IsPopulated() { + log.Info("Entry already exists hence return.") + return tlerr.AlreadyExists("Entry %s already exists", tblKey) + } else { + err = d.CreateEntry(cmnAppTs, db.Key{Comp: []string{tblKey}}, tblRw) + if err != nil { + log.Error("CREATE case - d.CreateEntry() failure") + return err + } + } + case UPDATE: + if existingEntry.IsPopulated() { + log.Info("Entry already exists hence modifying it.") + /* Handle leaf-list merge if any leaf-list exists + A leaf-list field in redis has "@" suffix as per swsssdk convention. + */ + resTblRw := db.Value{Field: map[string]string{}} + resTblRw = checkAndProcessLeafList(existingEntry, tblRw, UPDATE, d, tblNm, tblKey) + err = d.ModEntry(cmnAppTs, db.Key{Comp: []string{tblKey}}, resTblRw) + if err != nil { + log.Error("UPDATE case - d.ModEntry() failure") + return err + } + } else { + // workaround to patch operation from CLI + log.Info("Create(pathc) an entry.") + err = d.CreateEntry(cmnAppTs, db.Key{Comp: []string{tblKey}}, tblRw) + if err != nil { + log.Error("UPDATE case - d.CreateEntry() failure") + return err + } + } + case REPLACE: + if existingEntry.IsPopulated() { + log.Info("Entry already exists hence execute db.SetEntry") + err := d.SetEntry(cmnAppTs, db.Key{Comp: []string{tblKey}}, tblRw) + if err != nil { + log.Error("REPLACE case - d.SetEntry() failure") + return err + } + } else { + log.Info("Entry doesn't exist hence create it.") + err = d.CreateEntry(cmnAppTs, db.Key{Comp: []string{tblKey}}, tblRw) + if err != nil { + log.Error("REPLACE case - d.CreateEntry() failure") + return err + } + } + } + } + } + } + return err +} + +func (app *CommonApp) cmnAppDelDbOpn(d *db.DB, opcode int) error { + var err error + var cmnAppTs, dbTblSpec *db.TableSpec + + /* needs enhancements from CVL to give table dependencies, and grouping of related tables only + if such a case where the sonic yang has unrelated tables */ + for tblidx, tblNm := range app.cmnAppOrdTbllist { + log.Info("In Yang to DB map returned from transformer looking for table = ", tblNm) + if tblVal, ok := app.cmnAppTableMap[tblNm]; ok { + cmnAppTs = &db.TableSpec{Name: tblNm} + log.Info("Found table entry in yang to DB map") + if len(tblVal) == 0 { + log.Info("DELETE case - No table instances/rows found hence delete entire table = ", tblNm) + for idx := len(app.cmnAppOrdTbllist)-1; idx >= tblidx+1; idx-- { + log.Info("Since parent table is to be deleted, first deleting child table = ", app.cmnAppOrdTbllist[idx]) + dbTblSpec = &db.TableSpec{Name: app.cmnAppOrdTbllist[idx]} + err = d.DeleteTable(dbTblSpec) + if err != nil { + log.Warning("DELETE case - d.DeleteTable() failure for Table = ", app.cmnAppOrdTbllist[idx]) + return err + } + } + err = d.DeleteTable(cmnAppTs) + if err != nil { + log.Warning("DELETE case - d.DeleteTable() failure for Table = ", tblNm) + return err + } + log.Info("DELETE case - Deleted entire table = ", tblNm) + log.Info("Done processing all tables.") + break + + } + + for tblKey, tblRw := range tblVal { + if len(tblRw.Field) == 0 { + log.Info("DELETE case - no fields/cols to delete hence delete the entire row.") + log.Info("First, delete child table instances that correspond to parent table instance to be deleted = ", tblKey) + for idx := len(app.cmnAppOrdTbllist)-1; idx >= tblidx+1; idx-- { + dbTblSpec = &db.TableSpec{Name: app.cmnAppOrdTbllist[idx]} + keyPattern := tblKey + "|*" + log.Info("Key pattern to be matched for deletion = ", keyPattern) + err = d.DeleteKeys(dbTblSpec, db.Key{Comp: []string{keyPattern}}) + if err != nil { + log.Warning("DELETE case - d.DeleteTable() failure for Table = ", app.cmnAppOrdTbllist[idx]) + return err + } + log.Info("Deleted keys matching parent table key pattern for child table = ", app.cmnAppOrdTbllist[idx]) + + } + err = d.DeleteEntry(cmnAppTs, db.Key{Comp: []string{tblKey}}) + if err != nil { + log.Warning("DELETE case - d.DeleteEntry() failure") + return err + } + log.Info("Finally deleted the parent table row with key = ", tblKey) + } else { + log.Info("DELETE case - fields/cols to delete hence delete only those fields.") + existingEntry, _ := d.GetEntry(cmnAppTs, db.Key{Comp: []string{tblKey}}) + if !existingEntry.IsPopulated() { + log.Info("Table Entry from which the fields are to be deleted does not exist") + return err + } + /* handle leaf-list merge if any leaf-list exists */ + resTblRw := checkAndProcessLeafList(existingEntry, tblRw, DELETE, d, tblNm, tblKey) + err := d.DeleteEntryFields(cmnAppTs, db.Key{Comp: []string{tblKey}}, resTblRw) + if err != nil { + log.Error("DELETE case - d.DeleteEntryFields() failure") + return err + } + } + + } + } + } /* end of ordered table list for loop */ + return err +} + +func (app *CommonApp) generateDbWatchKeys(d *db.DB, isDeleteOp bool) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + + return keys, err +} + +/*check if any field is leaf-list , if yes perform merge*/ +func checkAndProcessLeafList(existingEntry db.Value, tblRw db.Value, opcode int, d *db.DB, tblNm string, tblKey string) db.Value { + dbTblSpec := &db.TableSpec{Name: tblNm} + mergeTblRw := db.Value{Field: map[string]string{}} + for field, value := range tblRw.Field { + if strings.HasSuffix(field, "@") { + exstLst := existingEntry.GetList(field) + if len(exstLst) != 0 { + valueLst := strings.Split(value, ",") + for _, item := range valueLst { + if !contains(exstLst, item) { + if opcode == UPDATE { + exstLst = append(exstLst, item) + } + } else { + if opcode == DELETE { + exstLst = removeElement(exstLst, item) + } + + } + } + log.Infof("For field %v value after merge %v", field, exstLst) + if opcode == DELETE { + mergeTblRw.SetList(field, exstLst) + delete(tblRw.Field, field) + } + } + tblRw.SetList(field, exstLst) + } + } + /* delete specific item from leaf-list */ + if opcode == DELETE { + if len(mergeTblRw.Field) == 0 { + return tblRw + } + err := d.ModEntry(dbTblSpec, db.Key{Comp: []string{tblKey}}, mergeTblRw) + if err != nil { + log.Warning("DELETE case(merge leaf-list) - d.ModEntry() failure") + } + } + log.Infof("Returning Table Row %v", tblRw) + return tblRw +} + diff --git a/src/translib/db/db.go b/src/translib/db/db.go new file mode 100644 index 0000000000..451bc92383 --- /dev/null +++ b/src/translib/db/db.go @@ -0,0 +1,1375 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +/* +Package db implements a wrapper over the go-redis/redis. + +There may be an attempt to mimic sonic-py-swsssdk to ease porting of +code written in python using that SDK to Go Language. + +Example: + + * Initialization: + + d, _ := db.NewDB(db.Options { + DBNo : db.ConfigDB, + InitIndicator : "CONFIG_DB_INITIALIZED", + TableNameSeparator: "|", + KeySeparator : "|", + }) + + * Close: + + d.DeleteDB() + + + * No-Transaction SetEntry + + tsa := db.TableSpec { Name: "ACL_TABLE" } + tsr := db.TableSpec { Name: "ACL_RULE" } + + ca := make([]string, 1, 1) + + ca[0] = "MyACL1_ACL_IPV4" + akey := db.Key { Comp: ca} + avalue := db.Value {map[string]string {"ports":"eth0","type":"mirror" }} + + d.SetEntry(&tsa, akey, avalue) + + * GetEntry + + avalue, _ := d.GetEntry(&tsa, akey) + + * GetKeys + + keys, _ := d.GetKeys(&tsa); + + * No-Transaction DeleteEntry + + d.DeleteEntry(&tsa, akey) + + * GetTable + + ta, _ := d.GetTable(&tsa) + + * No-Transaction DeleteTable + + d.DeleteTable(&ts) + + * Transaction + + rkey := db.Key { Comp: []string { "MyACL2_ACL_IPV4", "RULE_1" }} + rvalue := db.Value { Field: map[string]string { + "priority" : "0", + "packet_action" : "eth1", + }, + } + + d.StartTx([]db.WatchKeys { {Ts: &tsr, Key: &rkey} }, + []*db.TableSpec { &tsa, &tsr }) + + d.SetEntry( &tsa, akey, avalue) + d.SetEntry( &tsr, rkey, rvalue) + + e := d.CommitTx() + + * Transaction Abort + + d.StartTx([]db.WatchKeys {}, + []*db.TableSpec { &tsa, &tsr }) + d.DeleteEntry( &tsa, rkey) + d.AbortTx() + + +*/ +package db + +import ( + "fmt" + "strconv" + + // "reflect" + "errors" + "strings" + + "github.com/go-redis/redis" + "github.com/golang/glog" + "cvl" + "translib/tlerr" +) + +const ( + DefaultRedisUNIXSocket string = "/var/run/redis/redis.sock" + DefaultRedisLocalTCPEP string = "localhost:6379" + DefaultRedisRemoteTCPEP string = "127.0.0.1:6379" +) + +func init() { +} + +// DBNum type indicates the type of DB (Eg: ConfigDB, ApplDB, ...). +type DBNum int + +const ( + ApplDB DBNum = iota // 0 + AsicDB // 1 + CountersDB // 2 + LogLevelDB // 3 + ConfigDB // 4 + FlexCounterDB // 5 + StateDB // 6 + + // All DBs added above this line, please ---- + MaxDB // 7 The Number of DBs +) + +func(dbNo DBNum) String() string { + return fmt.Sprintf("%d", dbNo) +} + +// Options gives parameters for opening the redis client. +type Options struct { + DBNo DBNum + InitIndicator string + TableNameSeparator string + KeySeparator string + + DisableCVLCheck bool +} + +func (o Options) String() string { + return fmt.Sprintf( + "{ DBNo: %v, InitIndicator: %v, TableNameSeparator: %v, KeySeparator: %v , DisableCVLCheck: %v }", + o.DBNo, o.InitIndicator, o.TableNameSeparator, o.KeySeparator, + o.DisableCVLCheck) +} + +type _txState int + +const ( + txStateNone _txState = iota // Idle (No transaction) + txStateWatch // WATCH issued + txStateSet // At least one Set|Mod|Delete done. + txStateMultiExec // Between MULTI & EXEC +) + +func (s _txState) String() string { + var state string + switch s { + case txStateNone: + state = "txStateNone" + case txStateWatch: + state = "txStateWatch" + case txStateSet: + state = "txStateSet" + case txStateMultiExec: + state = "txStateMultiExec" + default: + state = "Unknown _txState" + } + return state +} + +const ( + InitialTxPipelineSize int = 100 +) + +// TableSpec gives the name of the table, and other per-table customizations. +// (Eg: { Name: ACL_TABLE" }). +type TableSpec struct { + Name string + // https://github.com/project-arlo/sonic-mgmt-framework/issues/29 + // CompCt tells how many components in the key. Only the last component + // can have TableSeparator as part of the key. Otherwise, we cannot + // tell where the key component begins. + CompCt int +} + +// Key gives the key components. +// (Eg: { Comp : [] string { "acl1", "rule1" } } ). +type Key struct { + Comp []string +} + +func (k Key) String() string { + return fmt.Sprintf("{ Comp: %v }", k.Comp) +} + +// Value gives the fields as a map. +// (Eg: { Field: map[string]string { "type" : "l3v6", "ports" : "eth0" } } ). +type Value struct { + Field map[string]string +} + +// Table gives the entire table a a map. +// (Eg: { ts: &TableSpec{ Name: "ACL_TABLE" }, +// entry: map[string]Value { +// "ACL_TABLE|acl1|rule1_1": Value { +// Field: map[string]string { +// "type" : "l3v6", "ports" : "Ethernet0", +// } +// }, +// "ACL_TABLE|acl1|rule1_2": Value { +// Field: map[string]string { +// "type" : "l3v6", "ports" : "eth0", +// } +// }, +// } +// }) + +type Table struct { + ts *TableSpec + entry map[string]Value + db *DB +} + +type _txOp int + +const ( + txOpNone _txOp = iota // No Op + txOpHMSet // key, value gives the field:value to be set in key + txOpHDel // key, value gives the fields to be deleted in key + txOpDel // key +) + +type _txCmd struct { + ts *TableSpec + op _txOp + key *Key + value *Value +} + +// DB is the main type. +type DB struct { + client *redis.Client + Opts *Options + + txState _txState + txCmds []_txCmd + cv *cvl.CVL + cvlEditConfigData [] cvl.CVLEditConfigData + +/* + sKeys []*SKey // Subscribe Key array + sHandler HFunc // Handler Function + sCh <-chan *redis.Message // non-Nil implies SubscribeDB +*/ + sPubSub *redis.PubSub // PubSub. non-Nil implies SubscribeDB + sCIP bool // Close in Progress +} + +func (d DB) String() string { + return fmt.Sprintf("{ client: %v, Opts: %v, txState: %v, tsCmds: %v }", + d.client, d.Opts, d.txState, d.txCmds) +} + +// NewDB is the factory method to create new DB's. +func NewDB(opt Options) (*DB, error) { + + var e error + + if glog.V(3) { + glog.Info("NewDB: Begin: opt: ", opt) + } + + d := DB{client: redis.NewClient(&redis.Options{ + Network: "tcp", + Addr: DefaultRedisLocalTCPEP, + //Addr: DefaultRedisRemoteTCPEP, + Password: "", /* TBD */ + // DB: int(4), /* CONFIG_DB DB No. */ + DB: int(opt.DBNo), + DialTimeout: 0, + // For Transactions, limit the pool + PoolSize: 1, + // Each DB gets it own (single) connection. + }), + Opts: &opt, + txState: txStateNone, + txCmds: make([]_txCmd, 0, InitialTxPipelineSize), + cvlEditConfigData: make([]cvl.CVLEditConfigData, 0, InitialTxPipelineSize), + } + + if d.client == nil { + glog.Error("NewDB: Could not create redis client") + e = tlerr.TranslibDBCannotOpen { } + goto NewDBExit + } + + if opt.DBNo != ConfigDB { + if glog.V(3) { + glog.Info("NewDB: ! ConfigDB. Skip init. check.") + } + goto NewDBSkipInitIndicatorCheck + } + + if len(d.Opts.InitIndicator) == 0 { + + glog.Info("NewDB: Init indication not requested") + + } else if init, _ := d.client.Get(d.Opts.InitIndicator).Int(); init != 1 { + + glog.Error("NewDB: Database not inited") + e = tlerr.TranslibDBNotInit { } + goto NewDBExit + } + +NewDBSkipInitIndicatorCheck: + +NewDBExit: + + if glog.V(3) { + glog.Info("NewDB: End: d: ", d, " e: ", e) + } + + return &d, e +} + +// DeleteDB is the gentle way to close the DB connection. +func (d *DB) DeleteDB() error { + + if glog.V(3) { + glog.Info("DeleteDB: Begin: d: ", d) + } + + if d.txState != txStateNone { + glog.Warning("DeleteDB: not txStateNone, txState: ", d.txState) + } + + return d.client.Close() +} + +func (d *DB) key2redis(ts *TableSpec, key Key) string { + + if glog.V(5) { + glog.Info("key2redis: Begin: ", + ts.Name+ + d.Opts.TableNameSeparator+ + strings.Join(key.Comp, d.Opts.KeySeparator)) + } + return ts.Name + + d.Opts.TableNameSeparator + + strings.Join(key.Comp, d.Opts.KeySeparator) +} + +func (d *DB) redis2key(ts *TableSpec, redisKey string) Key { + + splitTable := strings.SplitN(redisKey, d.Opts.TableNameSeparator, 2) + + if ts.CompCt > 0 { + return Key{strings.SplitN(splitTable[1],d.Opts.KeySeparator, ts.CompCt)} + } else { + return Key{strings.Split(splitTable[1], d.Opts.KeySeparator)} + } + +} + +func (d *DB) ts2redisUpdated(ts *TableSpec) string { + + if glog.V(5) { + glog.Info("ts2redisUpdated: Begin: ", ts.Name) + } + + var updated string + + if strings.Contains(ts.Name, "*") { + updated = string("CONFIG_DB_UPDATED") + } else { + updated = string("CONFIG_DB_UPDATED_") + ts.Name + } + + return updated +} + +// GetEntry retrieves an entry(row) from the table. +func (d *DB) GetEntry(ts *TableSpec, key Key) (Value, error) { + + if glog.V(3) { + glog.Info("GetEntry: Begin: ", "ts: ", ts, " key: ", key) + } + + var value Value + + /* + m := make(map[string]string) + m["f0.0"] = "v0.0" + m["f0.1"] = "v0.1" + m["f0.2"] = "v0.2" + v := Value{Field: m} + */ + + v, e := d.client.HGetAll(d.key2redis(ts, key)).Result() + + if len(v) != 0 { + value = Value{Field: v} + } else { + if glog.V(4) { + glog.Info("GetEntry: HGetAll(): empty map") + } + // e = errors.New("Entry does not exist") + e = tlerr.TranslibRedisClientEntryNotExist { Entry: d.key2redis(ts, key) } + } + + if glog.V(3) { + glog.Info("GetEntry: End: ", "value: ", value, " e: ", e) + } + + return value, e +} + +// GetKeys retrieves all entry/row keys. +func (d *DB) GetKeys(ts *TableSpec) ([]Key, error) { + + if glog.V(3) { + glog.Info("GetKeys: Begin: ", "ts: ", ts) + } + + /* + k := []Key{ + {[]string{"k0.0", "k0.1"}}, + {[]string{"k1.0", "k1.1"}}, + } + */ + redisKeys, e := d.client.Keys(d.key2redis(ts, + Key{Comp: []string{"*"}})).Result() + if glog.V(4) { + glog.Info("GetKeys: redisKeys: ", redisKeys, " e: ", e) + } + + keys := make([]Key, 0, len(redisKeys)) + for i := 0; i < len(redisKeys); i++ { + keys = append(keys, d.redis2key(ts, redisKeys[i])) + } + + if glog.V(3) { + glog.Info("GetKeys: End: ", "keys: ", keys, " e: ", e) + } + + return keys, e +} + +// DeleteKeys deletes all entry/row keys matching a pattern. +func (d *DB) DeleteKeys(ts *TableSpec, key Key) error { + if glog.V(3) { + glog.Info("DeleteKeys: Begin: ", "ts: ", ts, " key: ", key) + } + + // This can be done via a LUA script as well. For now do this. TBD + redisKeys, e := d.client.Keys(d.key2redis(ts, key)).Result() + if glog.V(4) { + glog.Info("DeleteKeys: redisKeys: ", redisKeys, " e: ", e) + } + + for i := 0; i < len(redisKeys); i++ { + if glog.V(4) { + glog.Info("DeleteKeys: Deleting redisKey: ", redisKeys[i]) + } + e = d.DeleteEntry(ts, d.redis2key(ts, redisKeys[i])) + if e != nil { + glog.Warning("DeleteKeys: Deleting: ts: ", ts, " key", + d.redis2key(ts, redisKeys[i]), " : ", e) + } + } + + if glog.V(3) { + glog.Info("DeleteKeys: End: e: ", e) + } + return e +} + + +func (d *DB) doCVL(ts * TableSpec, cvlOps []cvl.CVLOperation, key Key, vals []Value) error { + var e error = nil + + var cvlRetCode cvl.CVLRetCode + var cei cvl.CVLErrorInfo + + if d.Opts.DisableCVLCheck { + glog.Info("doCVL: CVL Disabled. Skipping CVL") + goto doCVLExit + } + + // No Transaction case. No CVL. + if d.txState == txStateNone { + glog.Info("doCVL: No Transactions. Skipping CVL") + goto doCVLExit + } + + if len(cvlOps) != len(vals) { + glog.Error("doCVL: Incorrect arguments len(cvlOps) != len(vals)") + e = errors.New("CVL Incorrect args") + return e + } + for i := 0; i < len(cvlOps); i++ { + + cvlEditConfigData := cvl.CVLEditConfigData { + VType: cvl.VALIDATE_ALL, + VOp: cvlOps[i], + Key: d.key2redis(ts, key), + } + + switch cvlOps[i] { + case cvl.OP_CREATE, cvl.OP_UPDATE: + cvlEditConfigData.Data = vals[i].Field + d.cvlEditConfigData = append(d.cvlEditConfigData, cvlEditConfigData) + + case cvl.OP_DELETE: + if len(vals[i].Field) == 0 { + cvlEditConfigData.Data = map[string]string {} + } else { + cvlEditConfigData.Data = vals[i].Field + } + d.cvlEditConfigData = append(d.cvlEditConfigData, cvlEditConfigData) + + default: + glog.Error("doCVL: Unknown, op: ", cvlOps[i]) + e = errors.New("Unknown Op: " + string(cvlOps[i])) + } + + } + + if e != nil { + goto doCVLExit + } + + if glog.V(3) { + glog.Info("doCVL: calling ValidateEditConfig: ", d.cvlEditConfigData) + } + + cei, cvlRetCode = d.cv.ValidateEditConfig(d.cvlEditConfigData) + + if cvl.CVL_SUCCESS != cvlRetCode { + glog.Error("doCVL: CVL Failure: " , cvlRetCode) + // e = errors.New("CVL Failure: " + string(cvlRetCode)) + e = tlerr.TranslibCVLFailure { Code: int(cvlRetCode), + CVLErrorInfo: cei } + glog.Error("doCVL: " , len(d.cvlEditConfigData), len(cvlOps)) + d.cvlEditConfigData = d.cvlEditConfigData[:len(d.cvlEditConfigData) - len(cvlOps)] + } else { + for i := 0; i < len(cvlOps); i++ { + d.cvlEditConfigData[len(d.cvlEditConfigData)-1-i].VType = cvl.VALIDATE_NONE; + } + } + +doCVLExit: + + if glog.V(3) { + glog.Info("doCVL: End: e: ", e) + } + + return e +} + +func (d *DB) doWrite(ts * TableSpec, op _txOp, key Key, val interface{}) error { + var e error = nil + var value Value + + switch d.txState { + case txStateNone: + if glog.V(2) { + glog.Info("doWrite: No Transaction.") + } + break + case txStateWatch: + if glog.V(2) { + glog.Info("doWrite: Change to txStateSet, txState: ", d.txState) + } + d.txState = txStateSet + break + case txStateSet: + if glog.V(5) { + glog.Info("doWrite: Remain in txStateSet, txState: ", d.txState) + } + case txStateMultiExec: + glog.Error("doWrite: Incorrect State, txState: ", d.txState) + e = errors.New("Cannot issue {Set|Mod|Delete}Entry in txStateMultiExec") + default: + glog.Error("doWrite: Unknown, txState: ", d.txState) + e = errors.New("Unknown State: " + string(d.txState)) + } + + if e != nil { + goto doWriteExit + } + + // No Transaction case. No CVL. + if d.txState == txStateNone { + + switch op { + + case txOpHMSet: + value = Value { Field: make(map[string]string, + len(val.(Value).Field)) } + vintf := make(map[string]interface{}) + for k, v := range val.(Value).Field { + vintf[k] = v + } + e = d.client.HMSet(d.key2redis(ts, key), vintf).Err() + + if e!= nil { + glog.Error("doWrite: HMSet: ", key, " : ", value, " e: ", e) + } + + case txOpHDel: + fields := make([]string, 0, len(val.(Value).Field)) + for k, _ := range val.(Value).Field { + fields = append(fields, k) + } + + e = d.client.HDel(d.key2redis(ts, key), fields...).Err() + if e!= nil { + glog.Error("doWrite: HDel: ", key, " : ", fields, " e: ", e) + } + + case txOpDel: + e = d.client.Del(d.key2redis(ts, key)).Err() + if e!= nil { + glog.Error("doWrite: Del: ", key, " : ", e) + } + + default: + glog.Error("doWrite: Unknown, op: ", op) + e = errors.New("Unknown Op: " + string(op)) + } + + goto doWriteExit + } + + // Transaction case. + + glog.Info("doWrite: op: ", op, " ", key, " : ", value) + + switch op { + case txOpHMSet, txOpHDel: + value = val.(Value) + + case txOpDel: + + default: + glog.Error("doWrite: Unknown, op: ", op) + e = errors.New("Unknown Op: " + string(op)) + } + + if e != nil { + goto doWriteExit + } + + d.txCmds = append(d.txCmds, _txCmd{ + ts: ts, + op: op, + key: &key, + value: &value, + }) + +doWriteExit: + + if glog.V(3) { + glog.Info("doWrite: End: e: ", e) + } + + return e +} + +// setEntry either Creates, or Sets an entry(row) in the table. +func (d *DB) setEntry(ts *TableSpec, key Key, value Value, isCreate bool) error { + + var e error = nil + var valueComplement Value = Value { Field: make(map[string]string,len(value.Field))} + var valueCurrent Value + + if glog.V(3) { + glog.Info("setEntry: Begin: ", "ts: ", ts, " key: ", key, + " value: ", value, " isCreate: ", isCreate) + } + + if len(value.Field) == 0 { + glog.Info("setEntry: Mapping to DeleteEntry()") + e = d.DeleteEntry(ts, key) + goto setEntryExit + } + + if isCreate == false { + // Prepare the HDel list + // Note: This is for compatibililty with PySWSSDK semantics. + // The CVL library will likely fail the SetEntry when + // the item exists. + valueCurrent, e = d.GetEntry(ts, key) + if e == nil { + for k, _ := range valueCurrent.Field { + _, present := value.Field[k] + if ! present { + valueComplement.Field[k] = string("") + } + } + } + } + + if isCreate == false && e == nil { + if glog.V(3) { + glog.Info("setEntry: DoCVL for UPDATE") + } + if len(valueComplement.Field) == 0 { + e = d.doCVL(ts, []cvl.CVLOperation {cvl.OP_UPDATE}, + key, []Value { value} ) + } else { + e = d.doCVL(ts, []cvl.CVLOperation {cvl.OP_UPDATE, cvl.OP_DELETE}, + key, []Value { value, valueComplement} ) + } + } else { + if glog.V(3) { + glog.Info("setEntry: DoCVL for CREATE") + } + e = d.doCVL(ts, []cvl.CVLOperation {cvl.OP_CREATE}, key, []Value { value }) + } + + if e != nil { + goto setEntryExit + } + + e = d.doWrite(ts, txOpHMSet, key, value) + + if (e == nil) && (len(valueComplement.Field) != 0) { + if glog.V(3) { + glog.Info("setEntry: DoCVL for HDEL (post-POC)") + } + e = d.doWrite(ts, txOpHDel, key, valueComplement) + } + +setEntryExit: + return e +} + +// CreateEntry creates an entry(row) in the table. +func (d * DB) CreateEntry(ts * TableSpec, key Key, value Value) error { + + return d.setEntry(ts, key, value, true) +} + +// SetEntry sets an entry(row) in the table. +func (d *DB) SetEntry(ts *TableSpec, key Key, value Value) error { + return d.setEntry(ts, key, value, false) +} + +// DeleteEntry deletes an entry(row) in the table. +func (d *DB) DeleteEntry(ts *TableSpec, key Key) error { + + var e error = nil + if glog.V(3) { + glog.Info("DeleteEntry: Begin: ", "ts: ", ts, " key: ", key) + } + + if glog.V(3) { + glog.Info("DeleteEntry: DoCVL for DELETE") + } + e = d.doCVL(ts, []cvl.CVLOperation {cvl.OP_DELETE}, key, []Value {Value{}}) + + if e == nil { + e = d.doWrite(ts, txOpDel, key, nil) + } + + return e; +} + +// ModEntry modifies an entry(row) in the table. +func (d *DB) ModEntry(ts *TableSpec, key Key, value Value) error { + + var e error = nil + + if glog.V(3) { + glog.Info("ModEntry: Begin: ", "ts: ", ts, " key: ", key, + " value: ", value) + } + + if len(value.Field) == 0 { + glog.Info("ModEntry: Mapping to DeleteEntry()") + e = d.DeleteEntry(ts, key) + goto ModEntryExit + } + + if glog.V(3) { + glog.Info("ModEntry: DoCVL for UPDATE") + } + e = d.doCVL(ts, []cvl.CVLOperation {cvl.OP_UPDATE}, key, []Value {value}) + + if e == nil { + e = d.doWrite(ts, txOpHMSet, key, value) + } + +ModEntryExit: + + return e +} + +// DeleteEntryFields deletes some fields/columns in an entry(row) in the table. +func (d *DB) DeleteEntryFields(ts *TableSpec, key Key, value Value) error { + + if glog.V(3) { + glog.Info("DeleteEntryFields: Begin: ", "ts: ", ts, " key: ", key, + " value: ", value) + } + + if glog.V(3) { + glog.Info("DeleteEntryFields: DoCVL for HDEL (post-POC)") + } + + if glog.V(3) { + glog.Info("DeleteEntryFields: DoCVL for HDEL") + } + + e := d.doCVL(ts, []cvl.CVLOperation {cvl.OP_DELETE}, key, []Value{value}) + + if e == nil { + d.doWrite(ts, txOpHDel, key, value) + } + + return e +} + + +// GetTable gets the entire table. +func (d *DB) GetTable(ts *TableSpec) (Table, error) { + if glog.V(3) { + glog.Info("GetTable: Begin: ts: ", ts) + } + + /* + table := Table{ + ts: ts, + entry: map[string]Value{ + "table1|k0.0|k0.1": Value{ + map[string]string{ + "f0.0": "v0.0", + "f0.1": "v0.1", + "f0.2": "v0.2", + }, + }, + "table1|k1.0|k1.1": Value{ + map[string]string{ + "f1.0": "v1.0", + "f1.1": "v1.1", + "f1.2": "v1.2", + }, + }, + }, + db: d, + } + */ + + // Create Table + table := Table{ + ts: ts, + entry: make(map[string]Value), + db: d, + } + + // This can be done via a LUA script as well. For now do this. TBD + // Read Keys + keys, e := d.GetKeys(ts) + if e != nil { + glog.Error("GetTable: GetKeys: " + e.Error()) + goto GetTableExit + } + + // For each key in Keys + // Add Value into table.entry[key)] + for i := 0; i < len(keys); i++ { + value, e := d.GetEntry(ts, keys[i]) + if e != nil { + glog.Warning("GetTable: GetKeys: " + e.Error()) + continue + } + table.entry[d.key2redis(ts, keys[i])] = value + } + +GetTableExit: + + if glog.V(3) { + glog.Info("GetTable: End: table: ", table) + } + return table, e +} + +// DeleteTable deletes the entire table. +func (d *DB) DeleteTable(ts *TableSpec) error { + if glog.V(3) { + glog.Info("DeleteTable: Begin: ts: ", ts) + } + + // This can be done via a LUA script as well. For now do this. TBD + // Read Keys + keys, e := d.GetKeys(ts) + if e != nil { + glog.Error("DeleteTable: GetKeys: " + e.Error()) + goto DeleteTableExit + } + + // For each key in Keys + // Delete the entry + for i := 0; i < len(keys); i++ { + e := d.DeleteEntry(ts, keys[i]) + if e != nil { + glog.Warning("DeleteTable: DeleteEntry: " + e.Error()) + continue + } + } +DeleteTableExit: + if glog.V(3) { + glog.Info("DeleteTable: End: ") + } + return e +} + +// GetKeys method retrieves all entry/row keys from a previously read table. +func (t *Table) GetKeys() ([]Key, error) { + if glog.V(3) { + glog.Info("Table.GetKeys: Begin: t: ", t) + } + keys := make([]Key, 0, len(t.entry)) + for k, _ := range t.entry { + keys = append(keys, t.db.redis2key(t.ts, k)) + } + + if glog.V(3) { + glog.Info("Table.GetKeys: End: keys: ", keys) + } + return keys, nil +} + +// GetEntry method retrieves an entry/row from a previously read table. +func (t *Table) GetEntry(key Key) (Value, error) { + /* + return Value{map[string]string{ + "f0.0": "v0.0", + "f0.1": "v0.1", + "f0.2": "v0.2", + }, + }, nil + */ + if glog.V(3) { + glog.Info("Table.GetEntry: Begin: t: ", t, " key: ", key) + } + v := t.entry[t.db.key2redis(t.ts, key)] + if glog.V(3) { + glog.Info("Table.GetEntry: End: entry: ", v) + } + return v, nil +} + +//===== Functions for db.Key ===== + +// Len returns number of components in the Key +func (k *Key) Len() int { + return len(k.Comp) +} + +// Get returns the key component at given index +func (k *Key) Get(index int) string { + return k.Comp[index] +} + +//===== Functions for db.Value ===== + +func (v *Value) IsPopulated() bool { + return len(v.Field) > 0 +} + +// Has function checks if a field exists. +func (v *Value) Has(name string) bool { + _, flag := v.Field[name] + return flag +} + +// Get returns the value of a field. Returns empty string if the field +// does not exists. Use Has() function to check existance of field. +func (v *Value) Get(name string) string { + return v.Field[name] +} + +// Set function sets a string value for a field. +func (v *Value) Set(name, value string) { + v.Field[name] = value +} + +// GetInt returns value of a field as int. Returns 0 if the field does +// not exists. Returns an error if the field value is not a number. +func (v *Value) GetInt(name string) (int, error) { + data, ok := v.Field[name] + if ok { + return strconv.Atoi(data) + } + return 0, nil +} + +// SetInt sets an integer value for a field. +func (v *Value) SetInt(name string, value int) { + v.Set(name, strconv.Itoa(value)) +} + +// GetList returns the value of a an array field. A "@" suffix is +// automatically appended to the field name if not present (as per +// swsssdk convention). Field value is split by comma and resulting +// slice is returned. Empty slice is returned if field not exists. +func (v *Value) GetList(name string) []string { + var data string + if strings.HasSuffix(name, "@") { + data = v.Get(name) + } else { + data = v.Get(name + "@") + } + + if len(data) == 0 { + return []string{} + } + + return strings.Split(data, ",") +} + +// SetList function sets an list value to a field. Field name and +// value are formatted as per swsssdk conventions: +// - A "@" suffix is appended to key name +// - Field value is the comma separated string of list items +func (v *Value) SetList(name string, items []string) { + if !strings.HasSuffix(name, "@") { + name += "@" + } + + if len(items) != 0 { + data := strings.Join(items, ",") + v.Set(name, data) + } else { + v.Remove(name) + } +} + +// Remove function removes a field from this Value. +func (v *Value) Remove(name string) { + delete(v.Field, name) +} + +////////////////////////////////////////////////////////////////////////// +// The Transaction API for translib infra +////////////////////////////////////////////////////////////////////////// + +// WatchKeys is array of (TableSpec, Key) tuples to be watched in a Transaction. +type WatchKeys struct { + Ts *TableSpec + Key *Key +} + +func (w WatchKeys) String() string { + return fmt.Sprintf("{ Ts: %v, Key: %v }", w.Ts, w.Key) +} + +// Convenience function to make TableSpecs from strings. +// This only works on Tables having key components without TableSeparator +// as part of the key. +func Tables2TableSpecs(tables []string) []* TableSpec { + var tss []*TableSpec + + tss = make([]*TableSpec, 0, len(tables)) + + for i := 0; i < len(tables); i++ { + tss = append(tss, &(TableSpec{ Name: tables[i]})) + } + + return tss +} + +// StartTx method is used by infra to start a check-and-set Transaction. +func (d *DB) StartTx(w []WatchKeys, tss []*TableSpec) error { + + if glog.V(3) { + glog.Info("StartTx: Begin: w: ", w, " tss: ", tss) + } + + var e error = nil + var args []interface{} + var ret cvl.CVLRetCode + + //Start CVL session + if d.cv, ret = cvl.ValidationSessOpen(); ret != cvl.CVL_SUCCESS { + e = errors.New("StartTx: Unable to create CVL session") + goto StartTxExit + } + + // Validate State + if d.txState != txStateNone { + glog.Error("StartTx: Incorrect State, txState: ", d.txState) + e = errors.New("Transaction already in progress") + goto StartTxExit + } + + // For each watchkey + // If a pattern, Get the keys, appending results to Cmd args. + // Else append keys to the Cmd args + // Note: (LUA scripts do not support WATCH) + + args = make([]interface{}, 0, len(w) + len(tss) + 1) + args = append(args, "WATCH") + for i := 0; i < len(w); i++ { + + redisKey := d.key2redis(w[i].Ts, *(w[i].Key)) + + if !strings.Contains(redisKey, "*") { + args = append(args, redisKey) + continue + } + + redisKeys, e := d.client.Keys(redisKey).Result() + if e != nil { + glog.Warning("StartTx: Keys: " + e.Error()) + continue + } + for j := 0; j < len(redisKeys); j++ { + args = append(args, d.redis2key(w[i].Ts, redisKeys[j])) + } + } + + // for each TS, append to args the CONFIG_DB_UPDATED_ key + + for i := 0; i < len(tss); i++ { + args = append( args, d.ts2redisUpdated(tss[i])) + } + + if len(args) == 1 { + glog.Warning("StartTx: Empty WatchKeys. Skipping WATCH") + goto StartTxSkipWatch + } + + // Issue the WATCH + _, e = d.client.Do(args...).Result() + + if e != nil { + glog.Warning("StartTx: Do: WATCH ", args, " e: ", e.Error()) + } + +StartTxSkipWatch: + + // Switch State + d.txState = txStateWatch + +StartTxExit: + + if glog.V(3) { + glog.Info("StartTx: End: e: ", e) + } + return e +} + +// CommitTx method is used by infra to commit a check-and-set Transaction. +func (d *DB) CommitTx() error { + if glog.V(3) { + glog.Info("CommitTx: Begin:") + } + + var e error = nil + var tsmap map[TableSpec]bool = + make(map[TableSpec]bool, len(d.txCmds)) // UpperBound + + // Validate State + switch d.txState { + case txStateNone: + glog.Error("CommitTx: No WATCH done, txState: ", d.txState) + e = errors.New("StartTx() not done. No Transaction active.") + case txStateWatch: + if glog.V(1) { + glog.Info("CommitTx: No SET|DEL done, txState: ", d.txState) + } + case txStateSet: + break + case txStateMultiExec: + glog.Error("CommitTx: Incorrect State, txState: ", d.txState) + e = errors.New("Cannot issue MULTI in txStateMultiExec") + default: + glog.Error("CommitTx: Unknown, txState: ", d.txState) + e = errors.New("Unknown State: " + string(d.txState)) + } + + if e != nil { + goto CommitTxExit + } + + // Issue MULTI + _, e = d.client.Do("MULTI").Result() + + if e != nil { + glog.Warning("CommitTx: Do: MULTI e: ", e.Error()) + } + + // For each cmd in txCmds + // Invoke it + for i := 0; i < len(d.txCmds); i++ { + + var args []interface{} + + redisKey := d.key2redis(d.txCmds[i].ts, *(d.txCmds[i].key)) + + // Add TS to the map of watchTables + tsmap[*(d.txCmds[i].ts)] = true; + + switch d.txCmds[i].op { + + case txOpHMSet: + + args = make([]interface{}, 0, len(d.txCmds[i].value.Field)*2+2) + args = append(args, "HMSET", redisKey) + + for k, v := range d.txCmds[i].value.Field { + args = append(args, k, v) + } + + if glog.V(4) { + glog.Info("CommitTx: Do: ", args) + } + + _, e = d.client.Do(args...).Result() + + case txOpHDel: + + args = make([]interface{}, 0, len(d.txCmds[i].value.Field)+2) + args = append(args, "HDEL", redisKey) + + for k, _ := range d.txCmds[i].value.Field { + args = append(args, k) + } + + if glog.V(4) { + glog.Info("CommitTx: Do: ", args) + } + + _, e = d.client.Do(args...).Result() + + case txOpDel: + + args = make([]interface{}, 0, 2) + args = append(args, "DEL", redisKey) + + if glog.V(4) { + glog.Info("CommitTx: Do: ", args) + } + + _, e = d.client.Do(args...).Result() + + default: + glog.Error("CommitTx: Unknown, op: ", d.txCmds[i].op) + e = errors.New("Unknown Op: " + string(d.txCmds[i].op)) + } + + if e != nil { + glog.Warning("CommitTx: Do: ", args, " e: ", e.Error()) + } + } + + // Flag the Tables as updated. + for ts, _ := range tsmap { + _, e = d.client.Do("SET", d.ts2redisUpdated(&ts), "1").Result() + if e != nil { + glog.Warning("CommitTx: Do: SET ", + d.ts2redisUpdated(&ts), " 1: e: ", + e.Error()) + } + } + _, e = d.client.Do("SET", d.ts2redisUpdated(& TableSpec{Name: "*"}), + "1").Result() + if e != nil { + glog.Warning("CommitTx: Do: SET ", + "CONFIG_DB_UPDATED", " 1: e: ", e.Error()) + } + + // Issue EXEC + _, e = d.client.Do("EXEC").Result() + + if e != nil { + glog.Warning("CommitTx: Do: EXEC e: ", e.Error()) + e = tlerr.TranslibTransactionFail { } + } + + // Switch State, Clear Command list + d.txState = txStateNone + d.txCmds = d.txCmds[:0] + d.cvlEditConfigData = d.cvlEditConfigData[:0] + + //Close CVL session + if ret := cvl.ValidationSessClose(d.cv); ret != cvl.CVL_SUCCESS { + glog.Error("CommitTx: End: Error in closing CVL session") + } + d.cv = nil + +CommitTxExit: + if glog.V(3) { + glog.Info("CommitTx: End: e: ", e) + } + return e +} + +// AbortTx method is used by infra to abort a check-and-set Transaction. +func (d *DB) AbortTx() error { + if glog.V(3) { + glog.Info("AbortTx: Begin:") + } + + var e error = nil + + // Validate State + switch d.txState { + case txStateNone: + glog.Error("AbortTx: No WATCH done, txState: ", d.txState) + e = errors.New("StartTx() not done. No Transaction active.") + case txStateWatch: + if glog.V(1) { + glog.Info("AbortTx: No SET|DEL done, txState: ", d.txState) + } + case txStateSet: + break + case txStateMultiExec: + glog.Error("AbortTx: Incorrect State, txState: ", d.txState) + e = errors.New("Cannot issue UNWATCH in txStateMultiExec") + default: + glog.Error("AbortTx: Unknown, txState: ", d.txState) + e = errors.New("Unknown State: " + string(d.txState)) + } + + if e != nil { + goto AbortTxExit + } + + // Issue UNWATCH + _, e = d.client.Do("UNWATCH").Result() + + if e != nil { + glog.Warning("AbortTx: Do: UNWATCH e: ", e.Error()) + } + + // Switch State, Clear Command list + d.txState = txStateNone + d.txCmds = d.txCmds[:0] + d.cvlEditConfigData = d.cvlEditConfigData[:0] + + //Close CVL session + if ret := cvl.ValidationSessClose(d.cv); ret != cvl.CVL_SUCCESS { + glog.Error("AbortTx: End: Error in closing CVL session") + } + d.cv = nil + +AbortTxExit: + if glog.V(3) { + glog.Info("AbortTx: End: e: ", e) + } + return e +} diff --git a/src/translib/db/db_test.go b/src/translib/db/db_test.go new file mode 100644 index 0000000000..edf05b281c --- /dev/null +++ b/src/translib/db/db_test.go @@ -0,0 +1,610 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package db + + +import ( + // "fmt" + // "errors" + // "flag" + // "github.com/golang/glog" + "time" + // "translib/tlerr" + // "os/exec" + "os" + "testing" + "strconv" + "reflect" +) + +func TestMain(m * testing.M) { + + exitCode := 0 + +/* Apparently, on an actual switch the swss container will have + * a redis-server running, which will be in a different container than + * mgmt, thus this pkill stuff to find out it is running will not work. + * + + redisServerAttemptedStart := false + +TestMainRedo: + o, e := exec.Command("/usr/bin/pkill", "-HUP", "redis-server").Output() + + if e == nil { + + } else if redisServerAttemptedStart { + + exitCode = 1 + + } else { + + fmt.Printf("TestMain: No redis server: pkill: %v\n", o) + fmt.Println("TestMain: Starting redis-server") + e = exec.Command("/tools/bin/redis-server").Start() + time.Sleep(3 * time.Second) + redisServerAttemptedStart = true + goto TestMainRedo + } +*/ + + if exitCode == 0 { + exitCode = m.Run() + } + + + os.Exit(exitCode) + +} + +/* + +1. Create, and close a DB connection. (NewDB(), DeleteDB()) + +*/ + +func TestNewDB(t * testing.T) { + + d,e := NewDB(Options { + DBNo : ConfigDB, + InitIndicator : "", + TableNameSeparator: "|", + KeySeparator : "|", + DisableCVLCheck : true, + }) + + if d == nil { + t.Errorf("NewDB() fails e = %v", e) + } else if e = d.DeleteDB() ; e != nil { + t.Errorf("DeleteDB() fails e = %v", e) + } +} + + +/* + +2. Get an entry (GetEntry()) +3. Set an entry without Transaction (SetEntry()) +4. Delete an entry without Transaction (DeleteEntry()) + +20. NT: GetEntry() EntryNotExist. + +*/ + +func TestNoTransaction(t * testing.T) { + + var pid int = os.Getpid() + + d,e := NewDB(Options { + DBNo : ConfigDB, + InitIndicator : "", + TableNameSeparator: "|", + KeySeparator : "|", + DisableCVLCheck : true, + }) + + if d == nil { + t.Errorf("NewDB() fails e = %v", e) + return + } + + ts := TableSpec { Name: "TEST_" + strconv.FormatInt(int64(pid), 10) } + + ca := make([]string, 1, 1) + ca[0] = "MyACL1_ACL_IPVNOTEXIST" + akey := Key { Comp: ca} + avalue := Value { map[string]string {"ports@":"Ethernet0","type":"MIRROR" }} + e = d.SetEntry(&ts, akey, avalue) + + if e != nil { + t.Errorf("SetEntry() fails e = %v", e) + return + } + + v, e := d.GetEntry(&ts, akey) + + if (e != nil) || (!reflect.DeepEqual(v,avalue)) { + t.Errorf("GetEntry() fails e = %v", e) + return + } + + e = d.DeleteEntry(&ts, akey) + + if e != nil { + t.Errorf("DeleteEntry() fails e = %v", e) + return + } + + v, e = d.GetEntry(&ts, akey) + + if e == nil { + t.Errorf("GetEntry() after DeleteEntry() fails e = %v", e) + return + } + + if e = d.DeleteDB() ; e != nil { + t.Errorf("DeleteDB() fails e = %v", e) + } +} + + +/* + +5. Get a Table (GetTable()) + +9. Get multiple keys (GetKeys()) +10. Delete multiple keys (DeleteKeys()) +11. Delete Table (DeleteTable()) + +*/ + +func TestTable(t * testing.T) { + + var pid int = os.Getpid() + + d,e := NewDB(Options { + DBNo : ConfigDB, + InitIndicator : "", + TableNameSeparator: "|", + KeySeparator : "|", + DisableCVLCheck : true, + }) + + if d == nil { + t.Errorf("NewDB() fails e = %v", e) + return + } + + ts := TableSpec { Name: "TEST_" + strconv.FormatInt(int64(pid), 10) } + + ca := make([]string, 1, 1) + ca[0] = "MyACL1_ACL_IPVNOTEXIST" + akey := Key { Comp: ca} + avalue := Value { map[string]string {"ports@":"Ethernet0","type":"MIRROR" }} + ca2 := make([]string, 1, 1) + ca2[0] = "MyACL2_ACL_IPVNOTEXIST" + akey2 := Key { Comp: ca2} + + // Add the Entries for Get|DeleteKeys + + e = d.SetEntry(&ts, akey, avalue) + + if e != nil { + t.Errorf("SetEntry() fails e = %v", e) + return + } + + e = d.SetEntry(&ts, akey2, avalue) + + if e != nil { + t.Errorf("SetEntry() fails e = %v", e) + return + } + + keys, e := d.GetKeys(&ts) + + if (e != nil) || (len(keys) != 2) { + t.Errorf("GetKeys() fails e = %v", e) + return + } + + e = d.DeleteKeys(&ts, Key {Comp: []string {"MyACL*_ACL_IPVNOTEXIST"}}) + + if e != nil { + t.Errorf("DeleteKeys() fails e = %v", e) + return + } + + v, e := d.GetEntry(&ts, akey) + + if e == nil { + t.Errorf("GetEntry() after DeleteKeys() fails e = %v", e) + return + } + + + + // Add the Entries again for Table + + e = d.SetEntry(&ts, akey, avalue) + + if e != nil { + t.Errorf("SetEntry() fails e = %v", e) + return + } + + e = d.SetEntry(&ts, akey2, avalue) + + if e != nil { + t.Errorf("SetEntry() fails e = %v", e) + return + } + + tab, e := d.GetTable(&ts) + + if e != nil { + t.Errorf("GetTable() fails e = %v", e) + return + } + + v, e = tab.GetEntry(akey) + + if (e != nil) || (!reflect.DeepEqual(v,avalue)) { + t.Errorf("Table.GetEntry() fails e = %v", e) + return + } + + e = d.DeleteTable(&ts) + + if e != nil { + t.Errorf("DeleteTable() fails e = %v", e) + return + } + + v, e = d.GetEntry(&ts, akey) + + if e == nil { + t.Errorf("GetEntry() after DeleteTable() fails e = %v", e) + return + } + + if e = d.DeleteDB() ; e != nil { + t.Errorf("DeleteDB() fails e = %v", e) + } +} + + +/* Tests for + +6. Set an entry with Transaction (StartTx(), SetEntry(), CommitTx()) +7. Delete an entry with Transaction (StartTx(), DeleteEntry(), CommitTx()) +8. Abort Transaction. (StartTx(), DeleteEntry(), AbortTx()) + +12. Set an entry with Transaction using WatchKeys Check-And-Set(CAS) +13. Set an entry with Transaction using Table CAS +14. Set an entry with Transaction using WatchKeys, and Table CAS + +15. Set an entry with Transaction with empty WatchKeys, and Table CAS +16. Negative Test(NT): Fail a Transaction using WatchKeys CAS +17. NT: Fail a Transaction using Table CAS +18. NT: Abort an Transaction with empty WatchKeys/Table CAS + +Cannot Automate 19 for now +19. NT: Check V logs, Error logs + + */ + +func TestTransaction(t * testing.T) { + for transRun := TransRunBasic ; transRun < TransRunEnd ; transRun++ { + testTransaction(t, transRun) + } +} + +type TransRun int + +const ( + TransRunBasic TransRun = iota // 0 + TransRunWatchKeys // 1 + TransRunTable // 2 + TransRunWatchKeysAndTable // 3 + TransRunEmptyWatchKeysAndTable // 4 + TransRunFailWatchKeys // 5 + TransRunFailTable // 6 + + // Nothing after this. + TransRunEnd +) + +func testTransaction(t * testing.T, transRun TransRun) { + + var pid int = os.Getpid() + + d,e := NewDB(Options { + DBNo : ConfigDB, + InitIndicator : "", + TableNameSeparator: "|", + KeySeparator : "|", + DisableCVLCheck : true, + }) + + if d == nil { + t.Errorf("NewDB() fails e = %v, transRun = %v", e, transRun) + return + } + + ts := TableSpec { Name: "TEST_" + strconv.FormatInt(int64(pid), 10) } + + ca := make([]string, 1, 1) + ca[0] = "MyACL1_ACL_IPVNOTEXIST" + akey := Key { Comp: ca} + avalue := Value { map[string]string {"ports@":"Ethernet0","type":"MIRROR" }} + + var watchKeys []WatchKeys + var table []*TableSpec + + switch transRun { + case TransRunBasic, TransRunWatchKeysAndTable: + watchKeys = []WatchKeys{{Ts: &ts, Key: &akey}} + table = []*TableSpec { &ts } + case TransRunWatchKeys, TransRunFailWatchKeys: + watchKeys = []WatchKeys{{Ts: &ts, Key: &akey}} + table = []*TableSpec { } + case TransRunTable, TransRunFailTable: + watchKeys = []WatchKeys{} + table = []*TableSpec { &ts } + } + + e = d.StartTx(watchKeys, table) + + if e != nil { + t.Errorf("StartTx() fails e = %v", e) + return + } + + e = d.SetEntry(&ts, akey, avalue) + + if e != nil { + t.Errorf("SetEntry() fails e = %v", e) + return + } + + e = d.CommitTx() + + if e != nil { + t.Errorf("CommitTx() fails e = %v", e) + return + } + + v, e := d.GetEntry(&ts, akey) + + if (e != nil) || (!reflect.DeepEqual(v,avalue)) { + t.Errorf("GetEntry() after Tx fails e = %v", e) + return + } + + e = d.StartTx(watchKeys, table) + + if e != nil { + t.Errorf("StartTx() fails e = %v", e) + return + } + + e = d.DeleteEntry(&ts, akey) + + if e != nil { + t.Errorf("DeleteEntry() fails e = %v", e) + return + } + + e = d.AbortTx() + + if e != nil { + t.Errorf("AbortTx() fails e = %v", e) + return + } + + v, e = d.GetEntry(&ts, akey) + + if (e != nil) || (!reflect.DeepEqual(v,avalue)) { + t.Errorf("GetEntry() after Abort Tx fails e = %v", e) + return + } + + e = d.StartTx(watchKeys, table) + + if e != nil { + t.Errorf("StartTx() fails e = %v", e) + return + } + + e = d.DeleteEntry(&ts, akey) + + if e != nil { + t.Errorf("DeleteEntry() fails e = %v", e) + return + } + + switch transRun { + case TransRunFailWatchKeys, TransRunFailTable: + d2,_ := NewDB(Options { + DBNo : ConfigDB, + InitIndicator : "", + TableNameSeparator: "|", + KeySeparator : "|", + DisableCVLCheck : true, + }) + + d2.StartTx(watchKeys, table); + d2.DeleteEntry(&ts, akey) + d2.CommitTx(); + d2.DeleteDB(); + default: + } + + e = d.CommitTx() + + switch transRun { + case TransRunFailWatchKeys, TransRunFailTable: + if e == nil { + t.Errorf("NT CommitTx() tr: %v fails e = %v", + transRun, e) + return + } + default: + if e != nil { + t.Errorf("CommitTx() fails e = %v", e) + return + } + } + + v, e = d.GetEntry(&ts, akey) + + if e == nil { + t.Errorf("GetEntry() after Tx DeleteEntry() fails e = %v", e) + return + } + + d.DeleteMapAll(&ts) + + if e = d.DeleteDB() ; e != nil { + t.Errorf("DeleteDB() fails e = %v", e) + } +} + + +func TestMap(t * testing.T) { + + var pid int = os.Getpid() + + d,e := NewDB(Options { + DBNo : ConfigDB, + InitIndicator : "", + TableNameSeparator: "|", + KeySeparator : "|", + DisableCVLCheck : true, + }) + + if d == nil { + t.Errorf("NewDB() fails e = %v", e) + return + } + + ts := TableSpec { Name: "TESTMAP_" + strconv.FormatInt(int64(pid), 10) } + + d.SetMap(&ts, "k1", "v1"); + d.SetMap(&ts, "k2", "v2"); + + if v, e := d.GetMap(&ts, "k1"); v != "v1" { + t.Errorf("GetMap() fails e = %v", e) + return + } + + if v, e := d.GetMapAll(&ts) ; + (e != nil) || + (!reflect.DeepEqual(v, + Value{ Field: map[string]string { + "k1" : "v1", "k2" : "v2" }})) { + t.Errorf("GetMapAll() fails e = %v", e) + return + } + + d.DeleteMapAll(&ts) + + if e = d.DeleteDB() ; e != nil { + t.Errorf("DeleteDB() fails e = %v", e) + } +} + +func TestSubscribe(t * testing.T) { + + var pid int = os.Getpid() + + var hSetCalled, hDelCalled, delCalled bool + + d,e := NewDB(Options { + DBNo : ConfigDB, + InitIndicator : "", + TableNameSeparator: "|", + KeySeparator : "|", + DisableCVLCheck : true, + }) + + if (d == nil) || (e != nil) { + t.Errorf("NewDB() fails e = %v", e) + return + } + + ts := TableSpec { Name: "TEST_" + strconv.FormatInt(int64(pid), 10) } + + ca := make([]string, 1, 1) + ca[0] = "MyACL1_ACL_IPVNOTEXIST" + akey := Key { Comp: ca} + avalue := Value { map[string]string {"ports@":"Ethernet0","type":"MIRROR" }} + + var skeys [] *SKey = make([]*SKey, 1) + skeys[0] = & (SKey { Ts: &ts, Key: &akey, + SEMap: map[SEvent]bool { + SEventHSet: true, + SEventHDel: true, + SEventDel: true, + }}) + + s,e := SubscribeDB(Options { + DBNo : ConfigDB, + InitIndicator : "CONFIG_DB_INITIALIZED", + TableNameSeparator: "|", + KeySeparator : "|", + DisableCVLCheck : true, + }, skeys, func (s *DB, + skey *SKey, key *Key, + event SEvent) error { + switch event { + case SEventHSet: hSetCalled = true + case SEventHDel: hDelCalled = true + case SEventDel: delCalled = true + default: + } + return nil }) + + if (s == nil) || (e != nil) { + t.Errorf("Subscribe() returns error e: %v", e) + return + } + + d.SetEntry(&ts, akey, avalue) + d.DeleteEntryFields(&ts, akey, avalue) + + time.Sleep(5 * time.Second) + + if !hSetCalled || !hDelCalled || !delCalled { + t.Errorf("Subscribe() callbacks missed: %v %v %v", hSetCalled, + hDelCalled, delCalled) + return + } + + s.UnsubscribeDB() + + time.Sleep(2 * time.Second) + + if e = d.DeleteDB() ; e != nil { + t.Errorf("DeleteDB() fails e = %v", e) + } +} + diff --git a/src/translib/db/map.go b/src/translib/db/map.go new file mode 100644 index 0000000000..9010cfb15f --- /dev/null +++ b/src/translib/db/map.go @@ -0,0 +1,123 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +/* +Package db implements a wrapper over the go-redis/redis. +*/ +package db + +import ( + // "fmt" + // "strconv" + + // "reflect" + // "errors" + // "strings" + + // "github.com/go-redis/redis" + "github.com/golang/glog" + // "cvl" + "translib/tlerr" +) + +func init() { +} + + + + +func (d *DB) GetMap(ts *TableSpec, mapKey string) (string, error) { + + if glog.V(3) { + glog.Info("GetMap: Begin: ", "ts: ", ts, " mapKey: ", mapKey) + } + + v, e := d.client.HGet(ts.Name, mapKey).Result() + + if glog.V(3) { + glog.Info("GetMap: End: ", "v: ", v, " e: ", e) + } + + return v, e +} + +func (d *DB) GetMapAll(ts *TableSpec) (Value, error) { + + if glog.V(3) { + glog.Info("GetMapAll: Begin: ", "ts: ", ts) + } + + var value Value + + v, e := d.client.HGetAll(ts.Name).Result() + + if len(v) != 0 { + value = Value{Field: v} + } else { + if glog.V(1) { + glog.Info("GetMapAll: HGetAll(): empty map") + } + e = tlerr.TranslibRedisClientEntryNotExist { Entry: ts.Name } + } + + if glog.V(3) { + glog.Info("GetMapAll: End: ", "value: ", value, " e: ", e) + } + + return value, e +} + +// For Testing only. Do Not Use!!! ============================== +// There is no transaction support on these. +func (d *DB) SetMap(ts *TableSpec, mapKey string, mapValue string) error { + + if glog.V(3) { + glog.Info("SetMap: Begin: ", "ts: ", ts, " ", mapKey, + ":", mapValue) + } + + b, e := d.client.HSet(ts.Name, mapKey, mapValue).Result() + + if glog.V(3) { + glog.Info("GetMap: End: ", "b: ", b, " e: ", e) + } + + return e +} +// For Testing only. Do Not Use!!! ============================== + +// For Testing only. Do Not Use!!! +// There is no transaction support on these. +func (d *DB) DeleteMapAll(ts *TableSpec) error { + + if glog.V(3) { + glog.Info("DeleteMapAll: Begin: ", "ts: ", ts) + } + + e := d.client.Del(ts.Name).Err() + + if glog.V(3) { + glog.Info("DeleteMapAll: End: ", " e: ", e) + } + + return e +} +// For Testing only. Do Not Use!!! ============================== + + diff --git a/src/translib/db/subscribe.go b/src/translib/db/subscribe.go new file mode 100644 index 0000000000..65ea09811e --- /dev/null +++ b/src/translib/db/subscribe.go @@ -0,0 +1,275 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +/* +Package db implements a wrapper over the go-redis/redis. +*/ +package db + +import ( + // "fmt" + // "strconv" + + // "reflect" + "errors" + "strings" + + // "github.com/go-redis/redis" + "github.com/golang/glog" + // "cvl" + "translib/tlerr" +) + +// SKey is (TableSpec, Key, []SEvent) 3-tuples to be watched in a Transaction. +type SKey struct { + Ts *TableSpec + Key *Key + SEMap map[SEvent]bool // nil map indicates subscribe to all +} + +type SEvent int + +const ( + SEventNone SEvent = iota // No Op + SEventHSet // HSET, HMSET, and its variants + SEventHDel // HDEL, also SEventDel generated, if HASH is becomes empty + SEventDel // DEL, & also if key gets deleted (empty HASH, expire,..) + SEventOther // Some other command not covered above. + + // The below two are always sent regardless of SEMap. + SEventClose // Close requested due to Unsubscribe() called. + SEventErr // Error condition. Call Unsubscribe, after return. +) + +var redisPayload2sEventMap map[string]SEvent = map[string]SEvent { + "" : SEventNone, + "hset" : SEventHSet, + "hdel" : SEventHDel, + "del" : SEventDel, +} + + +func init() { + // Optimization: Start the goroutine that is scanning the SubscribeDB + // channels. Instead of one goroutine per Subscribe. +} + + +// HFunc gives the name of the table, and other per-table customizations. +type HFunc func( *DB, *SKey, *Key, SEvent) (error) + + +// SubscribeDB is the factory method to create a subscription to the DB. +// The returned instance can only be used for Subscription. +func SubscribeDB(opt Options, skeys []*SKey, handler HFunc) (*DB, error) { + + if glog.V(3) { + glog.Info("SubscribeDB: Begin: opt: ", opt, + " skeys: ", skeys, " handler: ", handler) + } + + patterns := make([]string, 0, len(skeys)) + patMap := make(map[string]([]int), len(skeys)) + var s string + + // NewDB + d , e := NewDB(opt) + + if d.client == nil { + goto SubscribeDBExit + } + + // Make sure that the DB is configured for key space notifications + // Optimize with LUA scripts to atomically add "Kgshxe". + s, e = d.client.ConfigSet("notify-keyspace-events", "AKE").Result() + + if e != nil { + glog.Error("SubscribeDB: ConfigSet(): e: ", e, " s: ", s) + goto SubscribeDBExit + } + + for i := 0 ; i < len(skeys); i++ { + pattern := d.key2redisChannel(skeys[i].Ts, *(skeys[i].Key)) + if _,present := patMap[pattern] ; ! present { + patMap[pattern] = make([]int, 0, 5) + patterns = append(patterns, pattern) + } + patMap[pattern] = append(patMap[pattern], i) + + } + + glog.Info("SubscribeDB: patterns: ", patterns) + + d.sPubSub = d.client.PSubscribe(patterns[:]...) + + if d.sPubSub == nil { + glog.Error("SubscribeDB: PSubscribe() nil: pats: ", patterns) + e = tlerr.TranslibDBSubscribeFail { } + goto SubscribeDBExit + } + + // Wait for confirmation, of channel creation + _, e = d.sPubSub.Receive() + + if e != nil { + glog.Error("SubscribeDB: Receive() fails: e: ", e) + e = tlerr.TranslibDBSubscribeFail { } + goto SubscribeDBExit + } + + + // Start a goroutine to read messages and call handler. + go func() { + for msg := range d.sPubSub.Channel() { + if glog.V(4) { + glog.Info("SubscribeDB: msg: ", msg) + } + + // Should this be a goroutine, in case each notification CB + // takes a long time to run ? + for _, skeyIndex := range patMap[msg.Pattern] { + skey := skeys[skeyIndex] + key := d.redisChannel2key(skey.Ts, msg.Channel) + sevent := d.redisPayload2sEvent(msg.Payload) + + if len(skey.SEMap) == 0 || skey.SEMap[sevent] { + + if glog.V(2) { + glog.Info("SubscribeDB: handler( ", + &d, ", ", skey, ", ", key, ", ", sevent, " )") + } + + handler(d, skey, &key, sevent) + } + } + } + + // Send the Close|Err notification. + var sEvent = SEventClose + if d.sCIP == false { + sEvent = SEventErr + } + glog.Info("SubscribeDB: SEventClose|Err: ", sEvent) + handler(d, & SKey{}, & Key {}, sEvent) + } () + + +SubscribeDBExit: + + if e != nil { + if d.sPubSub != nil { + d.sPubSub.Close() + } + + if d.client != nil { + d.DeleteDB() + d.client = nil + } + d = nil + } + + if glog.V(3) { + glog.Info("SubscribeDB: End: d: ", d, " e: ", e) + } + + return d, e +} + +// UnsubscribeDB is used to close a DB subscription +func (d * DB) UnsubscribeDB() error { + + var e error = nil + + if glog.V(3) { + glog.Info("UnsubscribeDB: d:", d) + } + + if d.sCIP { + glog.Error("UnsubscribeDB: Close in Progress") + e = errors.New("UnsubscribeDB: Close in Progress") + goto UnsubscribeDBExit + } + + // Mark close in progress. + d.sCIP = true; + + // Do the close, ch gets closed too. + d.sPubSub.Close() + + // Wait for the goroutine to complete ? TBD + // Should not this happen because of the range statement on ch? + + // Close the DB + d.DeleteDB() + +UnsubscribeDBExit: + + if glog.V(3) { + glog.Info("UnsubscribeDB: End: d: ", d, " e: ", e) + } + + return e +} + + +func (d *DB) key2redisChannel(ts *TableSpec, key Key) string { + + if glog.V(5) { + glog.Info("key2redisChannel: ", *ts, " key: " + key.String()) + } + + return "__keyspace@" + (d.Opts.DBNo).String() + "__:" + d.key2redis(ts, key) +} + +func (d *DB) redisChannel2key(ts *TableSpec, redisChannel string) Key { + + if glog.V(5) { + glog.Info("redisChannel2key: ", *ts, " redisChannel: " + redisChannel) + } + + splitRedisKey := strings.SplitN(redisChannel, ":", 2) + + if len(splitRedisKey) > 1 { + return d.redis2key(ts, splitRedisKey[1]) + } + + glog.Warning("redisChannel2key: Missing key: redisChannel: ", redisChannel) + + return Key{} +} + +func (d *DB) redisPayload2sEvent(redisPayload string) SEvent { + + if glog.V(5) { + glog.Info("redisPayload2sEvent: ", redisPayload) + } + + sEvent := redisPayload2sEventMap[redisPayload] + + if sEvent == 0 { + sEvent = SEventOther + } + + if glog.V(3) { + glog.Info("redisPayload2sEvent: ", sEvent) + } + + return sEvent +} + diff --git a/src/translib/db/test/arloIssue29.go b/src/translib/db/test/arloIssue29.go new file mode 100644 index 0000000000..d42613d664 --- /dev/null +++ b/src/translib/db/test/arloIssue29.go @@ -0,0 +1,85 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +/* +UT for +https://github.com/project-arlo/sonic-mgmt-framework/issues/29 +*/ + +package main + +import ( + "fmt" + // "errors" + "flag" + "github.com/golang/glog" + "translib/db" + // "time" + // "translib/tlerr" +) + +func main() { + var avalue db.Value + var akey db.Key + var e error + + defer glog.Flush() + + flag.Parse() + + fmt.Println("https://github.com/project-arlo/sonic-mgmt-framework/issues/29") + fmt.Println("Creating the DB ==============") + d,_ := db.NewDB(db.Options { + DBNo : db.ApplDB, + InitIndicator : "", + TableNameSeparator: ":", + KeySeparator : ":", + }) + + tsi := db.TableSpec { Name: "INTF_TABLE", CompCt: 2 } + + ca := make([]string, 2, 2) + + fmt.Println("Testing SetEntry ==============") + ca[0] = "Ethernet20" + ca[1] = "a::b/64" + akey = db.Key { Comp: ca} + avalue = db.Value { Field: map[string]string { + "scope" : "global", + "family" : "IPv4", + } } + + e = d.SetEntry(&tsi, akey, avalue) + if e != nil { + fmt.Println("SetEntry() ERROR: e: ", e) + return + } + + fmt.Println("Testing GetEntry ==============") + + avalue, e = d.GetEntry(&tsi, akey) + if e != nil { + fmt.Println("GetEntry() ERROR: e: ", e) + return + } + + fmt.Println("ts: ", tsi, " ", akey, ": ", avalue) + + d.DeleteDB() +} diff --git a/src/translib/db/test/testdb.go b/src/translib/db/test/testdb.go new file mode 100644 index 0000000000..c28b368e3a --- /dev/null +++ b/src/translib/db/test/testdb.go @@ -0,0 +1,163 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package main + +import ( + "fmt" + // "errors" + "flag" + "github.com/golang/glog" + "translib/db" + "time" + "translib/tlerr" +) + +func main() { + var avalue,rvalue db.Value + var akey,rkey db.Key + var e error + + defer glog.Flush() + + flag.Parse() + + fmt.Println("Creating the DB ==============") + d,_ := db.NewDB(db.Options { + DBNo : db.ConfigDB, + InitIndicator : "CONFIG_DB_INITIALIZED", + TableNameSeparator: "|", + KeySeparator : "|", + }) + +// fmt.Println("key: CONFIG_DB_INITIALIZED value: ", +// d.Client.Get("CONFIG_DB_INITIALIZED").String()) + + tsa := db.TableSpec { Name: "ACL_TABLE" } + tsr := db.TableSpec { Name: "ACL_RULE" } + + ca := make([]string, 1, 1) + + fmt.Println("Testing GetEntry error ==============") + ca[0] = "MyACL1_ACL_IPVNOTEXIST" + akey = db.Key { Comp: ca} + avalue, e = d.GetEntry(&tsa, akey) + fmt.Println("ts: ", tsa, " ", akey, ": ", avalue, " error: ", e) + if _, ok := e.(tlerr.TranslibRedisClientEntryNotExist) ; ok { + fmt.Println("Type is TranslibRedisClientEntryNotExist") + } + + + fmt.Println("Testing NoTransaction SetEntry ==============") + ca[0] = "MyACL1_ACL_IPV4" + akey = db.Key { Comp: ca} + avalue = db.Value { map[string]string {"ports@":"Ethernet0","type":"MIRROR" }} + + d.SetEntry(&tsa, akey, avalue) + + fmt.Println("Testing GetEntry ==============") + avalue, _ = d.GetEntry(&tsa, akey) + fmt.Println("ts: ", tsa, " ", akey, ": ", avalue) + + fmt.Println("Testing GetKeys ==============") + keys, _ := d.GetKeys(&tsa); + fmt.Println("ts: ", tsa, " keys: ", keys) + + fmt.Println("Testing NoTransaction DeleteEntry ==============") + akey = db.Key { Comp: ca} + + d.DeleteEntry(&tsa, akey) + + avalue, e = d.GetEntry(&tsa, akey) + if e == nil { + fmt.Println("!!! ts: ", tsa, " ", akey, ": ", avalue) + } + + fmt.Println("Testing 2 more ACLs ==============") + ca[0] = "MyACL2_ACL_IPV4" + avalue = db.Value { map[string]string {"ports@":"Ethernet0","type":"MIRROR" }} + d.SetEntry(&tsa, akey, avalue) + + ca[0] = "MyACL3_ACL_IPV4" + d.SetEntry(&tsa, akey, avalue) + + ta, _ := d.GetTable(&tsa) + fmt.Println("ts: ", tsa, " table: ", ta) + + tr, _ := d.GetTable(&tsr) + fmt.Println("ts: ", tsr, " table: ", tr) + + fmt.Println("Testing Transaction =================") + rkey = db.Key { Comp: []string { "MyACL2_ACL_IPV4", "RULE_1" }} + rvalue = db.Value { Field: map[string]string { + "priority" : "0", + "packet_action" : "DROP", + }, + } + +// d.StartTx([]db.WatchKeys { {Ts: &tsr, Key: &rkey} }) + d.StartTx([]db.WatchKeys {{Ts: &tsr, Key: &rkey} }, + []*db.TableSpec { &tsr, &tsa}) + + fmt.Println("Sleeping 5...") + time.Sleep(5 * time.Second) + + d.SetEntry( &tsr, rkey, rvalue) + + e = d.CommitTx() + if e != nil { + fmt.Println("Transaction Failed ======= e: ", e) + } + + + fmt.Println("Testing AbortTx =================") +// d.StartTx([]db.WatchKeys { {Ts: &tsr, Key: &rkey} }) + d.StartTx([]db.WatchKeys {}, []*db.TableSpec { &tsr, &tsa}) + d.DeleteEntry( &tsa, rkey) + d.AbortTx() + avalue, e = d.GetEntry(&tsr, rkey) + fmt.Println("ts: ", tsr, " ", akey, ": ", avalue) + + fmt.Println("Testing DeleteKeys =================") + d.DeleteKeys(&tsr, db.Key { Comp: []string {"ToBeDeletedACLs*"} }) + + fmt.Println("Testing GetTable") + tr, _ = d.GetTable(&tsr) + fmt.Println("ts: ", tsr, " table: ", tr) + + +// d.DeleteTable(&ts) + + fmt.Println("Testing Tables2TableSpecs =================") + var tables []string + tables = []string { "ACL_TABLE", "ACL_RULE" } + fmt.Println("Tables: ", tables) + fmt.Println("TableSpecs: ") + for _, tsi := range db.Tables2TableSpecs(tables) { + fmt.Println(" ", *tsi) + } + + fmt.Println("Empty TableSpecs: ") + for _, tsi := range db.Tables2TableSpecs([]string { } ) { + fmt.Println(" ", *tsi) + } + + + d.DeleteDB() +} diff --git a/src/translib/db/test/testmap.go b/src/translib/db/test/testmap.go new file mode 100644 index 0000000000..728b8842ac --- /dev/null +++ b/src/translib/db/test/testmap.go @@ -0,0 +1,102 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package main + +import ( + "fmt" + // "errors" + "flag" + "github.com/golang/glog" + "translib/db" + // "time" + // "translib/tlerr" +) + + +func handler(d *db.DB, skey *db.SKey, key *db.Key, event db.SEvent) error { + fmt.Println("***handler: d: ", d, " skey: ", *skey, " key: ", *key, + " event: ", event) + return nil +} + + +func main() { + defer glog.Flush() + + flag.Parse() + + tsc := db.TableSpec { Name: "COUNTERS_PORT_NAME_MAP" } + + fmt.Println("Creating the SubscribeDB ==============") + d,e := db.NewDB(db.Options { + DBNo : db.CountersDB, + InitIndicator : "", + TableNameSeparator: ":", + KeySeparator : ":", + }) + + if e != nil { + fmt.Println("NewDB() returns error e: ", e) + } + + fmt.Println("Setting Some Maps ==============") + d.SetMap(&tsc, "Ethernet2", "oid:0x1000000000002") + d.SetMap(&tsc, "Ethernet5", "oid:0x1000000000005") + d.SetMap(&tsc, "Ethernet3", "oid:0x1000000000003") + + fmt.Println("GetMapAll ==============") + v, e := d.GetMapAll(&tsc) + if e != nil { + fmt.Println("GetMapAll() returns error e: ", e) + } + fmt.Println("v: ", v) + + fmt.Println("GetMap ==============") + r2, e := d.GetMap(&tsc, "Ethernet2") + if e != nil { + fmt.Println("GetMap() returns error e: ", e) + } + r5, e := d.GetMap(&tsc, "Ethernet5") + if e != nil { + fmt.Println("GetMap() returns error e: ", e) + } + r3, e := d.GetMap(&tsc, "Ethernet3") + if e != nil { + fmt.Println("GetMap() returns error e: ", e) + } + + fmt.Println("r2, r5, r3", r2, r5, r3) + + + fmt.Println("GetMap NotExist mapKey ==============") + rN, e := d.GetMap(&tsc, "EthernetN") + if e == nil { + fmt.Println("GetMap() NotExist mapKey returns nil !!! ", rN) + } + + vN, e := d.GetMapAll(& db.TableSpec { Name: "NOTEXITMAP" } ) + if e == nil { + fmt.Println("GetMapAll() NotExist returns nil !!! ", vN) + } + + d.DeleteMapAll(&tsc) + + d.DeleteDB() +} diff --git a/src/translib/db/test/testsubscribe.go b/src/translib/db/test/testsubscribe.go new file mode 100644 index 0000000000..298bf3443a --- /dev/null +++ b/src/translib/db/test/testsubscribe.go @@ -0,0 +1,88 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package main + +import ( + "fmt" + // "errors" + "flag" + "github.com/golang/glog" + "translib/db" + "time" + // "translib/tlerr" +) + + +func handler(d *db.DB, skey *db.SKey, key *db.Key, event db.SEvent) error { + fmt.Println("***handler: d: ", d, " skey: ", *skey, " key: ", *key, + " event: ", event) + return nil +} + + +func main() { + // var avalue,rvalue db.Value + var akey db.Key + // var rkey db.Key + // var e error + + defer glog.Flush() + + flag.Parse() + + tsa := db.TableSpec { Name: "ACL_TABLE" } + // tsr := db.TableSpec { Name: "ACL_RULE" } + + ca := make([]string, 1, 1) + ca[0] = "MyACL1_ACL_IPVNOTEXIST*" + akey = db.Key { Comp: ca} + var skeys [] *db.SKey = make([]*db.SKey, 1) + skeys[0] = & (db.SKey { Ts: &tsa, Key: &akey, + SEMap: map[db.SEvent]bool { + db.SEventHSet: true, + db.SEventHDel: true, + db.SEventDel: true, + }}) + + fmt.Println("Creating the SubscribeDB ==============") + d,e := db.SubscribeDB(db.Options { + DBNo : db.ConfigDB, + InitIndicator : "CONFIG_DB_INITIALIZED", + TableNameSeparator: "|", + KeySeparator : "|", + }, skeys, handler) + + if e != nil { + fmt.Println("Subscribe() returns error e: ", e) + } + + fmt.Println("Sleeping 15 ==============") + time.Sleep(15 * time.Second) + + + fmt.Println("Testing UnsubscribeDB ==============") + + d.UnsubscribeDB() + + fmt.Println("Sleeping 5 ==============") + time.Sleep(5 * time.Second) + + +} diff --git a/src/translib/intf_app.go b/src/translib/intf_app.go new file mode 100644 index 0000000000..e57ab932d8 --- /dev/null +++ b/src/translib/intf_app.go @@ -0,0 +1,1291 @@ +////////////////////////////////////////////////////////////////////////// +// +// Copyright 2019 Dell, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +////////////////////////////////////////////////////////////////////////// + +package translib + +import ( + "errors" + "fmt" + log "github.com/golang/glog" + "github.com/openconfig/ygot/ygot" + "net" + "reflect" + "regexp" + "strconv" + "strings" + "translib/db" + "translib/ocbinds" + "translib/tlerr" + "unsafe" +) + +type reqType int + +const ( + opCreate reqType = iota + 1 + opDelete + opUpdate +) + +type dbEntry struct { + op reqType + entry db.Value +} + +const ( + PORT = "PORT" + PORT_INDEX = "index" + PORT_MTU = "mtu" + PORT_ADMIN_STATUS = "admin_status" + PORT_SPEED = "speed" + PORT_DESC = "description" + PORT_OPER_STATUS = "oper_status" +) + +type Table int + +const ( + IF_TABLE_MAP Table = iota + PORT_STAT_MAP +) + +type IntfApp struct { + path *PathInfo + reqData []byte + ygotRoot *ygot.GoStruct + ygotTarget *interface{} + + respJSON interface{} + allIpKeys []db.Key + + appDB *db.DB + countersDB *db.DB + + ifTableMap map[string]dbEntry + ifIPTableMap map[string]map[string]dbEntry + portOidMap dbEntry + portStatMap map[string]dbEntry + + portTs *db.TableSpec + portTblTs *db.TableSpec + intfIPTs *db.TableSpec + intfIPTblTs *db.TableSpec + intfCountrTblTs *db.TableSpec + portOidCountrTblTs *db.TableSpec +} + +func init() { + log.Info("Init called for INTF module") + err := register("/openconfig-interfaces:interfaces", + &appInfo{appType: reflect.TypeOf(IntfApp{}), + ygotRootType: reflect.TypeOf(ocbinds.OpenconfigInterfaces_Interfaces{}), + isNative: false}) + if err != nil { + log.Fatal("Register INTF app module with App Interface failed with error=", err) + } + + err = addModel(&ModelData{Name: "openconfig-interfaces", + Org: "OpenConfig working group", + Ver: "1.0.2"}) + if err != nil { + log.Fatal("Adding model data to appinterface failed with error=", err) + } +} + +func (app *IntfApp) initialize(data appData) { + log.Info("initialize:if:path =", data.path) + + app.path = NewPathInfo(data.path) + app.reqData = data.payload + app.ygotRoot = data.ygotRoot + app.ygotTarget = data.ygotTarget + + app.portTs = &db.TableSpec{Name: "PORT"} + app.portTblTs = &db.TableSpec{Name: "PORT_TABLE"} + app.intfIPTs = &db.TableSpec{Name: "INTERFACE"} + app.intfIPTblTs = &db.TableSpec{Name: "INTF_TABLE", CompCt: 2} + app.intfCountrTblTs = &db.TableSpec{Name: "COUNTERS"} + app.portOidCountrTblTs = &db.TableSpec{Name: "COUNTERS_PORT_NAME_MAP"} + + app.ifTableMap = make(map[string]dbEntry) + app.ifIPTableMap = make(map[string]map[string]dbEntry) + app.portStatMap = make(map[string]dbEntry) +} + +func (app *IntfApp) getAppRootObject() *ocbinds.OpenconfigInterfaces_Interfaces { + deviceObj := (*app.ygotRoot).(*ocbinds.Device) + return deviceObj.Interfaces +} + +func (app *IntfApp) translateCreate(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateCreate:intf:path =", app.path) + + err = errors.New("Not implemented") + return keys, err +} + +func (app *IntfApp) translateUpdate(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + + log.Info("translateUpdate:intf:path =", app.path) + + keys, err = app.translateCommon(d, opUpdate) + + if err != nil { + log.Info("Something wrong:=", err) + } + + return keys, err +} + +func (app *IntfApp) translateReplace(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateReplace:intf:path =", app.path) + err = errors.New("Not implemented") + return keys, err +} + +func (app *IntfApp) translateDelete(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + pathInfo := app.path + + log.Infof("Received Delete for path %s; vars=%v", pathInfo.Template, pathInfo.Vars) + + intfObj := app.getAppRootObject() + + targetUriPath, err := getYangPathFromUri(app.path.Path) + log.Info("uripath:=", targetUriPath) + log.Info("err:=", err) + + if intfObj.Interface != nil && len(intfObj.Interface) > 0 { + log.Info("len:=", len(intfObj.Interface)) + for ifKey, _ := range intfObj.Interface { + log.Info("Name:=", ifKey) + intf := intfObj.Interface[ifKey] + + if intf.Subinterfaces == nil { + continue + } + subIf := intf.Subinterfaces.Subinterface[0] + if subIf != nil { + if subIf.Ipv4 != nil && subIf.Ipv4.Addresses != nil { + for ip, _ := range subIf.Ipv4.Addresses.Address { + addr := subIf.Ipv4.Addresses.Address[ip] + if addr != nil { + ipAddr := addr.Ip + log.Info("IPv4 address = ", *ipAddr) + if !validIPv4(*ipAddr) { + errStr := "Invalid IPv4 address " + *ipAddr + ipValidErr := tlerr.InvalidArgsError{Format: errStr} + return keys, ipValidErr + } + err = app.validateIp(d, ifKey, *ipAddr) + if err != nil { + errStr := "Invalid IPv4 address " + *ipAddr + ipValidErr := tlerr.InvalidArgsError{Format: errStr} + return keys, ipValidErr + } + } + } + } + if subIf.Ipv6 != nil && subIf.Ipv6.Addresses != nil { + for ip, _ := range subIf.Ipv6.Addresses.Address { + addr := subIf.Ipv6.Addresses.Address[ip] + if addr != nil { + ipAddr := addr.Ip + log.Info("IPv6 address = ", *ipAddr) + if !validIPv6(*ipAddr) { + errStr := "Invalid IPv6 address " + *ipAddr + ipValidErr := tlerr.InvalidArgsError{Format: errStr} + return keys, ipValidErr + } + err = app.validateIp(d, ifKey, *ipAddr) + if err != nil { + errStr := "Invalid IPv6 address:" + *ipAddr + ipValidErr := tlerr.InvalidArgsError{Format: errStr} + return keys, ipValidErr + } + } + } + } + } else { + err = errors.New("Only subinterface index 0 is supported") + return keys, err + } + } + } else { + err = errors.New("Not implemented") + } + return keys, err +} + +func (app *IntfApp) translateGet(dbs [db.MaxDB]*db.DB) error { + var err error + log.Info("translateGet:intf:path =", app.path) + return err +} + +func (app *IntfApp) translateSubscribe(dbs [db.MaxDB]*db.DB, path string) (*notificationOpts, *notificationInfo, error) { + app.appDB = dbs[db.ApplDB] + pathInfo := NewPathInfo(path) + notifInfo := notificationInfo{dbno: db.ApplDB} + notSupported := tlerr.NotSupportedError{Format: "Subscribe not supported", Path: path} + + if isSubtreeRequest(pathInfo.Template, "/openconfig-interfaces:interfaces") { + if pathInfo.HasSuffix("/interface{}") || + pathInfo.HasSuffix("/config") || + pathInfo.HasSuffix("/state") { + log.Errorf("Subscribe not supported for %s!", pathInfo.Template) + return nil, nil, notSupported + } + ifKey := pathInfo.Var("name") + if len(ifKey) == 0 { + return nil, nil, errors.New("ifKey given is empty!") + } + log.Info("Interface name = ", ifKey) + err := app.validateInterface(app.appDB, ifKey, db.Key{Comp: []string{ifKey}}) + if err != nil { + return nil, nil, err + } + if pathInfo.HasSuffix("/state/oper-status") { + notifInfo.table = db.TableSpec{Name: "PORT_TABLE"} + notifInfo.key = asKey(ifKey) + notifInfo.needCache = true + return ¬ificationOpts{pType: OnChange}, ¬ifInfo, nil + } + } + return nil, nil, notSupported +} + +func (app *IntfApp) processCreate(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + + log.Info("processCreate:intf:path =", app.path) + log.Info("ProcessCreate: Target Type is " + reflect.TypeOf(*app.ygotTarget).Elem().Name()) + + err = errors.New("Not implemented") + return resp, err +} + +func (app *IntfApp) processUpdate(d *db.DB) (SetResponse, error) { + + log.Infof("Calling processCommon()") + + resp, err := app.processCommon(d) + return resp, err +} + +func (app *IntfApp) processReplace(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + log.Info("processReplace:intf:path =", app.path) + err = errors.New("Not implemented") + return resp, err +} + +func (app *IntfApp) processDelete(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + log.Info("processDelete:intf:path =", app.path) + + if len(app.ifIPTableMap) == 0 { + return resp, err + } + for ifKey, entrylist := range app.ifIPTableMap { + for ip, _ := range entrylist { + err = d.DeleteEntry(app.intfIPTs, db.Key{Comp: []string{ifKey, ip}}) + log.Infof("Deleted IP : %s for Interface : %s", ip, ifKey) + } + } + return resp, err +} + +/* Note : Registration already happened, followed by filling the internal DS and filling the JSON */ +func (app *IntfApp) processGet(dbs [db.MaxDB]*db.DB) (GetResponse, error) { + + var err error + var payload []byte + pathInfo := app.path + + log.Infof("Received GET for path %s; template: %s vars=%v", pathInfo.Path, pathInfo.Template, pathInfo.Vars) + app.appDB = dbs[db.ApplDB] + app.countersDB = dbs[db.CountersDB] + + intfObj := app.getAppRootObject() + + targetUriPath, err := getYangPathFromUri(app.path.Path) + log.Info("URI Path = ", targetUriPath) + + if isSubtreeRequest(targetUriPath, "/openconfig-interfaces:interfaces/interface") { + /* Request for a specific interface */ + if intfObj.Interface != nil && len(intfObj.Interface) > 0 { + /* Interface name is the key */ + for ifKey, _ := range intfObj.Interface { + log.Info("Interface Name = ", ifKey) + ifInfo := intfObj.Interface[ifKey] + /* Filling Interface Info to internal DS */ + err = app.convertDBIntfInfoToInternal(app.appDB, ifKey, db.Key{Comp: []string{ifKey}}) + if err != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + + /*Check if the request is for a specific attribute in Interfaces state container*/ + oc_val := &ocbinds.OpenconfigInterfaces_Interfaces_Interface_State{} + ok, e := app.getSpecificAttr(targetUriPath, ifKey, oc_val) + if ok { + if e != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, e + } + + payload, err = dumpIetfJson(oc_val, false) + if err == nil { + return GetResponse{Payload: payload}, err + } else { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + } + + /* Filling the counter Info to internal DS */ + err = app.getPortOidMapForCounters(app.countersDB) + if err != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + err = app.convertDBIntfCounterInfoToInternal(app.countersDB, ifKey) + if err != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + + /*Check if the request is for a specific attribute in Interfaces state COUNTERS container*/ + counter_val := &ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_Counters{} + ok, e = app.getSpecificCounterAttr(targetUriPath, ifKey, counter_val) + if ok { + if e != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, e + } + + payload, err = dumpIetfJson(counter_val, false) + if err == nil { + return GetResponse{Payload: payload}, err + } else { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + } + + /* Filling Interface IP info to internal DS */ + err = app.convertDBIntfIPInfoToInternal(app.appDB, ifKey) + if err != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + + /* Filling the tree with the info we have in Internal DS */ + ygot.BuildEmptyTree(ifInfo) + if *app.ygotTarget == ifInfo.State { + ygot.BuildEmptyTree(ifInfo.State) + } + app.convertInternalToOCIntfInfo(&ifKey, ifInfo) + if *app.ygotTarget == ifInfo { + payload, err = dumpIetfJson(intfObj, false) + } else { + dummyifInfo := &ocbinds.OpenconfigInterfaces_Interfaces_Interface{} + if *app.ygotTarget == ifInfo.Config { + dummyifInfo.Config = ifInfo.Config + payload, err = dumpIetfJson(dummyifInfo, false) + } else if *app.ygotTarget == ifInfo.State { + dummyifInfo.State = ifInfo.State + payload, err = dumpIetfJson(dummyifInfo, false) + } else { + log.Info("Not supported get type!") + err = errors.New("Requested get-type not supported!") + } + } + } + } + return GetResponse{Payload: payload}, err + } + + /* Get all Interfaces */ + if isSubtreeRequest(targetUriPath, "/openconfig-interfaces:interfaces") { + log.Info("Get all Interfaces request!") + /* Filling Interface Info to internal DS */ + err = app.convertDBIntfInfoToInternal(app.appDB, "", db.Key{}) + if err != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + /* Filling Interface IP info to internal DS */ + err = app.convertDBIntfIPInfoToInternal(app.appDB, "") + if err != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + /* Filling the counter Info to internal DS */ + err = app.getPortOidMapForCounters(app.countersDB) + if err != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + err = app.convertDBIntfCounterInfoToInternal(app.countersDB, "") + if err != nil { + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + ygot.BuildEmptyTree(intfObj) + for ifKey, _ := range app.ifTableMap { + log.Info("If Key = ", ifKey) + ifInfo, err := intfObj.NewInterface(ifKey) + if err != nil { + log.Errorf("Creation of interface subtree for %s failed!", ifKey) + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + ygot.BuildEmptyTree(ifInfo) + app.convertInternalToOCIntfInfo(&ifKey, ifInfo) + } + if *app.ygotTarget == intfObj { + payload, err = dumpIetfJson((*app.ygotRoot).(*ocbinds.Device), true) + } else { + log.Error("Wrong request!") + } + } + return GetResponse{Payload: payload}, err +} + +/* Checking IP adderss is v4 */ +func validIPv4(ipAddress string) bool { + ipAddress = strings.Trim(ipAddress, " ") + + re, _ := regexp.Compile(`^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`) + if re.MatchString(ipAddress) { + return true + } + return false +} + +/* Checking IP address is v6 */ +func validIPv6(ip6Address string) bool { + ip6Address = strings.Trim(ip6Address, " ") + re, _ := regexp.Compile(`(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))`) + if re.MatchString(ip6Address) { + return true + } + return false +} + +func (app *IntfApp) doGetAllIpKeys(d *db.DB, dbSpec *db.TableSpec) ([]db.Key, error) { + + var keys []db.Key + + intfTable, err := d.GetTable(dbSpec) + if err != nil { + return keys, err + } + + keys, err = intfTable.GetKeys() + log.Infof("Found %d INTF table keys", len(keys)) + return keys, err +} + +func (app *IntfApp) getSpecificAttr(targetUriPath string, ifKey string, oc_val *ocbinds.OpenconfigInterfaces_Interfaces_Interface_State) (bool, error) { + switch targetUriPath { + case "/openconfig-interfaces:interfaces/interface/state/oper-status": + val, e := app.getIntfAttr(ifKey, PORT_OPER_STATUS, IF_TABLE_MAP) + if len(val) > 0 { + switch val { + case "up": + oc_val.OperStatus = ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_OperStatus_UP + case "down": + oc_val.OperStatus = ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_OperStatus_DOWN + default: + oc_val.OperStatus = ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_OperStatus_UNSET + } + return true, nil + } else { + return true, e + } + case "/openconfig-interfaces:interfaces/interface/state/admin-status": + val, e := app.getIntfAttr(ifKey, PORT_ADMIN_STATUS, IF_TABLE_MAP) + if len(val) > 0 { + switch val { + case "up": + oc_val.AdminStatus = ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_AdminStatus_UP + case "down": + oc_val.AdminStatus = ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_AdminStatus_DOWN + default: + oc_val.AdminStatus = ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_AdminStatus_UNSET + } + return true, nil + } else { + return true, e + } + case "/openconfig-interfaces:interfaces/interface/state/mtu": + val, e := app.getIntfAttr(ifKey, PORT_MTU, IF_TABLE_MAP) + if len(val) > 0 { + v, e := strconv.ParseUint(val, 10, 16) + if e == nil { + oc_val.Mtu = (*uint16)(unsafe.Pointer(&v)) + return true, nil + } + } + return true, e + case "/openconfig-interfaces:interfaces/interface/state/ifindex": + val, e := app.getIntfAttr(ifKey, PORT_INDEX, IF_TABLE_MAP) + if len(val) > 0 { + v, e := strconv.ParseUint(val, 10, 32) + if e == nil { + oc_val.Ifindex = (*uint32)(unsafe.Pointer(&v)) + return true, nil + } + } + return true, e + case "/openconfig-interfaces:interfaces/interface/state/description": + val, e := app.getIntfAttr(ifKey, PORT_DESC, IF_TABLE_MAP) + if e == nil { + oc_val.Description = &val + return true, nil + } + return true, e + + default: + log.Infof(targetUriPath + " - Not an interface state attribute") + } + return false, nil +} + +func (app *IntfApp) getSpecificCounterAttr(targetUriPath string, ifKey string, counter_val *ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_Counters) (bool, error) { + + var e error + + switch targetUriPath { + case "/openconfig-interfaces:interfaces/interface/state/counters/in-octets": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_IN_OCTETS", &counter_val.InOctets) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/in-unicast-pkts": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_IN_UCAST_PKTS", &counter_val.InUnicastPkts) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/in-broadcast-pkts": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_IN_BROADCAST_PKTS", &counter_val.InBroadcastPkts) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/in-multicast-pkts": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS", &counter_val.InMulticastPkts) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/in-errors": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_IN_ERRORS", &counter_val.InErrors) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/in-discards": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_IN_DISCARDS", &counter_val.InDiscards) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/in-pkts": + var inNonUCastPkt, inUCastPkt *uint64 + var in_pkts uint64 + + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS", &inNonUCastPkt) + if e == nil { + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_IN_UCAST_PKTS", &inUCastPkt) + if e != nil { + return true, e + } + in_pkts = *inUCastPkt + *inNonUCastPkt + counter_val.InPkts = &in_pkts + return true, e + } else { + return true, e + } + + case "/openconfig-interfaces:interfaces/interface/state/counters/out-octets": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_OUT_OCTETS", &counter_val.OutOctets) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/out-unicast-pkts": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_OUT_UCAST_PKTS", &counter_val.OutUnicastPkts) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/out-broadcast-pkts": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_OUT_BROADCAST_PKTS", &counter_val.OutBroadcastPkts) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/out-multicast-pkts": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_OUT_MULTICAST_PKTS", &counter_val.OutMulticastPkts) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/out-errors": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_OUT_ERRORS", &counter_val.OutErrors) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/out-discards": + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_OUT_DISCARDS", &counter_val.OutDiscards) + return true, e + + case "/openconfig-interfaces:interfaces/interface/state/counters/out-pkts": + var outNonUCastPkt, outUCastPkt *uint64 + var out_pkts uint64 + + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_OUT_NON_UCAST_PKTS", &outNonUCastPkt) + if e == nil { + e = app.getCounters(ifKey, "SAI_PORT_STAT_IF_OUT_UCAST_PKTS", &outUCastPkt) + if e != nil { + return true, e + } + out_pkts = *outUCastPkt + *outNonUCastPkt + counter_val.OutPkts = &out_pkts + return true, e + } else { + return true, e + } + + default: + log.Infof(targetUriPath + " - Not an interface state counter attribute") + } + return false, nil +} + +func (app *IntfApp) getCounters(ifKey string, attr string, counter_val **uint64) error { + val, e := app.getIntfAttr(ifKey, attr, PORT_STAT_MAP) + if len(val) > 0 { + v, e := strconv.ParseUint(val, 10, 64) + if e == nil { + *counter_val = &v + return nil + } + } + return e +} + +func (app *IntfApp) getIntfAttr(ifName string, attr string, table Table) (string, error) { + + var ok bool = false + var entry dbEntry + + if table == IF_TABLE_MAP { + entry, ok = app.ifTableMap[ifName] + } else if table == PORT_STAT_MAP { + entry, ok = app.portStatMap[ifName] + } else { + return "", errors.New("Unsupported table") + } + + if ok { + ifData := entry.entry + + if val, ok := ifData.Field[attr]; ok { + return val, nil + } + } + return "", errors.New("Attr " + attr + "doesn't exist in IF table Map!") +} + +/*********** Translation Helper fn to convert DB Interface info to Internal DS ***********/ +func (app *IntfApp) getPortOidMapForCounters(dbCl *db.DB) error { + var err error + ifCountInfo, err := dbCl.GetMapAll(app.portOidCountrTblTs) + if err != nil { + log.Error("Port-OID (Counters) get for all the interfaces failed!") + return err + } + if ifCountInfo.IsPopulated() { + app.portOidMap.entry = ifCountInfo + } else { + return errors.New("Get for OID info from all the interfaces from Counters DB failed!") + } + return err +} + +func (app *IntfApp) convertDBIntfCounterInfoToInternal(dbCl *db.DB, ifKey string) error { + var err error + + if len(ifKey) > 0 { + oid := app.portOidMap.entry.Field[ifKey] + log.Infof("OID : %s received for Interface : %s", oid, ifKey) + + /* Get the statistics for the port */ + var ifStatKey db.Key + ifStatKey.Comp = []string{oid} + + ifStatInfo, err := dbCl.GetEntry(app.intfCountrTblTs, ifStatKey) + if err != nil { + log.Infof("Fetching port-stat for port : %s failed!", ifKey) + return err + } + app.portStatMap[ifKey] = dbEntry{entry: ifStatInfo} + } else { + for ifKey, _ := range app.ifTableMap { + app.convertDBIntfCounterInfoToInternal(dbCl, ifKey) + } + } + return err +} + +func (app *IntfApp) validateInterface(dbCl *db.DB, ifName string, ifKey db.Key) error { + var err error + if len(ifName) == 0 { + return errors.New("Empty Interface name") + } + app.portTblTs = &db.TableSpec{Name: "PORT_TABLE"} + _, err = dbCl.GetEntry(app.portTblTs, ifKey) + if err != nil { + log.Errorf("Error found on fetching Interface info from App DB for If Name : %s", ifName) + errStr := "Invalid Interface:" + ifName + err = tlerr.InvalidArgsError{Format: errStr} + return err + } + return err +} + +func (app *IntfApp) convertDBIntfInfoToInternal(dbCl *db.DB, ifName string, ifKey db.Key) error { + + var err error + /* Fetching DB data for a specific Interface */ + if len(ifName) > 0 { + log.Info("Updating Interface info from APP-DB to Internal DS for Interface name : ", ifName) + ifInfo, err := dbCl.GetEntry(app.portTblTs, ifKey) + if err != nil { + log.Errorf("Error found on fetching Interface info from App DB for If Name : %s", ifName) + errStr := "Invalid Interface:" + ifName + err = tlerr.InvalidArgsError{Format: errStr} + return err + } + if ifInfo.IsPopulated() { + log.Info("Interface Info populated for ifName : ", ifName) + app.ifTableMap[ifName] = dbEntry{entry: ifInfo} + } else { + return errors.New("Populating Interface info for " + ifName + "failed") + } + } else { + log.Info("App-DB get for all the interfaces") + tbl, err := dbCl.GetTable(app.portTblTs) + if err != nil { + log.Error("App-DB get for list of interfaces failed!") + return err + } + keys, _ := tbl.GetKeys() + for _, key := range keys { + app.convertDBIntfInfoToInternal(dbCl, key.Get(0), db.Key{Comp: []string{key.Get(0)}}) + } + } + return err +} + +/*********** Translation Helper fn to convert DB Interface IP info to Internal DS ***********/ +func (app *IntfApp) convertDBIntfIPInfoToInternal(dbCl *db.DB, ifName string) error { + + var err error + log.Info("Updating Interface IP Info from APP-DB to Internal DS for Interface Name : ", ifName) + app.allIpKeys, _ = app.doGetAllIpKeys(dbCl, app.intfIPTblTs) + + for _, key := range app.allIpKeys { + if len(key.Comp) <= 1 { + continue + } + ipInfo, err := dbCl.GetEntry(app.intfIPTblTs, key) + if err != nil { + log.Errorf("Error found on fetching Interface IP info from App DB for Interface Name : %s", ifName) + return err + } + if len(app.ifIPTableMap[key.Get(0)]) == 0 { + app.ifIPTableMap[key.Get(0)] = make(map[string]dbEntry) + app.ifIPTableMap[key.Get(0)][key.Get(1)] = dbEntry{entry: ipInfo} + } else { + app.ifIPTableMap[key.Get(0)][key.Get(1)] = dbEntry{entry: ipInfo} + } + } + return err +} + +func (app *IntfApp) convertInternalToOCIntfInfo(ifName *string, ifInfo *ocbinds.OpenconfigInterfaces_Interfaces_Interface) { + app.convertInternalToOCIntfAttrInfo(ifName, ifInfo) + app.convertInternalToOCIntfIPAttrInfo(ifName, ifInfo) + app.convertInternalToOCPortStatInfo(ifName, ifInfo) +} + +func (app *IntfApp) convertInternalToOCIntfAttrInfo(ifName *string, ifInfo *ocbinds.OpenconfigInterfaces_Interfaces_Interface) { + + /* Handling the Interface attributes */ + if entry, ok := app.ifTableMap[*ifName]; ok { + ifData := entry.entry + + name := *ifName + ifInfo.Config.Name = &name + ifInfo.State.Name = &name + + for ifAttr := range ifData.Field { + switch ifAttr { + case PORT_ADMIN_STATUS: + adminStatus := ifData.Get(ifAttr) + ifInfo.State.AdminStatus = ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_AdminStatus_DOWN + if adminStatus == "up" { + ifInfo.State.AdminStatus = ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_AdminStatus_UP + } + case PORT_OPER_STATUS: + operStatus := ifData.Get(ifAttr) + ifInfo.State.OperStatus = ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_OperStatus_DOWN + if operStatus == "up" { + ifInfo.State.OperStatus = ocbinds.OpenconfigInterfaces_Interfaces_Interface_State_OperStatus_UP + } + case PORT_DESC: + descVal := ifData.Get(ifAttr) + descr := new(string) + *descr = descVal + ifInfo.Config.Description = descr + ifInfo.State.Description = descr + case PORT_MTU: + mtuStr := ifData.Get(ifAttr) + mtuVal, err := strconv.Atoi(mtuStr) + mtu := new(uint16) + *mtu = uint16(mtuVal) + if err == nil { + ifInfo.Config.Mtu = mtu + ifInfo.State.Mtu = mtu + } + case PORT_SPEED: + speed := ifData.Get(ifAttr) + var speedEnum ocbinds.E_OpenconfigIfEthernet_ETHERNET_SPEED + + switch speed { + case "2500": + speedEnum = ocbinds.OpenconfigIfEthernet_ETHERNET_SPEED_SPEED_2500MB + case "1000": + speedEnum = ocbinds.OpenconfigIfEthernet_ETHERNET_SPEED_SPEED_1GB + case "5000": + speedEnum = ocbinds.OpenconfigIfEthernet_ETHERNET_SPEED_SPEED_5GB + case "10000": + speedEnum = ocbinds.OpenconfigIfEthernet_ETHERNET_SPEED_SPEED_10GB + case "25000": + speedEnum = ocbinds.OpenconfigIfEthernet_ETHERNET_SPEED_SPEED_25GB + case "40000": + speedEnum = ocbinds.OpenconfigIfEthernet_ETHERNET_SPEED_SPEED_40GB + case "50000": + speedEnum = ocbinds.OpenconfigIfEthernet_ETHERNET_SPEED_SPEED_50GB + case "100000": + speedEnum = ocbinds.OpenconfigIfEthernet_ETHERNET_SPEED_SPEED_100GB + default: + log.Infof("Not supported speed: %s!", speed) + } + ifInfo.Ethernet.Config.PortSpeed = speedEnum + ifInfo.Ethernet.State.PortSpeed = speedEnum + case PORT_INDEX: + ifIdxStr := ifData.Get(ifAttr) + ifIdxNum, err := strconv.Atoi(ifIdxStr) + if err == nil { + ifIdx := new(uint32) + *ifIdx = uint32(ifIdxNum) + ifInfo.State.Ifindex = ifIdx + } + default: + log.Info("Not a valid attribute!") + } + } + } + +} + +func (app *IntfApp) convertInternalToOCIntfIPAttrInfo(ifName *string, ifInfo *ocbinds.OpenconfigInterfaces_Interfaces_Interface) { + + /* Handling the Interface IP attributes */ + subIntf, err := ifInfo.Subinterfaces.NewSubinterface(0) + if err != nil { + log.Error("Creation of subinterface subtree failed!") + return + } + ygot.BuildEmptyTree(subIntf) + if ipMap, ok := app.ifIPTableMap[*ifName]; ok { + for ipKey, _ := range ipMap { + log.Info("IP address = ", ipKey) + ipB, ipNetB, _ := net.ParseCIDR(ipKey) + + v4Flag := false + v6Flag := false + + var v4Address *ocbinds.OpenconfigInterfaces_Interfaces_Interface_Subinterfaces_Subinterface_Ipv4_Addresses_Address + var v6Address *ocbinds.OpenconfigInterfaces_Interfaces_Interface_Subinterfaces_Subinterface_Ipv6_Addresses_Address + + if validIPv4(ipB.String()) { + v4Address, err = subIntf.Ipv4.Addresses.NewAddress(ipB.String()) + v4Flag = true + } else if validIPv6(ipB.String()) { + v6Address, err = subIntf.Ipv6.Addresses.NewAddress(ipB.String()) + v6Flag = true + } else { + log.Error("Invalid IP address " + ipB.String()) + continue + } + + if err != nil { + log.Error("Creation of address subtree failed!") + return + } + if v4Flag { + ygot.BuildEmptyTree(v4Address) + + ipStr := new(string) + *ipStr = ipB.String() + v4Address.Ip = ipStr + v4Address.Config.Ip = ipStr + v4Address.State.Ip = ipStr + + ipNetBNum, _ := ipNetB.Mask.Size() + prfxLen := new(uint8) + *prfxLen = uint8(ipNetBNum) + v4Address.Config.PrefixLength = prfxLen + v4Address.State.PrefixLength = prfxLen + } + if v6Flag { + ygot.BuildEmptyTree(v6Address) + + ipStr := new(string) + *ipStr = ipB.String() + v6Address.Ip = ipStr + v6Address.Config.Ip = ipStr + v6Address.State.Ip = ipStr + + ipNetBNum, _ := ipNetB.Mask.Size() + prfxLen := new(uint8) + *prfxLen = uint8(ipNetBNum) + v6Address.Config.PrefixLength = prfxLen + v6Address.State.PrefixLength = prfxLen + } + } + } +} + +func (app *IntfApp) convertInternalToOCPortStatInfo(ifName *string, ifInfo *ocbinds.OpenconfigInterfaces_Interfaces_Interface) { + if len(app.portStatMap) == 0 { + log.Errorf("Port stat info not present for interface : %s", *ifName) + return + } + if portStatInfo, ok := app.portStatMap[*ifName]; ok { + + inOctet := new(uint64) + inOctetVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_IN_OCTETS"]) + *inOctet = uint64(inOctetVal) + ifInfo.State.Counters.InOctets = inOctet + + inUCastPkt := new(uint64) + inUCastPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_IN_UCAST_PKTS"]) + *inUCastPkt = uint64(inUCastPktVal) + ifInfo.State.Counters.InUnicastPkts = inUCastPkt + + inNonUCastPkt := new(uint64) + inNonUCastPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS"]) + *inNonUCastPkt = uint64(inNonUCastPktVal) + + inPkt := new(uint64) + *inPkt = *inUCastPkt + *inNonUCastPkt + ifInfo.State.Counters.InPkts = inPkt + + inBCastPkt := new(uint64) + inBCastPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_IN_BROADCAST_PKTS"]) + *inBCastPkt = uint64(inBCastPktVal) + ifInfo.State.Counters.InBroadcastPkts = inBCastPkt + + inMCastPkt := new(uint64) + inMCastPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_IN_MULTICAST_PKTS"]) + *inMCastPkt = uint64(inMCastPktVal) + ifInfo.State.Counters.InMulticastPkts = inMCastPkt + + inErrPkt := new(uint64) + inErrPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_IN_ERRORS"]) + *inErrPkt = uint64(inErrPktVal) + ifInfo.State.Counters.InErrors = inErrPkt + + inDiscPkt := new(uint64) + inDiscPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_IN_DISCARDS"]) + *inDiscPkt = uint64(inDiscPktVal) + ifInfo.State.Counters.InDiscards = inDiscPkt + + outOctet := new(uint64) + outOctetVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_OUT_OCTETS"]) + *outOctet = uint64(outOctetVal) + ifInfo.State.Counters.OutOctets = outOctet + + outUCastPkt := new(uint64) + outUCastPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_OUT_UCAST_PKTS"]) + *outUCastPkt = uint64(outUCastPktVal) + ifInfo.State.Counters.OutUnicastPkts = outUCastPkt + + outNonUCastPkt := new(uint64) + outNonUCastPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_OUT_NON_UCAST_PKTS"]) + *outNonUCastPkt = uint64(outNonUCastPktVal) + + outPkt := new(uint64) + *outPkt = *outUCastPkt + *outNonUCastPkt + ifInfo.State.Counters.OutPkts = outPkt + + outBCastPkt := new(uint64) + outBCastPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_OUT_BROADCAST_PKTS"]) + *outBCastPkt = uint64(outBCastPktVal) + ifInfo.State.Counters.OutBroadcastPkts = outBCastPkt + + outMCastPkt := new(uint64) + outMCastPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_OUT_MULTICAST_PKTS"]) + *outMCastPkt = uint64(outMCastPktVal) + ifInfo.State.Counters.OutMulticastPkts = outMCastPkt + + outErrPkt := new(uint64) + outErrPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_OUT_ERRORS"]) + *outErrPkt = uint64(outErrPktVal) + ifInfo.State.Counters.OutErrors = outErrPkt + + outDiscPkt := new(uint64) + outDiscPktVal, _ := strconv.Atoi(portStatInfo.entry.Field["SAI_PORT_STAT_IF_OUT_DISCARDS"]) + *outDiscPkt = uint64(outDiscPktVal) + ifInfo.State.Counters.OutDiscards = outDiscPkt + } +} + +func (app *IntfApp) translateCommon(d *db.DB, inpOp reqType) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + pathInfo := app.path + + log.Infof("Received UPDATE for path %s; vars=%v", pathInfo.Template, pathInfo.Vars) + + app.allIpKeys, _ = app.doGetAllIpKeys(d, app.intfIPTs) + + intfObj := app.getAppRootObject() + + targetUriPath, err := getYangPathFromUri(app.path.Path) + log.Info("uripath:=", targetUriPath) + log.Info("err:=", err) + + if intfObj.Interface != nil && len(intfObj.Interface) > 0 { + log.Info("len:=", len(intfObj.Interface)) + for ifKey, _ := range intfObj.Interface { + log.Info("Name:=", ifKey) + intf := intfObj.Interface[ifKey] + curr, err := d.GetEntry(app.portTs, db.Key{Comp: []string{ifKey}}) + if err != nil { + errStr := "Invalid Interface:" + ifKey + ifValidErr := tlerr.InvalidArgsError{Format: errStr} + return keys, ifValidErr + } + if !curr.IsPopulated() { + log.Error("Interface ", ifKey, " doesn't exist in DB") + return keys, errors.New("Interface: " + ifKey + " doesn't exist in DB") + } + if intf.Config != nil { + if intf.Config.Description != nil { + log.Info("Description = ", *intf.Config.Description) + curr.Field["description"] = *intf.Config.Description + } else if intf.Config.Mtu != nil { + log.Info("mtu:= ", *intf.Config.Mtu) + curr.Field["mtu"] = strconv.Itoa(int(*intf.Config.Mtu)) + } else if intf.Config.Enabled != nil { + log.Info("enabled = ", *intf.Config.Enabled) + if *intf.Config.Enabled == true { + curr.Field["admin_status"] = "up" + } else { + curr.Field["admin_status"] = "down" + } + } + log.Info("Writing to db for ", ifKey) + var entry dbEntry + entry.op = opUpdate + entry.entry = curr + + app.ifTableMap[ifKey] = entry + } + if intf.Subinterfaces == nil { + continue + } + subIf := intf.Subinterfaces.Subinterface[0] + if subIf != nil { + if subIf.Ipv4 != nil && subIf.Ipv4.Addresses != nil { + for ip, _ := range subIf.Ipv4.Addresses.Address { + addr := subIf.Ipv4.Addresses.Address[ip] + if addr.Config != nil { + log.Info("Ip:=", *addr.Config.Ip) + log.Info("prefix:=", *addr.Config.PrefixLength) + if !validIPv4(*addr.Config.Ip) { + errStr := "Invalid IPv4 address " + *addr.Config.Ip + err = tlerr.InvalidArgsError{Format: errStr} + return keys, err + } + err = app.translateIpv4(d, ifKey, *addr.Config.Ip, int(*addr.Config.PrefixLength)) + if err != nil { + return keys, err + } + } + } + } + if subIf.Ipv6 != nil && subIf.Ipv6.Addresses != nil { + for ip, _ := range subIf.Ipv6.Addresses.Address { + addr := subIf.Ipv6.Addresses.Address[ip] + if addr.Config != nil { + log.Info("Ip:=", *addr.Config.Ip) + log.Info("prefix:=", *addr.Config.PrefixLength) + if !validIPv6(*addr.Config.Ip) { + errStr := "Invalid IPv6 address " + *addr.Config.Ip + err = tlerr.InvalidArgsError{Format: errStr} + return keys, err + } + err = app.translateIpv4(d, ifKey, *addr.Config.Ip, int(*addr.Config.PrefixLength)) + if err != nil { + return keys, err + } + } + } + } + } else { + err = errors.New("Only subinterface index 0 is supported") + return keys, err + } + } + } else { + err = errors.New("Not implemented") + } + + return keys, err +} + +/* Validates whether the IP exists in the DB */ +func (app *IntfApp) validateIp(dbCl *db.DB, ifName string, ip string) error { + app.allIpKeys, _ = app.doGetAllIpKeys(dbCl, app.intfIPTs) + + for _, key := range app.allIpKeys { + if len(key.Comp) < 2 { + continue + } + if key.Get(0) != ifName { + continue + } + ipAddr, _, _ := net.ParseCIDR(key.Get(1)) + ipStr := ipAddr.String() + if ipStr == ip { + log.Infof("IP address %s exists, updating the DS for deletion!", ipStr) + ipInfo, err := dbCl.GetEntry(app.intfIPTs, key) + if err != nil { + log.Error("Error found on fetching Interface IP info from App DB for Interface Name : ", ifName) + return err + } + if len(app.ifIPTableMap[key.Get(0)]) == 0 { + app.ifIPTableMap[key.Get(0)] = make(map[string]dbEntry) + app.ifIPTableMap[key.Get(0)][key.Get(1)] = dbEntry{entry: ipInfo} + } else { + app.ifIPTableMap[key.Get(0)][key.Get(1)] = dbEntry{entry: ipInfo} + } + return nil + } + } + return errors.New(fmt.Sprintf("IP address : %s doesn't exist!", ip)) +} + +func (app *IntfApp) translateIpv4(d *db.DB, intf string, ip string, prefix int) error { + var err error + var ifsKey db.Key + + ifsKey.Comp = []string{intf} + + ipPref := ip + "/" + strconv.Itoa(prefix) + ifsKey.Comp = []string{intf, ipPref} + + log.Info("ifsKey:=", ifsKey) + + log.Info("Checking for IP overlap ....") + ipA, ipNetA, _ := net.ParseCIDR(ipPref) + + for _, key := range app.allIpKeys { + if len(key.Comp) < 2 { + continue + } + ipB, ipNetB, _ := net.ParseCIDR(key.Get(1)) + + if ipNetA.Contains(ipB) || ipNetB.Contains(ipA) { + log.Info("IP ", ipPref, "overlaps with ", key.Get(1), " of ", key.Get(0)) + + if intf != key.Get(0) { + //IP overlap across different interface, reject + log.Error("IP ", ipPref, " overlaps with ", key.Get(1), " of ", key.Get(0)) + + errStr := "IP " + ipPref + " overlaps with IP " + key.Get(1) + " of Interface " + key.Get(0) + err = tlerr.InvalidArgsError{Format: errStr} + return err + } else { + //IP overlap on same interface, replace + var entry dbEntry + entry.op = opDelete + + log.Info("Entry ", key.Get(1), " on ", intf, " needs to be deleted") + if app.ifIPTableMap[intf] == nil { + app.ifIPTableMap[intf] = make(map[string]dbEntry) + } + app.ifIPTableMap[intf][key.Get(1)] = entry + } + } + } + + //At this point, we need to add the entry to db + { + var entry dbEntry + entry.op = opCreate + + m := make(map[string]string) + m["NULL"] = "NULL" + value := db.Value{Field: m} + entry.entry = value + if app.ifIPTableMap[intf] == nil { + app.ifIPTableMap[intf] = make(map[string]dbEntry) + } + app.ifIPTableMap[intf][ipPref] = entry + } + return err +} + +func (app *IntfApp) processCommon(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + + log.Info("processCommon:intf:path =", app.path) + log.Info("ProcessCommon: Target Type is " + reflect.TypeOf(*app.ygotTarget).Elem().Name()) + + for key, entry := range app.ifTableMap { + if entry.op == opUpdate { + log.Info("Updating entry for ", key) + err = d.SetEntry(app.portTs, db.Key{Comp: []string{key}}, entry.entry) + } + } + + for key, entry1 := range app.ifIPTableMap { + ifEntry, err := d.GetEntry(app.intfIPTs, db.Key{Comp: []string{key}}) + if err != nil || !ifEntry.IsPopulated() { + log.Infof("Interface Entry not present for Key:%s for IP config!", key) + m := make(map[string]string) + m["NULL"] = "NULL" + err = d.CreateEntry(app.intfIPTs, db.Key{Comp: []string{key}}, db.Value{Field: m}) + if err != nil { + return resp, err + } + log.Infof("Created Interface entry with Interface name : %s alone!", key) + } + for ip, entry := range entry1 { + if entry.op == opCreate { + log.Info("Creating entry for ", key, ":", ip) + err = d.CreateEntry(app.intfIPTs, db.Key{Comp: []string{key, ip}}, entry.entry) + } else if entry.op == opDelete { + log.Info("Deleting entry for ", key, ":", ip) + err = d.DeleteEntry(app.intfIPTs, db.Key{Comp: []string{key, ip}}) + } + } + } + return resp, err +} diff --git a/src/translib/lldp_app.go b/src/translib/lldp_app.go new file mode 100644 index 0000000000..1b185279a6 --- /dev/null +++ b/src/translib/lldp_app.go @@ -0,0 +1,456 @@ +////////////////////////////////////////////////////////////////////////// +// +// Copyright 2019 Dell, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +////////////////////////////////////////////////////////////////////////// + +package translib + +import ( + "strconv" + "reflect" + "errors" + "translib/db" + "translib/ocbinds" + "github.com/openconfig/ygot/ygot" + log "github.com/golang/glog" + "strings" + "encoding/hex" + "translib/tlerr" +) + +const ( + LLDP_REMOTE_CAP_ENABLED = "lldp_rem_sys_cap_enabled" + LLDP_REMOTE_SYS_NAME = "lldp_rem_sys_name" + LLDP_REMOTE_PORT_DESC = "lldp_rem_port_desc" + LLDP_REMOTE_CHASS_ID = "lldp_rem_chassis_id" + LLDP_REMOTE_CAP_SUPPORTED = "lldp_rem_sys_cap_supported" + LLDP_REMOTE_PORT_ID_SUBTYPE = "lldp_rem_port_id_subtype" + LLDP_REMOTE_SYS_DESC = "lldp_rem_sys_desc" + LLDP_REMOTE_REM_TIME = "lldp_rem_time_mark" + LLDP_REMOTE_PORT_ID = "lldp_rem_port_id" + LLDP_REMOTE_REM_ID = "lldp_rem_index" + LLDP_REMOTE_CHASS_ID_SUBTYPE = "lldp_rem_chassis_id_subtype" + LLDP_REMOTE_MAN_ADDR = "lldp_rem_man_addr" +) + +type lldpApp struct { + path *PathInfo + ygotRoot *ygot.GoStruct + ygotTarget *interface{} + appDb *db.DB + neighTs *db.TableSpec + lldpTableMap map[string]db.Value + lldpNeighTableMap map[string]map[string]string + lldpCapTableMap map[string]map[string]bool +} + +func init() { + log.Info("Init called for LLDP modules module") + err := register("/openconfig-lldp:lldp", + &appInfo{appType: reflect.TypeOf(lldpApp{}), + ygotRootType: reflect.TypeOf(ocbinds.OpenconfigLldp_Lldp{}), + isNative: false}) + if err != nil { + log.Fatal("Register LLDP app module with App Interface failed with error=", err) + } + + err = addModel(&ModelData{Name: "openconfig-lldp", + Org: "OpenConfig working group", + Ver: "1.0.2"}) + if err != nil { + log.Fatal("Adding model data to appinterface failed with error=", err) + } +} + +func (app *lldpApp) initialize(data appData) { + log.Info("initialize:lldp:path =", data.path) + *app = lldpApp{path: NewPathInfo(data.path), ygotRoot: data.ygotRoot, ygotTarget: data.ygotTarget} + app.neighTs = &db.TableSpec{Name: "LLDP_ENTRY_TABLE"} + app.lldpTableMap = make(map[string]db.Value) + app.lldpNeighTableMap = make(map[string]map[string]string) + app.lldpCapTableMap = make(map[string]map[string]bool) +} + +func (app *lldpApp) getAppRootObject() (*ocbinds.OpenconfigLldp_Lldp) { + deviceObj := (*app.ygotRoot).(*ocbinds.Device) + return deviceObj.Lldp +} + +func (app *lldpApp) translateCreate(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateCreate:lldp:path =", app.path) + + err = errors.New("Not implemented") + return keys, err +} + +func (app *lldpApp) translateUpdate(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateUpdate:lldp:path =", app.path) + + err = errors.New("Not implemented") + return keys, err +} + +func (app *lldpApp) translateReplace(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateReplace:lldp:path =", app.path) + + err = errors.New("Not implemented") + return keys, err +} + +func (app *lldpApp) translateDelete(d *db.DB) ([]db.WatchKeys, error) { + var err error + var keys []db.WatchKeys + log.Info("translateDelete:lldp:path =", app.path) + + err = errors.New("Not implemented") + return keys, err +} + +func (app *lldpApp) translateGet(dbs [db.MaxDB]*db.DB) error { + var err error + log.Info("translateGet:lldp:path = ", app.path) + + return err +} + +func (app *lldpApp) translateSubscribe(dbs [db.MaxDB]*db.DB, path string) (*notificationOpts, *notificationInfo, error) { + pathInfo := NewPathInfo(path) + notifInfo := notificationInfo{dbno: db.ApplDB} + notSupported := tlerr.NotSupportedError{Format: "Subscribe not supported", Path: path} + + if isSubtreeRequest(pathInfo.Template, "/openconfig-lldp:lldp/interfaces") { + if pathInfo.HasSuffix("/neighbors") || + pathInfo.HasSuffix("/config") || + pathInfo.HasSuffix("/state") { + log.Errorf("Subscribe not supported for %s!", pathInfo.Template) + return nil, nil, notSupported + } + ifKey := pathInfo.Var("name") + if len(ifKey) == 0 { + return nil, nil, errors.New("ifKey given is empty!") + } + log.Info("Interface name = ", ifKey) + if pathInfo.HasSuffix("/interface{}") { + notifInfo.table = db.TableSpec{Name: "LLDP_ENTRY_TABLE"} + notifInfo.key = asKey(ifKey) + notifInfo.needCache = true + return ¬ificationOpts{pType: OnChange}, ¬ifInfo, nil + } + } + return nil, nil, notSupported +} + +func (app *lldpApp) processCreate(d *db.DB) (SetResponse, error) { + var err error + + err = errors.New("Not implemented") + var resp SetResponse + + return resp, err +} + +func (app *lldpApp) processUpdate(d *db.DB) (SetResponse, error) { + var err error + + err = errors.New("Not implemented") + var resp SetResponse + + return resp, err +} + +func (app *lldpApp) processReplace(d *db.DB) (SetResponse, error) { + var err error + var resp SetResponse + err = errors.New("Not implemented") + + return resp, err +} + +func (app *lldpApp) processDelete(d *db.DB) (SetResponse, error) { + var err error + err = errors.New("Not implemented") + var resp SetResponse + + return resp, err +} + +func (app *lldpApp) processGet(dbs [db.MaxDB]*db.DB) (GetResponse, error) { + var err error + var payload []byte + + app.appDb = dbs[db.ApplDB] + lldpIntfObj := app.getAppRootObject() + + targetUriPath, err := getYangPathFromUri(app.path.Path) + log.Info("lldp processGet") + log.Info("targetUriPath: ", targetUriPath) + + if targetUriPath == "/openconfig-lldp:lldp/interfaces" { + log.Info("Requesting interfaces") + app.getLldpInfoFromDB(nil) + ygot.BuildEmptyTree(lldpIntfObj) + ifInfo := lldpIntfObj.Interfaces + ygot.BuildEmptyTree(ifInfo) + for ifname,_ := range app.lldpNeighTableMap { + oneIfInfo, err := ifInfo.NewInterface(ifname) + if err != nil { + log.Info("Creation of subinterface subtree failed!") + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + ygot.BuildEmptyTree(oneIfInfo) + app.getLldpNeighInfoFromInternalMap(&ifname, oneIfInfo) + if *app.ygotTarget == lldpIntfObj.Interfaces { + payload, err = dumpIetfJson(lldpIntfObj, true) + } else { + log.Info("Wrong request!") + } + + } + } else if targetUriPath == "/openconfig-lldp:lldp/interfaces/interface" { + intfObj := lldpIntfObj.Interfaces + ygot.BuildEmptyTree(intfObj) + if intfObj.Interface != nil && len(intfObj.Interface) > 0 { + for ifname, _ := range intfObj.Interface { + log.Info("if-name = ", ifname) + app.getLldpInfoFromDB(&ifname) + ifInfo := intfObj.Interface[ifname] + ygot.BuildEmptyTree(ifInfo) + app.getLldpNeighInfoFromInternalMap(&ifname, ifInfo) + + if *app.ygotTarget == intfObj.Interface[ifname] { + payload, err = dumpIetfJson(intfObj, true) + if err != nil { + log.Info("Creation of subinterface subtree failed!") + return GetResponse{Payload: payload, ErrSrc: AppErr}, err + } + } else { + log.Info("Wrong request!") + } + } + } else { + log.Info("No data") + } + } + + return GetResponse{Payload:payload}, err +} + +/** Helper function to populate JSON response for GET request **/ +func (app *lldpApp) getLldpNeighInfoFromInternalMap(ifName *string, ifInfo *ocbinds.OpenconfigLldp_Lldp_Interfaces_Interface) { + + ngInfo, err := ifInfo.Neighbors.NewNeighbor(*ifName) + if err != nil { + log.Info("Creation of subinterface subtree failed!") + return + } + ygot.BuildEmptyTree(ngInfo) + neighAttrMap:= app.lldpNeighTableMap[*ifName] + for attr, value := range neighAttrMap { + switch attr { + case LLDP_REMOTE_SYS_NAME: + name := new(string) + *name = value + ngInfo.State.SystemName = name + case LLDP_REMOTE_PORT_DESC: + pdescr := new(string) + *pdescr = value + ngInfo.State.PortDescription = pdescr + case LLDP_REMOTE_CHASS_ID: + chId := new (string) + *chId = value + ngInfo.State.ChassisId = chId + case LLDP_REMOTE_PORT_ID_SUBTYPE: + remPortIdTypeVal, err := strconv.Atoi(value) + if err == nil { + ngInfo.State.PortIdType =ocbinds.E_OpenconfigLldp_PortIdType(remPortIdTypeVal) + } + case LLDP_REMOTE_SYS_DESC: + sdesc:= new(string) + *sdesc = value + ngInfo.State.SystemDescription = sdesc + case LLDP_REMOTE_REM_TIME: + /* Ignore Remote System time */ + case LLDP_REMOTE_PORT_ID: + remPortIdPtr := new(string) + *remPortIdPtr = value + ngInfo.State.PortId = remPortIdPtr + case LLDP_REMOTE_REM_ID: + Id := new(string) + *Id = value + ngInfo.State.Id = Id + case LLDP_REMOTE_CHASS_ID_SUBTYPE: + remChassIdTypeVal , err:=strconv.Atoi(value) + if err == nil { + ngInfo.State.ChassisIdType =ocbinds.E_OpenconfigLldp_ChassisIdType(remChassIdTypeVal) + } + case LLDP_REMOTE_MAN_ADDR: + mgmtAdr:= new(string) + *mgmtAdr = value + ngInfo.State.ManagementAddress = mgmtAdr + default: + log.Info("Not a valid attribute!") + } + } + capLst := app.lldpCapTableMap[*ifName] + for capName, enabled := range capLst { + if capName == "Router" { + capInfo, err := ngInfo.Capabilities.NewCapability(6) + if err == nil { + ygot.BuildEmptyTree(capInfo) + capInfo.State.Name = 6 + capInfo.State.Enabled = &enabled + } + } else if capName == "Repeater" { + capInfo, err := ngInfo.Capabilities.NewCapability(5) + if err == nil { + ygot.BuildEmptyTree(capInfo) + capInfo.State.Name = 5 + capInfo.State.Enabled = &enabled + } + } else if capName == "Bridge" { + capInfo, err := ngInfo.Capabilities.NewCapability(3) + if err == nil { + ygot.BuildEmptyTree(capInfo) + capInfo.State.Name = 3 + capInfo.State.Enabled = &enabled + } + } else { + + } + } +} + +/** Helper function to get information from applDB **/ +func (app *lldpApp) getLldpInfoFromDB(ifname *string) { + + lldpTbl, err := app.appDb.GetTable(app.neighTs) + if err != nil { + log.Info("Can't get lldp table") + return + } + + keys, err := lldpTbl.GetKeys() + if err != nil { + log.Info("Can't get lldp keys") + return + } + + + for _, key := range keys { + log.Info("lldp key = ", key.Get(0)) + + lldpEntry, err := app.appDb.GetEntry(app.neighTs, db.Key{Comp: []string{key.Get(0)}}) + if err != nil { + log.Info("can't access neighbor table for key: ", key.Get(0)) + return + } + + if lldpEntry.IsPopulated() { + log.Info("lldp entry populated for key: ", key.Get(0)) + app.lldpTableMap[key.Get(0)] = lldpEntry + } + } + + for _, key := range keys { + if (ifname != nil && key.Get(0) != *ifname) { + continue + } + entryData := app.lldpTableMap[key.Get(0)] + if len(app.lldpNeighTableMap[key.Get(0)]) == 0 { + app.lldpNeighTableMap[key.Get(0)] = make(map[string]string) + } + for lldpAttr := range entryData.Field { + switch lldpAttr { + case LLDP_REMOTE_CAP_ENABLED: + app.getRemoteSysCap(entryData.Get(lldpAttr), key.Get(0), true) + case LLDP_REMOTE_SYS_NAME: + app.lldpNeighTableMap[key.Get(0)][LLDP_REMOTE_SYS_NAME] = entryData.Get(lldpAttr) + case LLDP_REMOTE_PORT_DESC: + app.lldpNeighTableMap[key.Get(0)][LLDP_REMOTE_PORT_DESC] = entryData.Get(lldpAttr) + case LLDP_REMOTE_CHASS_ID: + app.lldpNeighTableMap[key.Get(0)][LLDP_REMOTE_CHASS_ID] = entryData.Get(lldpAttr) + case LLDP_REMOTE_CAP_SUPPORTED: + app.getRemoteSysCap(entryData.Get(lldpAttr), key.Get(0), false) + case LLDP_REMOTE_PORT_ID_SUBTYPE: + app.lldpNeighTableMap[key.Get(0)][LLDP_REMOTE_PORT_ID_SUBTYPE] = entryData.Get(lldpAttr) + case LLDP_REMOTE_SYS_DESC: + app.lldpNeighTableMap[key.Get(0)][LLDP_REMOTE_SYS_DESC] = entryData.Get(lldpAttr) + case LLDP_REMOTE_REM_TIME: + app.lldpNeighTableMap[key.Get(0)][LLDP_REMOTE_REM_TIME] = entryData.Get(lldpAttr) + case LLDP_REMOTE_PORT_ID: + app.lldpNeighTableMap[key.Get(0)][LLDP_REMOTE_PORT_ID] = entryData.Get(lldpAttr) + case LLDP_REMOTE_REM_ID: + app.lldpNeighTableMap[key.Get(0)][LLDP_REMOTE_REM_ID] = entryData.Get(lldpAttr) + case LLDP_REMOTE_CHASS_ID_SUBTYPE: + app.lldpNeighTableMap[key.Get(0)][LLDP_REMOTE_CHASS_ID_SUBTYPE] = entryData.Get(lldpAttr) + case LLDP_REMOTE_MAN_ADDR: + app.lldpNeighTableMap[key.Get(0)][LLDP_REMOTE_MAN_ADDR] = entryData.Get(lldpAttr) + default: + log.Info("Unknown LLDP Attribute") + } + } + } +} + +/** Helper function to get remote system capabilities into a map **/ +func (app *lldpApp) getRemoteSysCap(capb string, ifname string, setCap bool) { + num_str := strings.Split(capb, " ") + byte, _ := hex.DecodeString(num_str[0] + num_str[1]) + sysCap := byte[0] + sysCap |= byte[1] + + log.Info("sysCap: ", sysCap) + + if (sysCap & (128 >> 1)) != 0 { + if app.lldpCapTableMap[ifname] == nil { + app.lldpCapTableMap[ifname] = make(map[string]bool) + app.lldpCapTableMap[ifname]["Repeater"] = false + } + if (setCap) { + log.Info("Repeater ENABLED") + app.lldpCapTableMap[ifname]["Repeater"] = true + } + } + + if (sysCap & (128 >> 2)) != 0 { + if app.lldpCapTableMap[ifname] == nil { + app.lldpCapTableMap[ifname] = make(map[string]bool) + app.lldpCapTableMap[ifname]["Bridge"] = false + } + if (setCap) { + log.Info("Bridge ENABLED") + app.lldpCapTableMap[ifname]["Bridge"] = true + } + } + + if (sysCap & (128 >> 4)) != 0 { + if app.lldpCapTableMap[ifname] == nil { + app.lldpCapTableMap[ifname] = make(map[string]bool) + app.lldpCapTableMap[ifname]["Router"] = false + } + if (setCap) { + log.Info("Router ENABLED") + app.lldpCapTableMap[ifname]["Router"] = true + } + } +} + diff --git a/src/translib/nonyang_app.go.demo b/src/translib/nonyang_app.go.demo new file mode 100644 index 0000000000..17553ce328 --- /dev/null +++ b/src/translib/nonyang_app.go.demo @@ -0,0 +1,412 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package translib + +import ( + "encoding/json" + "fmt" + "reflect" + "translib/db" + "translib/tlerr" + + log "github.com/golang/glog" +) + +// nonYangDemoApp holds all invocation and state information for +// the non-yang demo app +type nonYangDemoApp struct { + // request information + path *PathInfo + reqData []byte + + // DB client to operate on config_db + confDB *db.DB + + // Cahce for read operation + respJSON interface{} +} + +type jsonObject map[string]interface{} +type jsonArray []interface{} + +var ( + vlanTable = &db.TableSpec{Name: "VLAN"} + memberTable = &db.TableSpec{Name: "VLAN_MEMBER"} +) + +func init() { + register( + "/nonyang/", + &appInfo{appType: reflect.TypeOf(nonYangDemoApp{}), + tablesToWatch: []*db.TableSpec{vlanTable, memberTable}, + isNative: true}) +} + +// initialize function prepares this nonYangDemoApp instance +// for a new request handling. +func (app *nonYangDemoApp) initialize(data appData) { + app.path = NewPathInfo(data.path) + app.reqData = data.payload +} + +func (app *nonYangDemoApp) translateCreate(d *db.DB) ([]db.WatchKeys, error) { + app.confDB = d + return nil, nil +} + +func (app *nonYangDemoApp) translateUpdate(d *db.DB) ([]db.WatchKeys, error) { + return nil, tlerr.NotSupported("Unsuppoted operation") +} + +func (app *nonYangDemoApp) translateReplace(d *db.DB) ([]db.WatchKeys, error) { + return nil, tlerr.NotSupported("Unsuppoted operation") +} + +func (app *nonYangDemoApp) translateDelete(d *db.DB) ([]db.WatchKeys, error) { + app.confDB = d + return nil, nil +} + +func (app *nonYangDemoApp) translateGet(dbs [db.MaxDB]*db.DB) error { + return nil +} + +func (app *nonYangDemoApp) translateSubscribe(dbs [db.MaxDB]*db.DB, path string) (*notificationOpts, *notificationInfo, error) { + err := tlerr.NotSupported("Unsuppoted operation") + return nil, nil, err +} + +func (app *nonYangDemoApp) processCreate(d *db.DB) (SetResponse, error) { + var resp SetResponse + pathInfo := app.path + var err error + + log.Infof("Received CREATE for path %s; vars=%v", pathInfo.Template, pathInfo.Vars) + + switch pathInfo.Template { + case "/nonyang/vlan": + err = app.doCreateVlans() + + case "/nonyang/vlan/{}/member": + err = app.doCreateVlanMembers() + + default: + err = tlerr.NotSupported("Unknown path") + } + + return resp, err +} + +func (app *nonYangDemoApp) processUpdate(d *db.DB) (SetResponse, error) { + var resp SetResponse + return resp, tlerr.NotSupported("Unsuppoted operation") +} + +func (app *nonYangDemoApp) processReplace(d *db.DB) (SetResponse, error) { + var resp SetResponse + return resp, tlerr.NotSupported("Unsuppoted operation") +} + +func (app *nonYangDemoApp) processDelete(d *db.DB) (SetResponse, error) { + var resp SetResponse + pathInfo := app.path + var err error + + log.Infof("Received DELETE for path %s; vars=%v", pathInfo.Template, pathInfo.Vars) + + switch pathInfo.Template { + case "/nonyang/vlan/{}": + err = app.doDeleteVlan() + + case "/nonyang/vlan/{}/member/{}": + err = app.doDeleteVlanMember() + + default: + err = tlerr.NotSupported("Unknown path") + } + + return resp, err +} + +func (app *nonYangDemoApp) processGet(dbs [db.MaxDB]*db.DB) (GetResponse, error) { + app.confDB = dbs[db.ConfigDB] + pathInfo := app.path + var err error + + log.Infof("Received GET for path %s; vars=%v", pathInfo.Template, pathInfo.Vars) + + switch pathInfo.Template { + case "/nonyang/vlan": + err = app.doGetAllVlans() + + case "/nonyang/vlan/{}": + err = app.doGetVlanByID() + + default: + err = tlerr.NotSupported("Unknown path") + } + + var respData []byte + if err == nil && app.respJSON != nil { + respData, err = json.Marshal(app.respJSON) + } + + return GetResponse{Payload: respData}, err +} + +// doGetAllVlans is the handler for "/nonyang/vlan" path +// Loads all vlans and member data from db and prepares +// a json array - each item being one vlan info. +func (app *nonYangDemoApp) doGetAllVlans() error { + log.Infof("in GetAllVlans") + + // Get all vlans from db + t, err := app.confDB.GetTable(vlanTable) + if err != nil { + return err + } + + var allVlansJSON jsonArray + + keys, _ := t.GetKeys() + log.Infof("Found %d VLAN table keys", len(keys)) + for _, key := range keys { + log.Infof("Processing %v", key.Get(0)) + + vlanInfo, _ := t.GetEntry(key) + vlanJSON, err := app.getVlanJSON(&vlanInfo) + if err != nil { + return err + } + + allVlansJSON = append(allVlansJSON, *vlanJSON) + } + + app.respJSON = &allVlansJSON + return nil +} + +// doGetVlanByID is the handler for "/nonyang/vlan/{id}" path. +// Loads data for one vlan and its members and prepares a json +// object. +func (app *nonYangDemoApp) doGetVlanByID() error { + vlanID, _ := app.path.IntVar("id") + log.Infof("in GetVlanByID(), vid=%d", vlanID) + + vlanEntry, err := app.getVlanEntry(vlanID) + if err == nil { + app.respJSON, err = app.getVlanJSON(&vlanEntry) + } + + return err +} + +// getVlanJSON prepares a raw json object for given VLAN table +// entry. Member information are fetched from VLAN_MEMBER table. +func (app *nonYangDemoApp) getVlanJSON(vlanEntry *db.Value) (*jsonObject, error) { + vlanJSON := make(jsonObject) + var memberListJSON jsonArray + + vlanID, _ := vlanEntry.GetInt("vlanid") + vlanName := toVlanName(vlanID) + + log.Infof("Preparing json for vlan %d", vlanID) + + memberPorts := vlanEntry.GetList("members") + log.Infof("%s members = %v", vlanName, memberPorts) + + for _, portName := range memberPorts { + memberJSON := make(jsonObject) + memberJSON["port"] = portName + + memberEntry, err := app.confDB.GetEntry(memberTable, asKey(vlanName, portName)) + if isNotFoundError(err) { + log.Infof("Failed to load VLAN_MEMBER %s,%s; err=%v", vlanName, portName, err) + } else if err != nil { + return nil, err + } else { + memberJSON["mode"] = memberEntry.Get("tagging_mode") + } + + memberListJSON = append(memberListJSON, memberJSON) + } + + vlanJSON["id"] = vlanID + vlanJSON["name"] = vlanName + vlanJSON["members"] = memberListJSON + + return &vlanJSON, nil +} + +// doCreateVlans handles CREATE operation on "/nonyang/vlan" path. +func (app *nonYangDemoApp) doCreateVlans() error { + log.Infof("in doCreateVlans()") + + // vlan creation expects array of vlan ids. + var vlansJSON []int + err := json.Unmarshal(app.reqData, &vlansJSON) + if err != nil { + log.Errorf("Failed to parse input.. err=%v", err) + return tlerr.InvalidArgs("Invalid input") + } + + log.Infof("Receieved %d vlan ids; %v", len(vlansJSON), vlansJSON) + + for _, vid := range vlansJSON { + vlanName := toVlanName(vid) + log.Infof("NEW vlan entry '%s'", vlanName) + + entry := db.Value{Field: make(map[string]string)} + entry.SetInt("vlanid", vid) + err = app.confDB.CreateEntry(vlanTable, asKey(vlanName), entry) + if err != nil { + return err + } + } + + return nil +} + +// doCreateVlanMembers handles CREATE operation on path +// "/nonyang/vlan/{}/member" +func (app *nonYangDemoApp) doCreateVlanMembers() error { + vlanID, _ := app.path.IntVar("id") + log.Infof("in doCreateVlanMembers(), vid=%d", vlanID) + + var memberListJSON []map[string]string + err := json.Unmarshal(app.reqData, &memberListJSON) + if err != nil { + log.Errorf("Failed to parse input.. err=%v", err) + return tlerr.InvalidArgs("Invalid input") + } + + vlanName := toVlanName(vlanID) + vlanEntry, err := app.getVlanEntry(vlanID) + if err != nil { + return err + } + + membersList := vlanEntry.GetList("members") + + for _, memberJSON := range memberListJSON { + log.Infof("Processing member info %v", memberJSON) + + portName, _ := memberJSON["port"] + membersList = append(membersList, portName) + + taggingMode, ok := memberJSON["mode"] + if !ok { + taggingMode = "tagged" + } + + log.Infof("NEW vlan_member entry '%s|%s'; mode=%s", vlanName, portName, taggingMode) + memberEntry := db.Value{Field: make(map[string]string)} + memberEntry.Set("tagging_mode", taggingMode) + err = app.confDB.CreateEntry(memberTable, asKey(vlanName, portName), memberEntry) + if err != nil { + return err + } + } + + // Update the vlan table with new member list + log.Infof("SET vlan entry '%s', members=%v", vlanName, membersList) + vlanEntry.SetList("members", membersList) + err = app.confDB.ModEntry(vlanTable, asKey(vlanName), vlanEntry) + + return err +} + +func (app *nonYangDemoApp) doDeleteVlan() error { + vlanID, _ := app.path.IntVar("id") + log.Infof("in doDeleteVlan(); vid=%d", vlanID) + + vlanName := toVlanName(vlanID) + vlanKey := asKey(vlanName) + vlanEntry, err := app.confDB.GetEntry(vlanTable, vlanKey) + if isNotFoundError(err) { + log.Infof("Vlan %d not found.. nothing to delete", vlanID) + return nil + } else if err != nil { + return err + } + + // Delete VLAN_MEMBER table entry for each member port + for _, portName := range vlanEntry.GetList("members") { + log.Infof("DEL vlan_member entry '%s|%s'", vlanName, portName) + err = app.confDB.DeleteEntry(memberTable, asKey(vlanName, portName)) + if err != nil { + return err + } + } + + // Delete VLAN table entry + log.Infof("DEL vlan entry '%s'", vlanName) + err = app.confDB.DeleteEntry(vlanTable, vlanKey) + + return err +} + +func (app *nonYangDemoApp) doDeleteVlanMember() error { + vlanID, _ := app.path.IntVar("id") + portName := app.path.Var("port") + log.Infof("in doDeleteVlanMember(); vid=%d, member=%s", vlanID, portName) + + vlanName := toVlanName(vlanID) + vlanEntry, err := app.getVlanEntry(vlanID) + if err != nil { + return err + } + + membersList := vlanEntry.GetList("members") + updatedList := removeElement(membersList, portName) + + // Ignore the request if the port is not a member + if len(membersList) == len(updatedList) { + log.Infof("Vlan %d has no member %s", vlanID, portName) + return nil + } + + // Update VLAN entry with new member list + log.Infof("SET vlan entry '%s', members=%v", vlanName, updatedList) + vlanEntry.SetList("members", updatedList) + err = app.confDB.SetEntry(vlanTable, asKey(vlanName), vlanEntry) + if err != nil { + return err + } + + // Delete VLAN_MEMBER entry + log.Infof("DEL vlan_member entry '%s|%s'", vlanName, portName) + err = app.confDB.DeleteEntry(memberTable, asKey(vlanName, portName)) + + return err +} + +func (app *nonYangDemoApp) getVlanEntry(vlanID int) (db.Value, error) { + entry, err := app.confDB.GetEntry(vlanTable, asKey(toVlanName(vlanID))) + if isNotFoundError(err) { + err = tlerr.NotFound("VLAN %v does not exists", vlanID) + } + return entry, err +} + +// toVlanName returns the vlan name for given vlan id. +func toVlanName(vid int) string { + return fmt.Sprintf("Vlan%d", vid) +} diff --git a/src/translib/ocbinds/oc.go b/src/translib/ocbinds/oc.go new file mode 100644 index 0000000000..3d5333decc --- /dev/null +++ b/src/translib/ocbinds/oc.go @@ -0,0 +1,22 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package ocbinds + +//go:generate sh -c "$GO run $BUILD_GOPATH/src/github.com/openconfig/ygot/generator/generator.go -generate_fakeroot -output_file ocbinds.go -package_name ocbinds -generate_fakeroot -fakeroot_name=device -compress_paths=false -exclude_modules ietf-interfaces -path . $(find ../../../models/yang -name '*.yang' -not -name '*annot.yang' | sort)" diff --git a/src/translib/path_utils.go b/src/translib/path_utils.go new file mode 100644 index 0000000000..bf7a35dcab --- /dev/null +++ b/src/translib/path_utils.go @@ -0,0 +1,191 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package translib + +import ( + "errors" + "fmt" + "reflect" + "strconv" + "strings" + + "translib/ocbinds" + + log "github.com/golang/glog" + "github.com/openconfig/gnmi/proto/gnmi" + "github.com/openconfig/goyang/pkg/yang" + "github.com/openconfig/ygot/ygot" + "github.com/openconfig/ygot/ytypes" +) + +// PathInfo structure contains parsed path information. +type PathInfo struct { + Path string + Template string + Vars map[string]string +} + +// Var returns the string value for a path variable. Returns +// empty string if no such variable exists. +func (p *PathInfo) Var(name string) string { + return p.Vars[name] +} + +// IntVar returns the value for a path variable as an int. +// Returns 0 if no such variable exists. Returns an error +// if the value is not an integer. +func (p *PathInfo) IntVar(name string) (int, error) { + val := p.Vars[name] + if len(val) == 0 { + return 0, nil + } + + return strconv.Atoi(val) +} + +// HasPrefix checks if this path template starts with given +// prefix.. Shorthand for strings.HasPrefix(p.Template, s) +func (p *PathInfo) HasPrefix(s string) bool { + return strings.HasPrefix(p.Template, s) +} + +// HasSuffix checks if this path template ends with given +// suffix.. Shorthand for strings.HasSuffix(p.Template, s) +func (p *PathInfo) HasSuffix(s string) bool { + return strings.HasSuffix(p.Template, s) +} + +// NewPathInfo parses given path string into a PathInfo structure. +func NewPathInfo(path string) *PathInfo { + var info PathInfo + info.Path = path + info.Vars = make(map[string]string) + + //TODO optimize using regexp + var template strings.Builder + r := strings.NewReader(path) + + for r.Len() > 0 { + c, _ := r.ReadByte() + if c != '[' { + template.WriteByte(c) + continue + } + + name := readUntil(r, '=') + value := readUntil(r, ']') + if len(name) != 0 { + fmt.Fprintf(&template, "{}") + info.Vars[name] = value + } + } + + info.Template = template.String() + + return &info +} + +func readUntil(r *strings.Reader, delim byte) string { + var buff strings.Builder + for { + c, err := r.ReadByte() + if err == nil && c != delim { + buff.WriteByte(c) + } else { + break + } + } + + return buff.String() +} + +func getParentNode(targetUri *string, deviceObj *ocbinds.Device) (*interface{}, *yang.Entry, error) { + path, err := ygot.StringToPath(*targetUri, ygot.StructuredPath, ygot.StringSlicePath) + if err != nil { + return nil, nil, err + } + + var pathList []*gnmi.PathElem = path.Elem + + parentPath := &gnmi.Path{} + + for i := 0; i < (len(pathList) - 1); i++ { + pathSlice := strings.Split(pathList[i].Name, ":") + pathList[i].Name = pathSlice[len(pathSlice)-1] + parentPath.Elem = append(parentPath.Elem, pathList[i]) + } + + treeNodeList, err2 := ytypes.GetNode(ygSchema.RootSchema(), deviceObj, parentPath) + if err2 != nil { + return nil, nil, err2 + } + + if len(treeNodeList) == 0 { + return nil, nil, errors.New("Invalid URI") + } + + return &(treeNodeList[0].Data), treeNodeList[0].Schema, nil +} + +func getNodeName(targetUri *string, deviceObj *ocbinds.Device) (string, error) { + path, err := ygot.StringToPath(*targetUri, ygot.StructuredPath, ygot.StringSlicePath) + if err != nil { + log.Error("Error in uri to path conversion: ", err) + return "", err + } + + pathList := path.Elem + for i := 0; i < len(pathList); i++ { + pathSlice := strings.Split(pathList[i].Name, ":") + pathList[i].Name = pathSlice[len(pathSlice)-1] + } + + treeNodeList, err := ytypes.GetNode(ygSchema.RootSchema(), deviceObj, path) + if err != nil { + log.Error("Error in uri to path conversion: ", err) + return "", err + } + + if len(treeNodeList) == 0 { + return "", errors.New("Invalid URI") + } + + return treeNodeList[0].Schema.Name, nil +} + +func getObjectFieldName(targetUri *string, deviceObj *ocbinds.Device, ygotTarget *interface{}) (string, error) { + parentObjIntf, _, err := getParentNode(targetUri, deviceObj) + if err != nil { + return "", err + } + valObj := reflect.ValueOf(*parentObjIntf).Elem() + parentObjType := reflect.TypeOf(*parentObjIntf).Elem() + + for i := 0; i < parentObjType.NumField(); i++ { + if reflect.ValueOf(*ygotTarget).Kind() == reflect.Ptr && valObj.Field(i).Kind() == reflect.Ptr { + if valObj.Field(i).Pointer() == reflect.ValueOf(*ygotTarget).Pointer() { + return parentObjType.Field(i).Name, nil + } + } else if valObj.Field(i).String() == reflect.ValueOf(*ygotTarget).String() { + return parentObjType.Field(i).Name, nil + } + } + return "", errors.New("Target object not found") +} diff --git a/src/translib/path_utils_test.go b/src/translib/path_utils_test.go new file mode 100644 index 0000000000..e8d9c19b63 --- /dev/null +++ b/src/translib/path_utils_test.go @@ -0,0 +1,164 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package translib + +import ( + "reflect" + "strings" + "testing" + + "translib/ocbinds" +) + +func TestGetParentNode(t *testing.T) { + + tests := []struct { + tid int + targetUri string + appRootType reflect.Type + want string + }{{ + tid: 1, + targetUri: "/openconfig-acl:acl/acl-sets/", + appRootType: reflect.TypeOf(ocbinds.OpenconfigAcl_Acl{}), + want: "OpenconfigAcl_Acl", + }, { + tid: 2, + targetUri: "/openconfig-acl:acl/acl-sets/openconfig-acl:acl-set[name=MyACL1][type=ACL_IPV4]/", + appRootType: reflect.TypeOf(ocbinds.OpenconfigAcl_Acl{}), + want: "OpenconfigAcl_Acl_AclSets", + }, { + tid: 3, + targetUri: "/openconfig-acl:acl/acl-sets/openconfig-acl:acl-set[name=Sample][type=ACL_IPV4]/state/description", + appRootType: reflect.TypeOf(ocbinds.OpenconfigAcl_Acl{}), + want: "OpenconfigAcl_Acl_AclSets_AclSet_State", + }} + + for _, tt := range tests { + var deviceObj ocbinds.Device = ocbinds.Device{} + _, err := getRequestBinder(&tt.targetUri, nil, 1, &tt.appRootType).unMarshallUri(&deviceObj) + if err != nil { + t.Error("TestGetParentNode: Error in unmarshalling the URI", err) + } else { + parentNode, _, err := getParentNode(&tt.targetUri, &deviceObj) + if err != nil { + t.Error("TestGetParentNode: Error in getting the parent node: ", err) + } else if parentNode == nil { + t.Error("TestGetParentNode: Error in getting the parent node") + } else if reflect.TypeOf(*parentNode).Elem().Name() != tt.want { + t.Error("TestGetParentNode: Error in getting the parent node: ", reflect.TypeOf(*parentNode).Elem().Name()) + } + } + } +} + +func TestGetNodeName(t *testing.T) { + + tests := []struct { + tid int + targetUri string + appRootType reflect.Type + want string + }{{ + tid: 1, + targetUri: "/openconfig-acl:acl/acl-sets/", + appRootType: reflect.TypeOf(ocbinds.OpenconfigAcl_Acl{}), + want: "acl-sets", + }, { + tid: 2, + targetUri: "/openconfig-acl:acl/acl-sets/openconfig-acl:acl-set[name=MyACL1][type=ACL_IPV4]/", + appRootType: reflect.TypeOf(ocbinds.OpenconfigAcl_Acl{}), + want: "acl-set", + }, { + tid: 3, + targetUri: "/openconfig-acl:acl/acl-sets/openconfig-acl:acl-set[name=Sample][type=ACL_IPV4]/state/description", + appRootType: reflect.TypeOf(ocbinds.OpenconfigAcl_Acl{}), + want: "description", + }, { + tid: 4, // Negative test case + targetUri: "/openconfig-acl:acl/acl-sets/acl-set[name=Sample][type=ACL_IPV4]/state/descriptXX", + appRootType: reflect.TypeOf(ocbinds.OpenconfigAcl_Acl{}), + want: "rpc error: code = InvalidArgument desc = no match found in *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_State, for path elem:", + }, { + //Negative test case + tid: 9, + uri: "/openconfig-acl:acl/acl-sets/openconfig-acl:acl-set[name=Sample][type=ACL_IPV4]/state/descriptXX", + opcode: 1, + payload: []byte{}, + appRootType: reflect.TypeOf(ocbinds.OpenconfigAcl_Acl{}), + want: "rpc error: code = InvalidArgument desc = no match found in *ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_State, for path elem: 0 { + for _, err := range errs { + fmt.Fprintln(os.Stderr, err) + } + } +} + +func getOcModelsList () ([]string) { + var fileList []string + file, err := os.Open(YangPath + "models_list") + if err != nil { + return fileList + } + defer file.Close() + scanner := bufio.NewScanner(file) + for scanner.Scan() { + fileEntry := scanner.Text() + if strings.HasPrefix(fileEntry, "#") != true { + _, err := os.Stat(YangPath + fileEntry) + if err != nil { + continue + } + fileList = append(fileList, fileEntry) + } + } + return fileList +} + +func getDefaultModelsList () ([]string) { + var files []string + fileInfo, err := ioutil.ReadDir(YangPath) + if err != nil { + return files + } + + for _, file := range fileInfo { + if strings.HasPrefix(file.Name(), "sonic-") && !strings.HasSuffix(file.Name(), "-dev.yang") && filepath.Ext(file.Name()) == ".yang" { + files = append(files, file.Name()) + } + } + return files +} + +func init() { + yangFiles := []string{} + ocList := getOcModelsList() + yangFiles = getDefaultModelsList() + yangFiles = append(yangFiles, ocList...) + fmt.Println("Yang model List:", yangFiles) + err := loadYangModules(yangFiles...) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } +} + +func loadYangModules(files ...string) error { + + var err error + + paths := []string{YangPath} + + for _, path := range paths { + expanded, err := yang.PathsWithModules(path) + if err != nil { + fmt.Fprintln(os.Stderr, err) + continue + } + yang.AddPath(expanded...) + } + + ms := yang.NewModules() + + for _, name := range files { + if err := ms.Read(name); err != nil { + fmt.Fprintln(os.Stderr, err) + continue + } + } + + // Process the Yang files + reportIfError(ms.Process()) + + // Keep track of the top level modules we read in. + // Those are the only modules we want to print below. + mods := map[string]*yang.Module{} + var names []string + + for _, m := range ms.Modules { + if mods[m.Name] == nil { + mods[m.Name] = m + names = append(names, m.Name) + } + } + + sonic_entries := make([]*yang.Entry, len(names)) + oc_entries := make(map[string]*yang.Entry) + oc_annot_entries := make([]*yang.Entry, len(names)) + sonic_annot_entries := make([]*yang.Entry, len(names)) + + for _, n := range names { + if strings.Contains(n, "annot") && strings.Contains(n, "sonic") { + sonic_annot_entries = append(sonic_annot_entries, yang.ToEntry(mods[n])) + } else if strings.Contains(n, "annot") { + oc_annot_entries = append(oc_annot_entries, yang.ToEntry(mods[n])) + } else if strings.Contains(n, "sonic") { + sonic_entries = append(sonic_entries, yang.ToEntry(mods[n])) + } else if oc_entries[n] == nil { + oc_entries[n] = yang.ToEntry(mods[n]) + } + } + + dbMapBuild(sonic_entries) + annotDbSpecMap(sonic_annot_entries) + annotToDbMapBuild(oc_annot_entries) + yangToDbMapBuild(oc_entries) + + return err +} diff --git a/src/translib/transformer/xconst.go b/src/translib/transformer/xconst.go new file mode 100644 index 0000000000..8fcdabdc75 --- /dev/null +++ b/src/translib/transformer/xconst.go @@ -0,0 +1,51 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Dell, Inc. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package transformer + +const ( + YANG_MODULE = "module" + YANG_LIST = "list" + YANG_CONTAINER = "container" + YANG_LEAF = "leaf" + YANG_LEAF_LIST = "leaf-list" + + YANG_ANNOT_DB_NAME = "db-name" + YANG_ANNOT_TABLE_NAME = "table-name" + YANG_ANNOT_FIELD_NAME = "field-name" + YANG_ANNOT_KEY_DELIM = "key-delimiter" + YANG_ANNOT_TABLE_XFMR = "table-transformer" + YANG_ANNOT_FIELD_XFMR = "field-transformer" + YANG_ANNOT_KEY_XFMR = "key-transformer" + YANG_ANNOT_POST_XFMR = "post-transformer" + YANG_ANNOT_SUBTREE_XFMR = "subtree-transformer" + YANG_ANNOT_VALIDATE_FUNC = "get-validate" + + REDIS_DB_TYPE_APPLN = "APPL_DB" + REDIS_DB_TYPE_ASIC = "ASIC_DB" + REDIS_DB_TYPE_CONFIG = "CONFIG_DB" + REDIS_DB_TYPE_COUNTER = "COUNTERS_DB" + REDIS_DB_TYPE_LOG_LVL = "LOGLEVEL_DB" + REDIS_DB_TYPE_STATE = "STATE_DB" + REDIS_DB_TYPE_FLX_COUNTER = "FLEX_COUNTER_DB" + + XPATH_SEP_FWD_SLASH = "/" + XFMR_EMPTY_STRING = "" + SONIC_TABLE_INDEX = 2 + +) diff --git a/src/translib/transformer/xfmr_acl.go b/src/translib/transformer/xfmr_acl.go new file mode 100644 index 0000000000..2ded0fe655 --- /dev/null +++ b/src/translib/transformer/xfmr_acl.go @@ -0,0 +1,976 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Dell, Inc. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package transformer + +import ( + "bytes" + "errors" + "fmt" + log "github.com/golang/glog" + "github.com/openconfig/ygot/ygot" + "reflect" + "strconv" + "strings" + "translib/db" + "translib/ocbinds" + "translib/tlerr" +) + +func init() { + XlateFuncBind("DbToYang_acl_set_name_xfmr", DbToYang_acl_set_name_xfmr) + XlateFuncBind("YangToDb_acl_type_field_xfmr", YangToDb_acl_type_field_xfmr) + XlateFuncBind("DbToYang_acl_type_field_xfmr", DbToYang_acl_type_field_xfmr) + XlateFuncBind("YangToDb_acl_set_key_xfmr", YangToDb_acl_set_key_xfmr) + XlateFuncBind("DbToYang_acl_set_key_xfmr", DbToYang_acl_set_key_xfmr) + XlateFuncBind("YangToDb_acl_entry_key_xfmr", YangToDb_acl_entry_key_xfmr) + XlateFuncBind("DbToYang_acl_entry_key_xfmr", DbToYang_acl_entry_key_xfmr) + XlateFuncBind("DbToYang_acl_entry_sequenceid_xfmr", DbToYang_acl_entry_sequenceid_xfmr) + XlateFuncBind("YangToDb_acl_l2_ethertype_xfmr", YangToDb_acl_l2_ethertype_xfmr) + XlateFuncBind("DbToYang_acl_l2_ethertype_xfmr", DbToYang_acl_l2_ethertype_xfmr) + XlateFuncBind("YangToDb_acl_ip_protocol_xfmr", YangToDb_acl_ip_protocol_xfmr) + XlateFuncBind("DbToYang_acl_ip_protocol_xfmr", DbToYang_acl_ip_protocol_xfmr) + XlateFuncBind("YangToDb_acl_source_port_xfmr", YangToDb_acl_source_port_xfmr) + XlateFuncBind("DbToYang_acl_source_port_xfmr", DbToYang_acl_source_port_xfmr) + XlateFuncBind("YangToDb_acl_destination_port_xfmr", YangToDb_acl_destination_port_xfmr) + XlateFuncBind("DbToYang_acl_destination_port_xfmr", DbToYang_acl_destination_port_xfmr) + XlateFuncBind("YangToDb_acl_tcp_flags_xfmr", YangToDb_acl_tcp_flags_xfmr) + XlateFuncBind("DbToYang_acl_tcp_flags_xfmr", DbToYang_acl_tcp_flags_xfmr) + XlateFuncBind("YangToDb_acl_port_bindings_xfmr", YangToDb_acl_port_bindings_xfmr) + XlateFuncBind("DbToYang_acl_port_bindings_xfmr", DbToYang_acl_port_bindings_xfmr) + XlateFuncBind("YangToDb_acl_forwarding_action_xfmr", YangToDb_acl_forwarding_action_xfmr) + XlateFuncBind("DbToYang_acl_forwarding_action_xfmr", DbToYang_acl_forwarding_action_xfmr) + XlateFuncBind("validate_ipv4", validate_ipv4) + XlateFuncBind("validate_ipv6", validate_ipv6) + XlateFuncBind("acl_post_xfmr", acl_post_xfmr) +} + +const ( + ACL_TABLE = "ACL_TABLE" + RULE_TABLE = "ACL_RULE" + SONIC_ACL_TYPE_IPV4 = "L3" + SONIC_ACL_TYPE_L2 = "L2" + SONIC_ACL_TYPE_IPV6 = "L3V6" + OPENCONFIG_ACL_TYPE_IPV4 = "ACL_IPV4" + OPENCONFIG_ACL_TYPE_IPV6 = "ACL_IPV6" + OPENCONFIG_ACL_TYPE_L2 = "ACL_L2" + ACL_TYPE = "type" + MIN_PRIORITY = 1 + MAX_PRIORITY = 65535 +) + +/* E_OpenconfigAcl_ACL_TYPE */ +var ACL_TYPE_MAP = map[string]string{ + strconv.FormatInt(int64(ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4), 10): SONIC_ACL_TYPE_IPV4, + strconv.FormatInt(int64(ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6), 10): SONIC_ACL_TYPE_IPV6, + strconv.FormatInt(int64(ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2), 10): SONIC_ACL_TYPE_L2, +} + +/* E_OpenconfigAcl_FORWARDING_ACTION */ +var ACL_FORWARDING_ACTION_MAP = map[string]string{ + strconv.FormatInt(int64(ocbinds.OpenconfigAcl_FORWARDING_ACTION_ACCEPT), 10): "FORWARD", + strconv.FormatInt(int64(ocbinds.OpenconfigAcl_FORWARDING_ACTION_DROP), 10): "DROP", + strconv.FormatInt(int64(ocbinds.OpenconfigAcl_FORWARDING_ACTION_REJECT), 10): "REDIRECT", +} + +/* E_OpenconfigPacketMatchTypes_IP_PROTOCOL */ +var IP_PROTOCOL_MAP = map[string]string{ + strconv.FormatInt(int64(ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_ICMP), 10): "1", + strconv.FormatInt(int64(ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_IGMP), 10): "2", + strconv.FormatInt(int64(ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_TCP), 10): "6", + strconv.FormatInt(int64(ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_UDP), 10): "17", + strconv.FormatInt(int64(ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_RSVP), 10): "46", + strconv.FormatInt(int64(ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_GRE), 10): "47", + strconv.FormatInt(int64(ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_AUTH), 10): "51", + strconv.FormatInt(int64(ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_PIM), 10): "103", + strconv.FormatInt(int64(ocbinds.OpenconfigPacketMatchTypes_IP_PROTOCOL_IP_L2TP), 10): "115", +} + +var ETHERTYPE_MAP = map[ocbinds.E_OpenconfigPacketMatchTypes_ETHERTYPE]uint32{ + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_LLDP: 0x88CC, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_VLAN: 0x8100, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_ROCE: 0x8915, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_ARP: 0x0806, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_IPV4: 0x0800, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_IPV6: 0x86DD, + ocbinds.OpenconfigPacketMatchTypes_ETHERTYPE_ETHERTYPE_MPLS: 0x8847, +} + +func getAclRoot(s *ygot.GoStruct) *ocbinds.OpenconfigAcl_Acl { + deviceObj := (*s).(*ocbinds.Device) + return deviceObj.Acl +} + +func getAclTypeOCEnumFromName(val string) (ocbinds.E_OpenconfigAcl_ACL_TYPE, error) { + switch val { + case "ACL_IPV4", "openconfig-acl:ACL_IPV4": + return ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4, nil + case "ACL_IPV6", "openconfig-acl:ACL_IPV6": + return ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6, nil + case "ACL_L2", "openconfig-acl:ACL_L2": + return ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2, nil + default: + return ocbinds.OpenconfigAcl_ACL_TYPE_UNSET, + tlerr.NotSupported("ACL Type '%s' not supported", val) + } +} +func getAclKeyStrFromOCKey(aclname string, acltype ocbinds.E_OpenconfigAcl_ACL_TYPE) string { + aclN := strings.Replace(strings.Replace(aclname, " ", "_", -1), "-", "_", -1) + aclT := acltype.ΛMap()["E_OpenconfigAcl_ACL_TYPE"][int64(acltype)].Name + return aclN + "_" + aclT +} + +func getOCAclKeysFromStrDBKey(aclKey string) (string, ocbinds.E_OpenconfigAcl_ACL_TYPE) { + var aclOrigName string + var aclOrigType ocbinds.E_OpenconfigAcl_ACL_TYPE + + if strings.Contains(aclKey, "_"+OPENCONFIG_ACL_TYPE_IPV4) { + aclOrigName = strings.Replace(aclKey, "_"+OPENCONFIG_ACL_TYPE_IPV4, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4 + } else if strings.Contains(aclKey, "_"+OPENCONFIG_ACL_TYPE_IPV6) { + aclOrigName = strings.Replace(aclKey, "_"+OPENCONFIG_ACL_TYPE_IPV6, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6 + } else if strings.Contains(aclKey, "_"+OPENCONFIG_ACL_TYPE_L2) { + aclOrigName = strings.Replace(aclKey, "_"+OPENCONFIG_ACL_TYPE_L2, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2 + } + + return aclOrigName, aclOrigType +} + +func getTransportConfigTcpFlags(tcpFlags string) []ocbinds.E_OpenconfigPacketMatchTypes_TCP_FLAGS { + var flags []ocbinds.E_OpenconfigPacketMatchTypes_TCP_FLAGS + if len(tcpFlags) > 0 { + flagStr := strings.Split(tcpFlags, "/")[0] + flagNumber, _ := strconv.ParseUint(strings.Replace(flagStr, "0x", "", -1), 16, 32) + for i := 0; i < 8; i++ { + mask := 1 << uint(i) + if (int(flagNumber) & mask) > 0 { + switch int(flagNumber) & mask { + case 0x01: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_FIN) + case 0x02: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_SYN) + case 0x04: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_RST) + case 0x08: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_PSH) + case 0x10: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_ACK) + case 0x20: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_URG) + case 0x40: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_ECE) + case 0x80: + flags = append(flags, ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_CWR) + default: + } + } + } + } + return flags +} + +func getL2EtherType(etherType uint64) interface{} { + for k, v := range ETHERTYPE_MAP { + if uint32(etherType) == v { + return k + } + } + return uint16(etherType) +} + +//////////////////////////////////////////// +// Validate callpoints +//////////////////////////////////////////// +var validate_ipv4 ValidateCallpoint = func(inParams XfmrParams) (bool) { + if strings.Contains(inParams.key, "ACL_IPV4") { + return true + } + return false +} +var validate_ipv6 ValidateCallpoint = func(inParams XfmrParams) (bool) { + if strings.Contains(inParams.key, "ACL_IPV6") { + return true + } + return false +} + +//////////////////////////////////////////// +// Post Transformer +//////////////////////////////////////////// +var acl_post_xfmr PostXfmrFunc = func(inParams XfmrParams) (map[string]map[string]db.Value, error) { + log.Info("In Post transformer") + //TODO: check if a default ACL Rule exists, else create one and update the resultMap with default rule + // Return will be the updated result map + return (*inParams.dbDataMap)[inParams.curDb], nil +} + +//////////////////////////////////////////// +// Bi-directoonal overloaded methods +//////////////////////////////////////////// +var YangToDb_acl_forwarding_action_xfmr FieldXfmrYangToDb = func(inParams XfmrParams) (map[string]string, error) { + res_map := make(map[string]string) + var err error + if inParams.param == nil { + res_map["PACKET_ACTION"] = "" + return res_map, err + } + action, _ := inParams.param.(ocbinds.E_OpenconfigAcl_FORWARDING_ACTION) + log.Info("YangToDb_acl_forwarding_action_xfmr: ", inParams.ygRoot, " Xpath: ", inParams.uri, " forwarding_action: ", action) + res_map["PACKET_ACTION"] = findInMap(ACL_FORWARDING_ACTION_MAP, strconv.FormatInt(int64(action), 10)) + return res_map, err +} +var DbToYang_acl_forwarding_action_xfmr FieldXfmrDbtoYang = func(inParams XfmrParams) (map[string]interface{}, error) { + var err error + result := make(map[string]interface{}) + data := (*inParams.dbDataMap)[inParams.curDb] + log.Info("DbToYang_acl_forwarding_action_xfmr", data, inParams.ygRoot) + oc_action := findInMap(ACL_FORWARDING_ACTION_MAP, data[RULE_TABLE][inParams.key].Field["PACKET_ACTION"]) + n, err := strconv.ParseInt(oc_action, 10, 64) + result["forwarding-action"] = ocbinds.E_OpenconfigAcl_FORWARDING_ACTION(n).ΛMap()["E_OpenconfigAcl_FORWARDING_ACTION"][n].Name + return result, err +} + +var YangToDb_acl_type_field_xfmr FieldXfmrYangToDb = func(inParams XfmrParams) (map[string]string, error) { + res_map := make(map[string]string) + var err error + if inParams.param == nil { + res_map[ACL_TYPE] = "" + return res_map, err + } + + acltype, _ := inParams.param.(ocbinds.E_OpenconfigAcl_ACL_TYPE) + log.Info("YangToDb_acl_type_field_xfmr: ", inParams.ygRoot, " Xpath: ", inParams.uri, " acltype: ", acltype) + res_map[ACL_TYPE] = findInMap(ACL_TYPE_MAP, strconv.FormatInt(int64(acltype), 10)) + return res_map, err +} +var DbToYang_acl_type_field_xfmr FieldXfmrDbtoYang = func(inParams XfmrParams) (map[string]interface{}, error) { + var err error + result := make(map[string]interface{}) + data := (*inParams.dbDataMap)[inParams.curDb] + log.Info("DbToYang_acl_type_field_xfmr", data, inParams.ygRoot) + oc_acltype := findInMap(ACL_TYPE_MAP, data[ACL_TABLE][inParams.key].Field[ACL_TYPE]) + n, err := strconv.ParseInt(oc_acltype, 10, 64) + result[ACL_TYPE] = ocbinds.E_OpenconfigAcl_ACL_TYPE(n).ΛMap()["E_OpenconfigAcl_ACL_TYPE"][n].Name + return result, err +} + +var YangToDb_acl_set_key_xfmr KeyXfmrYangToDb = func(inParams XfmrParams) (string, error) { + var aclkey string + var err error + var oc_aclType ocbinds.E_OpenconfigAcl_ACL_TYPE + log.Info("YangToDb_acl_set_key_xfmr: ", inParams.ygRoot, inParams.uri) + pathInfo := NewPathInfo(inParams.uri) + + if len(pathInfo.Vars) < 2 { + err = errors.New("Invalid xpath, key attributes not found") + return aclkey, err + } + + oc_aclType, err = getAclTypeOCEnumFromName(pathInfo.Var("type")) + if err != nil { + err = errors.New("OC Acl type name to OC Acl Enum failed") + return aclkey, err + } + + aclkey = getAclKeyStrFromOCKey(pathInfo.Var("name"), oc_aclType) + log.Info("YangToDb_acl_set_key_xfmr - acl_set_key : ", aclkey) + + return aclkey, err +} + +var DbToYang_acl_set_key_xfmr KeyXfmrDbToYang = func(inParams XfmrParams) (map[string]interface{}, error) { + rmap := make(map[string]interface{}) + var err error + var aclNameStr string + var aclTypeStr string + aclkey := inParams.key + log.Info("DbToYang_acl_set_key_xfmr: ", aclkey) + if strings.Contains(aclkey, "_"+OPENCONFIG_ACL_TYPE_IPV4) { + aclNameStr = strings.Replace(aclkey, "_"+OPENCONFIG_ACL_TYPE_IPV4, "", 1) + aclTypeStr = "ACL_IPV4" + } else if strings.Contains(aclkey, "_"+OPENCONFIG_ACL_TYPE_IPV6) { + aclNameStr = strings.Replace(aclkey, "_"+OPENCONFIG_ACL_TYPE_IPV6, "", 1) + aclTypeStr = "ACL_IPV6" + } else if strings.Contains(aclkey, "_"+OPENCONFIG_ACL_TYPE_L2) { + aclNameStr = strings.Replace(aclkey, "_"+OPENCONFIG_ACL_TYPE_L2, "", 1) + aclTypeStr = "ACL_L2" + } else { + err = errors.New("Invalid key for acl set.") + log.Info("Invalid Keys for acl acl set", aclkey) + } + rmap["name"] = aclNameStr + rmap["type"] = aclTypeStr + return rmap, err +} + +var DbToYang_acl_set_name_xfmr FieldXfmrDbtoYang = func(inParams XfmrParams) (map[string]interface{}, error) { + res_map := make(map[string]interface{}) + var err error + log.Info("DbToYang_acl_set_name_xfmr: ", inParams.key) + /*name attribute corresponds to key in redis table*/ + aclName, _ := getOCAclKeysFromStrDBKey(inParams.key) + res_map["name"] = aclName + log.Info("acl-set/config/name ", res_map) + return res_map, err +} + +var YangToDb_acl_entry_key_xfmr KeyXfmrYangToDb = func(inParams XfmrParams) (string, error) { + var entry_key string + var err error + var oc_aclType ocbinds.E_OpenconfigAcl_ACL_TYPE + log.Info("YangToDb_acl_entry_key_xfmr: ", inParams.ygRoot, inParams.uri) + pathInfo := NewPathInfo(inParams.uri) + + if len(pathInfo.Vars) < 3 { + err = errors.New("Invalid xpath, key attributes not found") + return entry_key, err + } + + oc_aclType, err = getAclTypeOCEnumFromName(pathInfo.Var("type")) + if err != nil { + err = errors.New("OC Acl type name to OC Acl Enum failed") + return entry_key, err + } + + aclkey := getAclKeyStrFromOCKey(pathInfo.Var("name"), oc_aclType) + var rulekey string + if strings.Contains(pathInfo.Template, "/acl-entry{sequence-id}") { + rulekey = "RULE_" + pathInfo.Var("sequence-id") + } + entry_key = aclkey + "|" + rulekey + + log.Info("YangToDb_acl_entry_key_xfmr - entry_key : ", entry_key) + + return entry_key, err +} + +var DbToYang_acl_entry_key_xfmr KeyXfmrDbToYang = func(inParams XfmrParams) (map[string]interface{}, error) { + rmap := make(map[string]interface{}) + var err error + entry_key := inParams.key + log.Info("DbToYang_acl_entry_key_xfmr: ", entry_key) + + key := strings.Split(entry_key, "|") + if len(key) < 2 { + err = errors.New("Invalid key for acl entries.") + log.Info("Invalid Keys for acl enmtries", entry_key) + return rmap, err + } + + dbAclRule := key[1] + seqId := strings.Replace(dbAclRule, "RULE_", "", 1) + rmap["sequence-id"], _ = strconv.ParseFloat(seqId, 64) + return rmap, err +} + +var DbToYang_acl_entry_sequenceid_xfmr FieldXfmrDbtoYang = func(inParams XfmrParams) (map[string]interface{}, error) { + res_map := make(map[string]interface{}) + var err error + log.Info("DbToYang_acl_entry_sequenceid_xfmr: ", inParams.key) + /*sequenec-id attribute corresponds to key in redis table*/ + res, err := DbToYang_acl_entry_key_xfmr(inParams) + log.Info("acl-entry/config/sequence-id ", res) + if err != nil { + return res_map, err + } + if seqId, ok := res["sequence-id"]; !ok { + log.Error("sequence-id not found in acl entry") + return res_map, err + } else { + res_map["sequence-id"] = seqId + } + return res_map, err +} + +var YangToDb_acl_l2_ethertype_xfmr FieldXfmrYangToDb = func(inParams XfmrParams) (map[string]string, error) { + res_map := make(map[string]string) + var err error + + if inParams.param == nil { + res_map["ETHER_TYPE"] = "" + return res_map, err + } + ethertypeType := reflect.TypeOf(inParams.param).Elem() + log.Info("YangToDb_acl_ip_protocol_xfmr: ", inParams.ygRoot, " Xpath: ", inParams.uri, " ethertypeType: ", ethertypeType) + var b bytes.Buffer + switch ethertypeType { + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_Config_Ethertype_Union_E_OpenconfigPacketMatchTypes_ETHERTYPE{}): + v := (inParams.param).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_Config_Ethertype_Union_E_OpenconfigPacketMatchTypes_ETHERTYPE) + fmt.Fprintf(&b, "0x%0.4x", ETHERTYPE_MAP[v.E_OpenconfigPacketMatchTypes_ETHERTYPE]) + res_map["ETHER_TYPE"] = b.String() + break + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_Config_Ethertype_Union_Uint16{}): + v := (inParams.param).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_L2_Config_Ethertype_Union_Uint16) + fmt.Fprintf(&b, "0x%0.4x", v.Uint16) + res_map["ETHER_TYPE"] = b.String() + break + } + return res_map, err +} + +var DbToYang_acl_l2_ethertype_xfmr FieldXfmrDbtoYang = func(inParams XfmrParams) (map[string]interface{}, error) { + var err error + result := make(map[string]interface{}) + data := (*inParams.dbDataMap)[inParams.curDb] + log.Info("DbToYang_acl_l2_ethertype_xfmr", data, inParams.ygRoot) + if _, ok := data[RULE_TABLE]; !ok { + err = errors.New("RULE_TABLE entry not found in the input param") + return result, err + } + + ruleTbl := data[RULE_TABLE] + ruleInst := ruleTbl[inParams.key] + etype, ok := ruleInst.Field["ETHER_TYPE"] + + if ok { + etypeVal, _ := strconv.ParseUint(strings.Replace(etype, "0x", "", -1), 16, 32) + result["protocol"] = getL2EtherType(etypeVal) + } else { + err = errors.New("ETHER_TYPE field not found in DB") + } + return result, nil +} + +var YangToDb_acl_ip_protocol_xfmr FieldXfmrYangToDb = func(inParams XfmrParams) (map[string]string, error) { + res_map := make(map[string]string) + var err error + + if inParams.param == nil { + res_map["IP_PROTOCOL"] = "" + return res_map, err + } + protocolType := reflect.TypeOf(inParams.param).Elem() + log.Info("YangToDb_acl_ip_protocol_xfmr: ", inParams.ygRoot, " Xpath: ", inParams.uri, " protocolType: ", protocolType) + switch protocolType { + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_Config_Protocol_Union_E_OpenconfigPacketMatchTypes_IP_PROTOCOL{}): + v := (inParams.param).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_Config_Protocol_Union_E_OpenconfigPacketMatchTypes_IP_PROTOCOL) + res_map["IP_PROTOCOL"] = findInMap(IP_PROTOCOL_MAP, strconv.FormatInt(int64(v.E_OpenconfigPacketMatchTypes_IP_PROTOCOL), 10)) + v = nil + break + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_Config_Protocol_Union_Uint8{}): + v := (inParams.param).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Ipv4_Config_Protocol_Union_Uint8) + res_map["IP_PROTOCOL"] = strconv.FormatInt(int64(v.Uint8), 10) + break + } + return res_map, err +} + +var DbToYang_acl_ip_protocol_xfmr FieldXfmrDbtoYang = func(inParams XfmrParams) (map[string]interface{}, error) { + var err error + result := make(map[string]interface{}) + data := (*inParams.dbDataMap)[inParams.curDb] + log.Info("DbToYang_acl_ip_protocol_xfmr", data, inParams.ygRoot) + oc_protocol := findByValue(IP_PROTOCOL_MAP, data[RULE_TABLE][inParams.key].Field["IP_PROTOCOL"]) + n, err := strconv.ParseInt(oc_protocol, 10, 64) + result["protocol"] = ocbinds.E_OpenconfigPacketMatchTypes_IP_PROTOCOL(n).ΛMap()["E_OpenconfigPacketMatchTypes_IP_PROTOCOL"][n].Name + return result, err +} + +var YangToDb_acl_source_port_xfmr FieldXfmrYangToDb = func(inParams XfmrParams) (map[string]string, error) { + res_map := make(map[string]string) + var err error + if inParams.param == nil { + res_map["L4_SRC_PORT"] = "" + return res_map, err + } + sourceportType := reflect.TypeOf(inParams.param).Elem() + log.Info("YangToDb_acl_ip_protocol_xfmr: ", inParams.ygRoot, " Xpath: ", inParams.uri, " sourceportType: ", sourceportType) + switch sourceportType { + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort{}): + v := (inParams.param).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort) + res_map["L4_SRC_PORT"] = v.E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort.ΛMap()["E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort"][int64(v.E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort)].Name + break + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_String{}): + v := (inParams.param).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_String) + res_map["L4_SRC_PORT_RANGE"] = strings.Replace(v.String, "..", "-", 1) + break + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_Uint16{}): + v := (inParams.param).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_SourcePort_Union_Uint16) + res_map["L4_SRC_PORT"] = strconv.FormatInt(int64(v.Uint16), 10) + break + } + return res_map, err +} + +var DbToYang_acl_source_port_xfmr FieldXfmrDbtoYang = func(inParams XfmrParams) (map[string]interface{}, error) { + var err error + data := (*inParams.dbDataMap)[inParams.curDb] + log.Info("DbToYang_acl_source_port_xfmr: ", data, inParams.ygRoot) + result := make(map[string]interface{}) + if _, ok := data[RULE_TABLE]; !ok { + err = errors.New("RULE_TABLE entry not found in the input param") + return result, err + } + ruleTbl := data[RULE_TABLE] + ruleInst := ruleTbl[inParams.key] + port, ok := ruleInst.Field["L4_SRC_PORT"] + if ok { + result["source-port"] = port + return result, nil + } + + portRange, ok := ruleInst.Field["L4_SRC_PORT_RANGE"] + if ok { + result["source-port"] = portRange + return result, nil + } else { + err = errors.New("PORT/PORT_RANGE field not found in DB") + } + return result, err +} + +var YangToDb_acl_destination_port_xfmr FieldXfmrYangToDb = func(inParams XfmrParams) (map[string]string, error) { + res_map := make(map[string]string) + var err error + if inParams.param == nil { + res_map["L4_DST_PORT_RANGE"] = "" + return res_map, err + } + destportType := reflect.TypeOf(inParams.param).Elem() + log.Info("YangToDb_acl_ip_protocol_xfmr: ", inParams.ygRoot, " Xpath: ", inParams.uri, " destportType: ", destportType) + switch destportType { + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort{}): + v := (inParams.param).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort) + res_map["L4_DST_PORT"] = v.E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort.ΛMap()["E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort"][int64(v.E_OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort)].Name + break + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_String{}): + v := (inParams.param).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_String) + res_map["L4_DST_PORT_RANGE"] = strings.Replace(v.String, "..", "-", 1) + break + case reflect.TypeOf(ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_Uint16{}): + v := (inParams.param).(*ocbinds.OpenconfigAcl_Acl_AclSets_AclSet_AclEntries_AclEntry_Transport_Config_DestinationPort_Union_Uint16) + res_map["L4_DST_PORT"] = strconv.FormatInt(int64(v.Uint16), 10) + break + } + return res_map, err +} + +var DbToYang_acl_destination_port_xfmr FieldXfmrDbtoYang = func(inParams XfmrParams) (map[string]interface{}, error) { + var err error + result := make(map[string]interface{}) + data := (*inParams.dbDataMap)[inParams.curDb] + log.Info("DbToYang_acl_destination_port_xfmr: ", data, inParams.ygRoot) + if _, ok := data[RULE_TABLE]; !ok { + err = errors.New("RULE_TABLE entry not found in the input param") + return result, err + } + ruleTbl := data[RULE_TABLE] + ruleInst := ruleTbl[inParams.key] + port, ok := ruleInst.Field["L4_DST_PORT"] + if ok { + result["destination-port"] = port + return result, nil + } + + portRange, ok := ruleInst.Field["L4_DST_PORT_RANGE"] + if ok { + result["destination-port"] = portRange + return result, nil + } else { + err = errors.New("DST PORT/PORT_RANGE field not found in DB") + } + return result, err +} + +var YangToDb_acl_tcp_flags_xfmr FieldXfmrYangToDb = func(inParams XfmrParams) (map[string]string, error) { + res_map := make(map[string]string) + var err error + log.Info("YangToDb_acl_tcp_flags_xfmr: ") + var tcpFlags uint32 = 0x00 + var b bytes.Buffer + if inParams.param == nil { + res_map["TCP_FLAGS"] = b.String() + return res_map, err + } + log.Info("YangToDb_acl_tcp_flags_xfmr: ", inParams.ygRoot, inParams.uri) + v := reflect.ValueOf(inParams.param) + + flags := v.Interface().([]ocbinds.E_OpenconfigPacketMatchTypes_TCP_FLAGS) + for _, flag := range flags { + fmt.Println("TCP Flag name: " + flag.ΛMap()["E_OpenconfigPacketMatchTypes_TCP_FLAGS"][int64(flag)].Name) + switch flag { + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_FIN: + tcpFlags |= 0x01 + break + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_SYN: + tcpFlags |= 0x02 + break + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_RST: + tcpFlags |= 0x04 + break + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_PSH: + tcpFlags |= 0x08 + break + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_ACK: + tcpFlags |= 0x10 + break + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_URG: + tcpFlags |= 0x20 + break + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_ECE: + tcpFlags |= 0x40 + break + case ocbinds.OpenconfigPacketMatchTypes_TCP_FLAGS_TCP_CWR: + tcpFlags |= 0x80 + break + } + } + fmt.Fprintf(&b, "0x%0.2x/0x%0.2x", tcpFlags, tcpFlags) + res_map["TCP_FLAGS"] = b.String() + return res_map, err +} + +var DbToYang_acl_tcp_flags_xfmr FieldXfmrDbtoYang = func(inParams XfmrParams) (map[string]interface{}, error) { + var err error + data := (*inParams.dbDataMap)[inParams.curDb] + log.Info("DbToYang_acl_tcp_flags_xfmr: ", data, inParams.ygRoot) + result := make(map[string]interface{}) + if _, ok := data[RULE_TABLE]; !ok { + err = errors.New("RULE_TABLE entry not found in the input param") + return result, err + } + ruleTbl := data[RULE_TABLE] + ruleInst := ruleTbl[inParams.key] + tcpFlag, ok := ruleInst.Field["TCP_FLAGS"] + if ok { + result["tcp-flags"] = getTransportConfigTcpFlags(tcpFlag) + return result, nil + } + return result, nil +} + +var YangToDb_acl_port_bindings_xfmr SubTreeXfmrYangToDb = func(inParams XfmrParams) (map[string]map[string]db.Value, error) { + var err error + res_map := make(map[string]map[string]db.Value) + aclTableMap := make(map[string]db.Value) + log.Info("YangToDb_acl_port_bindings_xfmr: ", inParams.ygRoot, inParams.uri) + + aclObj := getAclRoot(inParams.ygRoot) + if aclObj.Interfaces == nil { + return res_map, err + } + aclInterfacesMap := make(map[string][]string) + for intfId, _ := range aclObj.Interfaces.Interface { + intf := aclObj.Interfaces.Interface[intfId] + if intf != nil { + if intf.IngressAclSets != nil && len(intf.IngressAclSets.IngressAclSet) > 0 { + for inAclKey, _ := range intf.IngressAclSets.IngressAclSet { + aclName := getAclKeyStrFromOCKey(inAclKey.SetName, inAclKey.Type) + aclInterfacesMap[aclName] = append(aclInterfacesMap[aclName], *intf.Id) + _, ok := aclTableMap[aclName] + if !ok { + aclTableMap[aclName] = db.Value{Field: make(map[string]string)} + } + aclTableMap[aclName].Field["stage"] = "INGRESS" + } + } + if intf.EgressAclSets != nil && len(intf.EgressAclSets.EgressAclSet) > 0 { + for outAclKey, _ := range intf.EgressAclSets.EgressAclSet { + aclName := getAclKeyStrFromOCKey(outAclKey.SetName, outAclKey.Type) + aclInterfacesMap[aclName] = append(aclInterfacesMap[aclName], *intf.Id) + _, ok := aclTableMap[aclName] + if !ok { + aclTableMap[aclName] = db.Value{Field: make(map[string]string)} + } + aclTableMap[aclName].Field["stage"] = "EGRESS" + } + } + } + } + for k, _ := range aclInterfacesMap { + val := aclTableMap[k] + (&val).SetList("ports", aclInterfacesMap[k]) + } + res_map[ACL_TABLE] = aclTableMap + return res_map, err +} + +var DbToYang_acl_port_bindings_xfmr SubTreeXfmrDbToYang = func(inParams XfmrParams) error { + var err error + data := (*inParams.dbDataMap)[inParams.curDb] + log.Info("DbToYang_acl_port_bindings_xfmr: ", data, inParams.ygRoot) + + aclTbl := data["ACL_TABLE"] + var ruleTbl map[string]map[string]db.Value + + // repopulate to use existing code + ruleTbl = make(map[string]map[string]db.Value) + for key, element := range data["ACL_RULE"] { + // split into aclKey and ruleKey + tokens := strings.Split(key, "|") + if ruleTbl[tokens[0]] == nil { + ruleTbl[tokens[0]] = make(map[string]db.Value) + } + ruleTbl[tokens[0]][tokens[1]] = db.Value{Field: make(map[string]string)} + ruleTbl[tokens[0]][tokens[1]] = element + } + + pathInfo := NewPathInfo(inParams.uri) + + acl := getAclRoot(inParams.ygRoot) + targetUriPath, _ := getYangPathFromUri(pathInfo.Path) + if isSubtreeRequest(pathInfo.Template, "/openconfig-acl:acl/interfaces/interface{}") { + for intfId := range acl.Interfaces.Interface { + intfData := acl.Interfaces.Interface[intfId] + ygot.BuildEmptyTree(intfData) + if isSubtreeRequest(targetUriPath, "/openconfig-acl:acl/interfaces/interface/ingress-acl-sets") { + err = getAclBindingInfoForInterfaceData(aclTbl, ruleTbl, intfData, intfId, "INGRESS") + } else if isSubtreeRequest(targetUriPath, "/openconfig-acl:acl/interfaces/interface/egress-acl-sets") { + err = getAclBindingInfoForInterfaceData(aclTbl, ruleTbl, intfData, intfId, "EGRESS") + } else { + err = getAclBindingInfoForInterfaceData(aclTbl, ruleTbl, intfData, intfId, "INGRESS") + if err != nil { + return err + } + err = getAclBindingInfoForInterfaceData(aclTbl, ruleTbl, intfData, intfId, "EGRESS") + } + } + } else { + err = getAllBindingsInfo(aclTbl, ruleTbl, inParams.ygRoot) + } + + return err +} + +func convertInternalToOCAclRuleBinding(aclTableMap map[string]db.Value, ruleTableMap map[string]map[string]db.Value, priority uint32, seqId int64, direction string, aclSet ygot.GoStruct, entrySet ygot.GoStruct) { + if seqId == -1 { + seqId = int64(MAX_PRIORITY - priority) + } + + var num uint64 + num = 0 + var ruleId uint32 = uint32(seqId) + + if direction == "INGRESS" { + var ingressEntrySet *ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_AclEntries_AclEntry + var ok bool + if entrySet == nil { + ingressAclSet := aclSet.(*ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet) + if ingressEntrySet, ok = ingressAclSet.AclEntries.AclEntry[ruleId]; !ok { + ingressEntrySet, _ = ingressAclSet.AclEntries.NewAclEntry(ruleId) + } + } else { + ingressEntrySet = entrySet.(*ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_AclEntries_AclEntry) + } + if ingressEntrySet != nil { + ygot.BuildEmptyTree(ingressEntrySet) + ingressEntrySet.State.SequenceId = &ruleId + ingressEntrySet.State.MatchedPackets = &num + ingressEntrySet.State.MatchedOctets = &num + } + } else if direction == "EGRESS" { + var egressEntrySet *ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_AclEntries_AclEntry + var ok bool + if entrySet == nil { + egressAclSet := aclSet.(*ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet) + if egressEntrySet, ok = egressAclSet.AclEntries.AclEntry[ruleId]; !ok { + egressEntrySet, _ = egressAclSet.AclEntries.NewAclEntry(ruleId) + } + } else { + egressEntrySet = entrySet.(*ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_AclEntries_AclEntry) + } + if egressEntrySet != nil { + ygot.BuildEmptyTree(egressEntrySet) + egressEntrySet.State.SequenceId = &ruleId + egressEntrySet.State.MatchedPackets = &num + egressEntrySet.State.MatchedOctets = &num + } + } +} + +func convertInternalToOCAclBinding(aclTableMap map[string]db.Value, ruleTableMap map[string]map[string]db.Value, aclName string, intfId string, direction string, intfAclSet ygot.GoStruct) error { + var err error + if _, ok := aclTableMap[aclName]; !ok { + err = errors.New("Acl entry not found, convertInternalToOCAclBinding") + return err + } else { + aclEntry := aclTableMap[aclName] + if !contains(aclEntry.GetList("ports"), intfId) { + return tlerr.InvalidArgs("Acl %s not binded with %s", aclName, intfId) + } + } + + for ruleName := range ruleTableMap[aclName] { + if ruleName != "DEFAULT_RULE" { + seqId, _ := strconv.Atoi(strings.Replace(ruleName, "RULE_", "", 1)) + convertInternalToOCAclRuleBinding(aclTableMap, ruleTableMap, 0, int64(seqId), direction, intfAclSet, nil) + } + } + + return err +} + +func getAllBindingsInfo(aclTableMap map[string]db.Value, ruleTableMap map[string]map[string]db.Value, ygRoot *ygot.GoStruct) error { + var err error + acl := getAclRoot(ygRoot) + + var interfaces []string + for aclName := range aclTableMap { + aclData := aclTableMap[aclName] + if len(aclData.Get("ports@")) > 0 { + aclIntfs := aclData.GetList("ports") + for i, _ := range aclIntfs { + if !contains(interfaces, aclIntfs[i]) && aclIntfs[i] != "" { + interfaces = append(interfaces, aclIntfs[i]) + } + } + } + } + ygot.BuildEmptyTree(acl) + for _, intfId := range interfaces { + var intfData *ocbinds.OpenconfigAcl_Acl_Interfaces_Interface + intfData, ok := acl.Interfaces.Interface[intfId] + if !ok { + intfData, _ = acl.Interfaces.NewInterface(intfId) + } + ygot.BuildEmptyTree(intfData) + err = getAclBindingInfoForInterfaceData(aclTableMap, ruleTableMap, intfData, intfId, "INGRESS") + err = getAclBindingInfoForInterfaceData(aclTableMap, ruleTableMap, intfData, intfId, "EGRESS") + } + return err +} + +func getAclBindingInfoForInterfaceData(aclTableMap map[string]db.Value, ruleTableMap map[string]map[string]db.Value, intfData *ocbinds.OpenconfigAcl_Acl_Interfaces_Interface, intfId string, direction string) error { + var err error + if intfData != nil { + intfData.Config.Id = intfData.Id + intfData.State.Id = intfData.Id + } + if direction == "INGRESS" { + if intfData.IngressAclSets != nil && len(intfData.IngressAclSets.IngressAclSet) > 0 { + for ingressAclSetKey, _ := range intfData.IngressAclSets.IngressAclSet { + aclName := strings.Replace(strings.Replace(ingressAclSetKey.SetName, " ", "_", -1), "-", "_", -1) + aclType := ingressAclSetKey.Type.ΛMap()["E_OpenconfigAcl_ACL_TYPE"][int64(ingressAclSetKey.Type)].Name + aclKey := aclName + "_" + aclType + + ingressAclSet := intfData.IngressAclSets.IngressAclSet[ingressAclSetKey] + if ingressAclSet != nil && ingressAclSet.AclEntries != nil && len(ingressAclSet.AclEntries.AclEntry) > 0 { + for seqId, _ := range ingressAclSet.AclEntries.AclEntry { + rulekey := "RULE_" + strconv.Itoa(int(seqId)) + entrySet := ingressAclSet.AclEntries.AclEntry[seqId] + _, ok := ruleTableMap[aclKey+"|"+rulekey] + if !ok { + log.Info("Acl Rule not found ", aclKey, rulekey) + err = errors.New("Acl Rule not found ingress, getAclBindingInfoForInterfaceData") + return err + } + convertInternalToOCAclRuleBinding(aclTableMap, ruleTableMap, 0, int64(seqId), direction, nil, entrySet) + } + } else { + ygot.BuildEmptyTree(ingressAclSet) + ingressAclSet.Config = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_Config{SetName: &aclName, Type: ingressAclSetKey.Type} + ingressAclSet.State = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_State{SetName: &aclName, Type: ingressAclSetKey.Type} + err = convertInternalToOCAclBinding(aclTableMap, ruleTableMap, aclKey, intfId, direction, ingressAclSet) + } + } + } else { + err = findAndGetAclBindingInfoForInterfaceData(aclTableMap, ruleTableMap, intfId, direction, intfData) + } + } else if direction == "EGRESS" { + if intfData.EgressAclSets != nil && len(intfData.EgressAclSets.EgressAclSet) > 0 { + for egressAclSetKey, _ := range intfData.EgressAclSets.EgressAclSet { + aclName := strings.Replace(strings.Replace(egressAclSetKey.SetName, " ", "_", -1), "-", "_", -1) + aclType := egressAclSetKey.Type.ΛMap()["E_OpenconfigAcl_ACL_TYPE"][int64(egressAclSetKey.Type)].Name + aclKey := aclName + "_" + aclType + + egressAclSet := intfData.EgressAclSets.EgressAclSet[egressAclSetKey] + if egressAclSet != nil && egressAclSet.AclEntries != nil && len(egressAclSet.AclEntries.AclEntry) > 0 { + for seqId, _ := range egressAclSet.AclEntries.AclEntry { + rulekey := "RULE_" + strconv.Itoa(int(seqId)) + entrySet := egressAclSet.AclEntries.AclEntry[seqId] + _, ok := ruleTableMap[aclKey+"|"+rulekey] + if !ok { + log.Info("Acl Rule not found ", aclKey, rulekey) + err = errors.New("Acl Rule not found egress, getAclBindingInfoForInterfaceData") + return err + } + convertInternalToOCAclRuleBinding(aclTableMap, ruleTableMap, 0, int64(seqId), direction, nil, entrySet) + } + } else { + ygot.BuildEmptyTree(egressAclSet) + egressAclSet.Config = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_Config{SetName: &aclName, Type: egressAclSetKey.Type} + egressAclSet.State = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_State{SetName: &aclName, Type: egressAclSetKey.Type} + err = convertInternalToOCAclBinding(aclTableMap, ruleTableMap, aclKey, intfId, direction, egressAclSet) + } + } + } else { + err = findAndGetAclBindingInfoForInterfaceData(aclTableMap, ruleTableMap, intfId, direction, intfData) + } + } else { + log.Error("Unknown direction") + } + return err +} + +func findAndGetAclBindingInfoForInterfaceData(aclTableMap map[string]db.Value, ruleTableMap map[string]map[string]db.Value, intfId string, direction string, intfData *ocbinds.OpenconfigAcl_Acl_Interfaces_Interface) error { + var err error + for aclName, _ := range aclTableMap { + aclData := aclTableMap[aclName] + aclIntfs := aclData.GetList("ports") + aclType := aclData.Get(ACL_TYPE) + var aclOrigName string + var aclOrigType ocbinds.E_OpenconfigAcl_ACL_TYPE + if SONIC_ACL_TYPE_IPV4 == aclType { + aclOrigName = strings.Replace(aclName, "_"+OPENCONFIG_ACL_TYPE_IPV4, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV4 + } else if SONIC_ACL_TYPE_IPV6 == aclType { + aclOrigName = strings.Replace(aclName, "_"+OPENCONFIG_ACL_TYPE_IPV6, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_IPV6 + } else if SONIC_ACL_TYPE_L2 == aclType { + aclOrigName = strings.Replace(aclName, "_"+OPENCONFIG_ACL_TYPE_L2, "", 1) + aclOrigType = ocbinds.OpenconfigAcl_ACL_TYPE_ACL_L2 + } + + if contains(aclIntfs, intfId) && direction == aclData.Get("stage") { + if direction == "INGRESS" { + if intfData.IngressAclSets != nil { + aclSetKey := ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_Key{SetName: aclOrigName, Type: aclOrigType} + ingressAclSet, ok := intfData.IngressAclSets.IngressAclSet[aclSetKey] + if !ok { + ingressAclSet, _ = intfData.IngressAclSets.NewIngressAclSet(aclOrigName, aclOrigType) + ygot.BuildEmptyTree(ingressAclSet) + ingressAclSet.Config = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_Config{SetName: &aclOrigName, Type: aclOrigType} + ingressAclSet.State = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_IngressAclSets_IngressAclSet_State{SetName: &aclOrigName, Type: aclOrigType} + } + err = convertInternalToOCAclBinding(aclTableMap, ruleTableMap, aclName, intfId, direction, ingressAclSet) + if err != nil { + return err + } + } + } else if direction == "EGRESS" { + if intfData.EgressAclSets != nil { + aclSetKey := ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_Key{SetName: aclOrigName, Type: aclOrigType} + egressAclSet, ok := intfData.EgressAclSets.EgressAclSet[aclSetKey] + if !ok { + egressAclSet, _ = intfData.EgressAclSets.NewEgressAclSet(aclOrigName, aclOrigType) + ygot.BuildEmptyTree(egressAclSet) + egressAclSet.Config = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_Config{SetName: &aclOrigName, Type: aclOrigType} + egressAclSet.State = &ocbinds.OpenconfigAcl_Acl_Interfaces_Interface_EgressAclSets_EgressAclSet_State{SetName: &aclOrigName, Type: aclOrigType} + } + err = convertInternalToOCAclBinding(aclTableMap, ruleTableMap, aclName, intfId, direction, egressAclSet) + if err != nil { + return err + } + } + } + } + } + return err +} diff --git a/src/translib/transformer/xfmr_interface.go b/src/translib/transformer/xfmr_interface.go new file mode 100644 index 0000000000..35e17ed004 --- /dev/null +++ b/src/translib/transformer/xfmr_interface.go @@ -0,0 +1,135 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Dell, Inc. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package transformer + +import ( + "github.com/openconfig/ygot/ygot" + "translib/db" + log "github.com/golang/glog" +) + +type XfmrParams struct { + d *db.DB + dbs [db.MaxDB]*db.DB + curDb db.DBNum + ygRoot *ygot.GoStruct + uri string + oper int + key string + dbDataMap *map[db.DBNum]map[string]map[string]db.Value + param interface{} +} + +/** + * KeyXfmrYangToDb type is defined to use for conversion of Yang key to DB Key + * Transformer function definition. + * Param: XfmrParams structure having Database info, YgotRoot, operation, Xpath + * Return: Database keys to access db entry, error + **/ +type KeyXfmrYangToDb func (inParams XfmrParams) (string, error) +/** + * KeyXfmrDbToYang type is defined to use for conversion of DB key to Yang key + * Transformer function definition. + * Param: XfmrParams structure having Database info, operation, Database keys to access db entry + * Return: multi dimensional map to hold the yang key attributes of complete xpath, error + **/ +type KeyXfmrDbToYang func (inParams XfmrParams) (map[string]interface{}, error) + +/** + * FieldXfmrYangToDb type is defined to use for conversion of yang Field to DB field + * Transformer function definition. + * Param: Database info, YgotRoot, operation, Xpath + * Return: multi dimensional map to hold the DB data, error + **/ +type FieldXfmrYangToDb func (inParams XfmrParams) (map[string]string, error) +/** + * FieldXfmrDbtoYang type is defined to use for conversion of DB field to Yang field + * Transformer function definition. + * Param: XfmrParams structure having Database info, operation, DB data in multidimensional map, output param YgotRoot + * Return: error + **/ +type FieldXfmrDbtoYang func (inParams XfmrParams) (map[string]interface{}, error) + +/** + * SubTreeXfmrYangToDb type is defined to use for handling the yang subtree to DB + * Transformer function definition. + * Param: XfmrParams structure having Database info, YgotRoot, operation, Xpath + * Return: multi dimensional map to hold the DB data, error + **/ +type SubTreeXfmrYangToDb func (inParams XfmrParams) (map[string]map[string]db.Value, error) +/** + * SubTreeXfmrDbToYang type is defined to use for handling the DB to Yang subtree + * Transformer function definition. + * Param : XfmrParams structure having Database pointers, current db, operation, DB data in multidimensional map, output param YgotRoot, uri + * Return : error + **/ +type SubTreeXfmrDbToYang func (inParams XfmrParams) (error) +/** + * ValidateCallpoint is used to validate a YANG node during data translation back to YANG as a response to GET + * Param : XfmrParams structure having Database pointers, current db, operation, DB data in multidimensional map, output param YgotRoot, uri + * Return : bool + **/ +type ValidateCallpoint func (inParams XfmrParams) (bool) + +/** + * PostXfmrFunc type is defined to use for handling any default handling operations required as part of the CREATE + * Transformer function definition. + * Param: XfmrParams structure having database pointers, current db, operation, DB data in multidimensional map, YgotRoot, uri + * Return: multi dimensional map to hold the DB data, error + **/ +type PostXfmrFunc func (inParams XfmrParams) (map[string]map[string]db.Value, error) + + +/** + * TableXfmrFunc type is defined to use for table transformer function for dynamic derviation of redis table. + * Param: XfmrParams structure having database pointers, current db, operation, DB data in multidimensional map, YgotRoot, uri + * Return: List of table names, error + **/ +type TableXfmrFunc func (inParams XfmrParams) ([]string, error) + + +/** + * Xfmr validation interface for validating the callback registration of app modules + * transformer methods. + **/ +type XfmrInterface interface { + xfmrInterfaceValiidate() +} + +func (KeyXfmrYangToDb) xfmrInterfaceValiidate () { + log.Info("xfmrInterfaceValiidate for KeyXfmrYangToDb") +} +func (KeyXfmrDbToYang) xfmrInterfaceValiidate () { + log.Info("xfmrInterfaceValiidate for KeyXfmrDbToYang") +} +func (FieldXfmrYangToDb) xfmrInterfaceValiidate () { + log.Info("xfmrInterfaceValiidate for FieldXfmrYangToDb") +} +func (FieldXfmrDbtoYang) xfmrInterfaceValiidate () { + log.Info("xfmrInterfaceValiidate for FieldXfmrDbtoYang") +} +func (SubTreeXfmrYangToDb) xfmrInterfaceValiidate () { + log.Info("xfmrInterfaceValiidate for SubTreeXfmrYangToDb") +} +func (SubTreeXfmrDbToYang) xfmrInterfaceValiidate () { + log.Info("xfmrInterfaceValiidate for SubTreeXfmrDbToYang") +} +func (TableXfmrFunc) xfmrInterfaceValiidate () { + log.Info("xfmrInterfaceValiidate for TableXfmrFunc") +} diff --git a/src/translib/transformer/xfmr_path_utils.go b/src/translib/transformer/xfmr_path_utils.go new file mode 100644 index 0000000000..8a052cd24c --- /dev/null +++ b/src/translib/transformer/xfmr_path_utils.go @@ -0,0 +1,99 @@ +/////////////////////////////////////////////////////////////////////// +// +// Copyright 2019 Broadcom. All rights reserved. +// The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +// +/////////////////////////////////////////////////////////////////////// + +package transformer + +import ( + "bytes" + "fmt" + "strings" +) + +// PathInfo structure contains parsed path information. +type PathInfo struct { + Path string + Template string + Vars map[string]string +} + +// Var returns the string value for a path variable. Returns +// empty string if no such variable exists. +func (p *PathInfo) Var(name string) string { + return p.Vars[name] +} + +// NewPathInfo parses given path string into a PathInfo structure. +func NewPathInfo(path string) *PathInfo { + var info PathInfo + info.Path = path + info.Vars = make(map[string]string) + + //TODO optimize using regexp + var template strings.Builder + r := strings.NewReader(path) + + for r.Len() > 0 { + c, _ := r.ReadByte() + if c != '[' { + template.WriteByte(c) + continue + } + + name := readUntil(r, '=') + value := readUntil(r, ']') + if len(name) != 0 { + fmt.Fprintf(&template, "{%s}", name) + info.Vars[name] = value + } + } + + info.Template = template.String() + + return &info +} + +func readUntil(r *strings.Reader, delim byte) string { + var buff strings.Builder + for { + c, err := r.ReadByte() + if err == nil && c != delim { + buff.WriteByte(c) + } else { + break + } + } + + return buff.String() +} + +func RemoveXPATHPredicates(s string) (string, error) { + var b bytes.Buffer + for i := 0; i < len(s); { + ss := s[i:] + si, ei := strings.Index(ss, "["), strings.Index(ss, "]") + switch { + case si == -1 && ei == -1: + // This substring didn't contain a [] pair, therefore write it + // to the buffer. + b.WriteString(ss) + // Move to the last character of the substring. + i += len(ss) + case si == -1 || ei == -1: + // This substring contained a mismatched pair of []s. + return "", fmt.Errorf("Mismatched brackets within substring %s of %s, [ pos: %d, ] pos: %d", ss, s, si, ei) + case si > ei: + // This substring contained a ] before a [. + return "", fmt.Errorf("Incorrect ordering of [] within substring %s of %s, [ pos: %d, ] pos: %d", ss, s, si, ei) + default: + // This substring contained a matched set of []s. + b.WriteString(ss[0:si]) + i += ei + 1 + } + } + + return b.String(), nil +} diff --git a/src/translib/transformer/xlate.go b/src/translib/transformer/xlate.go new file mode 100644 index 0000000000..f1b000cce1 --- /dev/null +++ b/src/translib/transformer/xlate.go @@ -0,0 +1,407 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Dell, Inc. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package transformer + +import ( + "fmt" + "encoding/json" + "errors" + log "github.com/golang/glog" + "github.com/openconfig/ygot/ygot" + "reflect" + "strings" + "translib/db" + "translib/ocbinds" +) + +const ( + GET = 1 + iota + CREATE + REPLACE + UPDATE + DELETE +) + +type KeySpec struct { + dbNum db.DBNum + Ts db.TableSpec + Key db.Key + Child []KeySpec +} + +var XlateFuncs = make(map[string]reflect.Value) + +var ( + ErrParamsNotAdapted = errors.New("The number of params is not adapted.") +) + +func XlateFuncBind(name string, fn interface{}) (err error) { + defer func() { + if e := recover(); e != nil { + err = errors.New(name + " is not valid Xfmr function.") + } + }() + + if _, ok := XlateFuncs[name]; !ok { + v := reflect.ValueOf(fn) + v.Type().NumIn() + XlateFuncs[name] = v + } else { + log.Info("Duplicate entry found in the XlateFunc map " + name) + } + return +} + +func XlateFuncCall(name string, params ...interface{}) (result []reflect.Value, err error) { + if _, ok := XlateFuncs[name]; !ok { + err = errors.New(name + " Xfmr function does not exist.") + return nil, err + } + if len(params) != XlateFuncs[name].Type().NumIn() { + err = ErrParamsNotAdapted + return nil, nil + } + in := make([]reflect.Value, len(params)) + for k, param := range params { + in[k] = reflect.ValueOf(param) + } + result = XlateFuncs[name].Call(in) + return result, nil +} + +func TraverseDb(dbs [db.MaxDB]*db.DB, spec KeySpec, result *map[db.DBNum]map[string]map[string]db.Value, parentKey *db.Key) error { + var err error + var dbOpts db.Options + + dbOpts = getDBOptions(spec.dbNum) + separator := dbOpts.KeySeparator + log.Infof("key separator for table %v in Db %v is %v", spec.Ts.Name, spec.dbNum, separator) + + if spec.Key.Len() > 0 { + // get an entry with a specific key + data, err := dbs[spec.dbNum].GetEntry(&spec.Ts, spec.Key) + if err != nil { + return err + } + + if (*result)[spec.dbNum][spec.Ts.Name] == nil { + (*result)[spec.dbNum][spec.Ts.Name] = map[string]db.Value{strings.Join(spec.Key.Comp, separator): data} + } else { + (*result)[spec.dbNum][spec.Ts.Name][strings.Join(spec.Key.Comp, separator)] = data + } + + if len(spec.Child) > 0 { + for _, ch := range spec.Child { + err = TraverseDb(dbs, ch, result, &spec.Key) + } + } + } else { + // TODO - GetEntry support with regex patten, 'abc*' for optimization + keys, err := dbs[spec.dbNum].GetKeys(&spec.Ts) + if err != nil { + return err + } + for i, _ := range keys { + if parentKey != nil { + // TODO - multi-depth with a custom delimiter + if strings.Index(strings.Join(keys[i].Comp, separator), strings.Join((*parentKey).Comp, separator)) == -1 { + continue + } + } + spec.Key = keys[i] + err = TraverseDb(dbs, spec, result, parentKey) + } + } + return err +} + +func XlateUriToKeySpec(uri string, ygRoot *ygot.GoStruct, t *interface{}) (*[]KeySpec, error) { + + var err error + var retdbFormat = make([]KeySpec, 0) + + // In case of SONIC yang, the tablename and key info is available in the xpath + if isSonicYang(uri) { + /* Extract the xpath and key from input xpath */ + xpath, keyStr, tableName := sonicXpathKeyExtract(uri) + retdbFormat = fillSonicKeySpec(xpath, tableName, keyStr) + } else { + /* Extract the xpath and key from input xpath */ + xpath, keyStr, _ := xpathKeyExtract(nil, ygRoot, 0, uri) + retdbFormat = FillKeySpecs(xpath, keyStr, &retdbFormat) + } + + return &retdbFormat, err +} + +func FillKeySpecs(yangXpath string , keyStr string, retdbFormat *[]KeySpec) ([]KeySpec){ + if xYangSpecMap == nil { + return *retdbFormat + } + _, ok := xYangSpecMap[yangXpath] + if ok { + xpathInfo := xYangSpecMap[yangXpath] + if xpathInfo.tableName != nil { + dbFormat := KeySpec{} + dbFormat.Ts.Name = *xpathInfo.tableName + dbFormat.dbNum = xpathInfo.dbIndex + if keyStr != "" { + dbFormat.Key.Comp = append(dbFormat.Key.Comp, keyStr) + } + for _, child := range xpathInfo.childTable { + if xDbSpecMap != nil { + if _, ok := xDbSpecMap[child]; ok { + chlen := len(xDbSpecMap[child].yangXpath) + if chlen > 0 { + children := make([]KeySpec, 0) + for _, childXpath := range xDbSpecMap[child].yangXpath { + children = FillKeySpecs(childXpath, "", &children) + dbFormat.Child = append(dbFormat.Child, children...) + } + } + } + } + } + *retdbFormat = append(*retdbFormat, dbFormat) + } else { + for _, child := range xpathInfo.childTable { + if xDbSpecMap != nil { + if _, ok := xDbSpecMap[child]; ok { + chlen := len(xDbSpecMap[child].yangXpath) + if chlen > 0 { + for _, childXpath := range xDbSpecMap[child].yangXpath { + *retdbFormat = FillKeySpecs(childXpath, "", retdbFormat) + } + } + } + } + } + } + } + return *retdbFormat +} + +func fillSonicKeySpec(xpath string , tableName string, keyStr string) ( []KeySpec ) { + + var retdbFormat = make([]KeySpec, 0) + + if tableName != "" { + dbFormat := KeySpec{} + dbFormat.Ts.Name = tableName + cdb := db.ConfigDB + if _, ok := xDbSpecMap[tableName]; ok { + cdb = xDbSpecMap[tableName].dbIndex + } + dbFormat.dbNum = cdb + if keyStr != "" { + dbFormat.Key.Comp = append(dbFormat.Key.Comp, keyStr) + } + retdbFormat = append(retdbFormat, dbFormat) + } else { + // If table name not available in xpath get top container name + container := xpath + if xDbSpecMap != nil { + if _, ok := xDbSpecMap[container]; ok { + dbInfo := xDbSpecMap[container] + if dbInfo.fieldType == "container" { + for dir, _ := range dbInfo.dbEntry.Dir { + _, ok := xDbSpecMap[dir] + if ok && xDbSpecMap[dir].dbEntry.Node.Statement().Keyword == "container" { + cdb := xDbSpecMap[dir].dbIndex + dbFormat := KeySpec{} + dbFormat.Ts.Name = dir + dbFormat.dbNum = cdb + retdbFormat = append(retdbFormat, dbFormat) + } + } + } + } + } + } + return retdbFormat +} + +func XlateToDb(path string, opcode int, d *db.DB, yg *ygot.GoStruct, yt *interface{}) (map[string]map[string]db.Value, error) { + + var err error + + device := (*yg).(*ocbinds.Device) + jsonStr, err := ygot.EmitJSON(device, &ygot.EmitJSONConfig{ + Format: ygot.RFC7951, + Indent: " ", + SkipValidation: true, + RFC7951Config: &ygot.RFC7951JSONConfig{ + AppendModuleName: true, + }, + }) + + jsonData := make(map[string]interface{}) + err = json.Unmarshal([]byte(jsonStr), &jsonData) + if err != nil { + log.Errorf("Error: failed to unmarshal json.") + return nil, err + } + + // Map contains table.key.fields + var result = make(map[string]map[string]db.Value) + switch opcode { + case CREATE: + log.Info("CREATE case") + err = dbMapCreate(d, yg, opcode, path, jsonData, result) + if err != nil { + log.Errorf("Error: Data translation from yang to db failed for create request.") + } + + case UPDATE: + log.Info("UPDATE case") + err = dbMapUpdate(d, yg, opcode, path, jsonData, result) + if err != nil { + log.Errorf("Error: Data translation from yang to db failed for update request.") + } + + case REPLACE: + log.Info("REPLACE case") + err = dbMapUpdate(d, yg, opcode, path, jsonData, result) + if err != nil { + log.Errorf("Error: Data translation from yang to db failed for replace request.") + } + + case DELETE: + log.Info("DELETE case") + err = dbMapDelete(d, yg, opcode, path, jsonData, result) + if err != nil { + log.Errorf("Error: Data translation from yang to db failed for delete request.") + } + } + return result, err +} + +func GetAndXlateFromDB(uri string, ygRoot *ygot.GoStruct, dbs [db.MaxDB]*db.DB) ([]byte, error) { + var err error + var payload []byte + log.Info("received xpath =", uri) + + keySpec, err := XlateUriToKeySpec(uri, ygRoot, nil) + var dbresult = make(map[db.DBNum]map[string]map[string]db.Value) + for i := db.ApplDB; i < db.MaxDB; i++ { + dbresult[i] = make(map[string]map[string]db.Value) + } + + for _, spec := range *keySpec { + err := TraverseDb(dbs, spec, &dbresult, nil) + if err != nil { + log.Error("TraverseDb() failure") + return payload, err + } + } + + payload, err = XlateFromDb(uri, ygRoot, dbs, dbresult) + if err != nil { + log.Error("XlateFromDb() failure.") + return payload, err + } + + return payload, err +} + +func XlateFromDb(uri string, ygRoot *ygot.GoStruct, dbs [db.MaxDB]*db.DB, data map[db.DBNum]map[string]map[string]db.Value) ([]byte, error) { + + var err error + var result []byte + var dbData = make(map[db.DBNum]map[string]map[string]db.Value) + var cdb db.DBNum = db.ConfigDB + + dbData = data + if isSonicYang(uri) { + xpath, keyStr, tableName := sonicXpathKeyExtract(uri) + if (tableName != "") { + dbInfo, ok := xDbSpecMap[tableName] + if !ok { + log.Warningf("No entry in xDbSpecMap for xpath %v", tableName) + } else { + cdb = dbInfo.dbIndex + } + tokens:= strings.Split(xpath, "/") + // Format /module:container/tableName/listname[key]/fieldName + if tokens[SONIC_TABLE_INDEX] == tableName { + fieldName := tokens[len(tokens)-1] + dbSpecField := tableName + "/" + fieldName + _, ok := xDbSpecMap[dbSpecField] + if ok && xDbSpecMap[dbSpecField].fieldType == "leaf" { + dbData[cdb] = extractFieldFromDb(tableName, keyStr, fieldName, data[cdb]) + } + } + } + } else { + xpath, _ := XfmrRemoveXPATHPredicates(uri) + if _, ok := xYangSpecMap[xpath]; ok { + cdb = xYangSpecMap[xpath].dbIndex + } + } + payload, err := dbDataToYangJsonCreate(uri, ygRoot, dbs, &dbData, cdb) + log.Info("Payload generated:", payload) + + if err != nil { + log.Errorf("Error: failed to create json response from DB data.") + return nil, err + } + + result = []byte(payload) + return result, err + +} + +func extractFieldFromDb(tableName string, keyStr string, fieldName string, data map[string]map[string]db.Value) (map[string]map[string]db.Value) { + + var dbVal db.Value + var dbData = make(map[string]map[string]db.Value) + + if tableName != "" && keyStr != "" && fieldName != "" { + if data[tableName][keyStr].Field != nil { + dbData[tableName] = make(map[string]db.Value) + dbVal.Field = make(map[string]string) + dbVal.Field[fieldName] = data[tableName][keyStr].Field[fieldName] + dbData[tableName][keyStr] = dbVal + } + } + return dbData +} + +func GetModuleNmFromPath(uri string) (string, error) { + log.Infof("received uri %s to extract module name from ", uri) + moduleNm, err := uriModuleNameGet(uri) + return moduleNm, err +} + +func GetOrdDBTblList(ygModuleNm string) ([]string, error) { + var result []string + var err error + if dbTblList, ok := xDbSpecOrdTblMap[ygModuleNm]; ok { + result = dbTblList + if len(dbTblList) == 0 { + log.Error("Ordered DB Table list is empty for module name = ", ygModuleNm) + err = fmt.Errorf("Ordered DB Table list is empty for module name %v", ygModuleNm) + + } + } else { + log.Error("No entry found in the map of module names to ordered list of DB Tables for module = ", ygModuleNm) + err = fmt.Errorf("No entry found in the map of module names to ordered list of DB Tables for module = %v", ygModuleNm) + } + return result, err +} diff --git a/src/translib/transformer/xlate_from_db.go b/src/translib/transformer/xlate_from_db.go new file mode 100644 index 0000000000..3744670692 --- /dev/null +++ b/src/translib/transformer/xlate_from_db.go @@ -0,0 +1,766 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Dell, Inc. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package transformer + +import ( + "fmt" + "translib/db" + "strings" + "encoding/json" + "os" + "strconv" + "errors" + "translib/ocbinds" + "github.com/openconfig/goyang/pkg/yang" + "github.com/openconfig/ygot/ygot" + "github.com/openconfig/ygot/ytypes" + + log "github.com/golang/glog" +) + +type typeMapOfInterface map[string]interface{} + +func xfmrHandlerFunc(inParams XfmrParams) (map[string]interface{}, error) { + result := make(map[string]interface{}) + xpath, _ := XfmrRemoveXPATHPredicates(inParams.uri) + log.Infof("Subtree transformer function(\"%v\") invoked for yang path(\"%v\").", xYangSpecMap[xpath].xfmrFunc, xpath) + _, err := XlateFuncCall(dbToYangXfmrFunc(xYangSpecMap[xpath].xfmrFunc), inParams) + if err != nil { + log.Infof("Failed to retrieve data for xpath(\"%v\") err(%v).", inParams.uri, err) + return result, err + } + + ocbSch, _ := ocbinds.Schema() + schRoot := ocbSch.RootSchema() + device := (*inParams.ygRoot).(*ocbinds.Device) + + path, _ := ygot.StringToPath(inParams.uri, ygot.StructuredPath, ygot.StringSlicePath) + for _, p := range path.Elem { + pathSlice := strings.Split(p.Name, ":") + p.Name = pathSlice[len(pathSlice)-1] + if len(p.Key) > 0 { + for ekey, ent := range p.Key { + eslice := strings.Split(ent, ":") + p.Key[ekey] = eslice[len(eslice)-1] + } + } + } + + nodeList, nodeErr := ytypes.GetNode(schRoot, device, path) + if nodeErr != nil { + log.Infof("Failed to get node for xpath(\"%v\") err(%v).", inParams.uri, err) + return result, err + } + node := nodeList[0].Data + nodeYgot, _ := (node).(ygot.ValidatedGoStruct) + payload, err := ygot.EmitJSON(nodeYgot, &ygot.EmitJSONConfig{ Format: ygot.RFC7951, + Indent: " ", SkipValidation: true, + RFC7951Config: &ygot.RFC7951JSONConfig{ AppendModuleName: false, }, + }) + err = json.Unmarshal([]byte(payload), &result) + return result, err +} + +func leafXfmrHandlerFunc(inParams XfmrParams) (map[string]interface{}, error) { + xpath, _ := XfmrRemoveXPATHPredicates(inParams.uri) + ret, err := XlateFuncCall(dbToYangXfmrFunc(xYangSpecMap[xpath].xfmrFunc), inParams) + if err != nil { + return nil, err + } + if ret != nil { + fldValMap := ret[0].Interface().(map[string]interface{}) + return fldValMap, nil + } else { + return nil, nil + } +} + +func validateHandlerFunc(inParams XfmrParams) (bool) { + xpath, _ := XfmrRemoveXPATHPredicates(inParams.uri) + ret, err := XlateFuncCall(xYangSpecMap[xpath].validateFunc, inParams) + if err != nil { + return false + } + return ret[0].Interface().(bool) +} + +func xfmrTblHandlerFunc(xfmrTblFunc string, inParams XfmrParams) []string { + ret, err := XlateFuncCall(xfmrTblFunc, inParams) + if err != nil { + return []string{} + } + return ret[0].Interface().([]string) +} + + +func DbValToInt(dbFldVal string, base int, size int, isUint bool) (interface{}, error) { + var res interface{} + var err error + if isUint { + if res, err = strconv.ParseUint(dbFldVal, base, size); err != nil { + log.Warningf("Non Yint%v type for yang leaf-list item %v", size, dbFldVal) + } + } else { + if res, err = strconv.ParseInt(dbFldVal, base, size); err != nil { + log.Warningf("Non Yint %v type for yang leaf-list item %v", size, dbFldVal) + } + } + return res, err +} + +func DbToYangType(yngTerminalNdDtType yang.TypeKind, fldXpath string, dbFldVal string) (interface{}, error) { + log.Infof("Received FieldXpath %v, yngTerminalNdDtType %v and Db field value %v to be converted to yang data-type.", fldXpath, yngTerminalNdDtType, dbFldVal) + var res interface{} + var err error + const INTBASE = 10 + switch yngTerminalNdDtType { + case yang.Ynone: + log.Warning("Yang node data-type is non base yang type") + //TODO - enhance to handle non base data types depending on future use case + err = errors.New("Yang node data-type is non base yang type") + case yang.Yint8: + res, err = DbValToInt(dbFldVal, INTBASE, 8, false) + case yang.Yint16: + res, err = DbValToInt(dbFldVal, INTBASE, 16, false) + case yang.Yint32: + res, err = DbValToInt(dbFldVal, INTBASE, 32, false) + case yang.Yuint8: + res, err = DbValToInt(dbFldVal, INTBASE, 8, true) + case yang.Yuint16: + res, err = DbValToInt(dbFldVal, INTBASE, 16, true) + case yang.Yuint32: + res, err = DbValToInt(dbFldVal, INTBASE, 32, true) + case yang.Ybool: + if res, err = strconv.ParseBool(dbFldVal); err != nil { + log.Warningf("Non Bool type for yang leaf-list item %v", dbFldVal) + } + case yang.Ybinary, yang.Ydecimal64, yang.Yenum, yang.Yidentityref, yang.Yint64, yang.Yuint64, yang.Ystring, yang.Yunion,yang.Yleafref: + // TODO - handle the union type + // Make sure to encode as string, expected by util_types.go: ytypes.yangToJSONType + log.Info("Yenum/Ystring/Yunion(having all members as strings) type for yangXpath ", fldXpath) + res = dbFldVal + case yang.Yempty: + logStr := fmt.Sprintf("Yang data type for xpath %v is Yempty.", fldXpath) + log.Error(logStr) + err = errors.New(logStr) + default: + logStr := fmt.Sprintf("Unrecognized/Unhandled yang-data type(%v) for xpath %v.", fldXpath, yang.TypeKindToName[yngTerminalNdDtType]) + log.Error(logStr) + err = errors.New(logStr) + } + return res, err +} + +/*convert leaf-list in Db to leaf-list in yang*/ +func processLfLstDbToYang(fieldXpath string, dbFldVal string) []interface{} { + valLst := strings.Split(dbFldVal, ",") + var resLst []interface{} + const INTBASE = 10 + yngTerminalNdDtType := xDbSpecMap[fieldXpath].dbEntry.Type.Kind + switch yngTerminalNdDtType { + case yang.Yenum, yang.Ystring, yang.Yunion, yang.Yleafref: + // TODO handle leaf-ref base type + log.Info("DB leaf-list and Yang leaf-list are of same data-type") + for _, fldVal := range valLst { + resLst = append(resLst, fldVal) + } + default: + for _, fldVal := range valLst { + resVal, err := DbToYangType(yngTerminalNdDtType, fieldXpath, fldVal) + if err == nil { + resLst = append(resLst, resVal) + } + } + } + return resLst +} + +func sonicDbToYangTerminalNodeFill(tblName string, field string, value string, resultMap map[string]interface{}) { + resField := field + if len(value) == 0 { + return + } + if strings.HasSuffix(field, "@") { + fldVals := strings.Split(field, "@") + resField = fldVals[0] + } + fieldXpath := tblName + "/" + resField + xDbSpecMapEntry, ok := xDbSpecMap[fieldXpath] + if !ok { + log.Warningf("No entry found in xDbSpecMap for xpath %v", fieldXpath) + return + } + if xDbSpecMapEntry.dbEntry == nil { + log.Warningf("Yang entry is nil in xDbSpecMap for xpath %v", fieldXpath) + return + } + + yangType := yangTypeGet(xDbSpecMapEntry.dbEntry) + if yangType == YANG_LEAF_LIST { + /* this should never happen but just adding for safetty */ + if !strings.HasSuffix(field, "@") { + log.Warningf("Leaf-list in Sonic yang should also be a leaf-list in DB, its not for xpath %v", fieldXpath) + return + } + resLst := processLfLstDbToYang(fieldXpath, value) + resultMap[resField] = resLst + } else { /* yangType is leaf - there are only 2 types of yang terminal node leaf and leaf-list */ + yngTerminalNdDtType := xDbSpecMapEntry.dbEntry.Type.Kind + resVal, err := DbToYangType(yngTerminalNdDtType, fieldXpath, value) + if err != nil { + log.Warningf("Failure in converting Db value type to yang type for xpath", fieldXpath) + } else { + resultMap[resField] = resVal + } + } + return +} + +func sonicDbToYangListFill(uri string, xpath string, dbIdx db.DBNum, table string, key string, dbDataMap *map[db.DBNum]map[string]map[string]db.Value) []typeMapOfInterface { + var mapSlice []typeMapOfInterface + dbTblData := (*dbDataMap)[dbIdx][table] + + for keyStr, _ := range dbTblData { + curMap := make(map[string]interface{}) + sonicDbToYangDataFill(uri, xpath, dbIdx, table, keyStr, dbDataMap, curMap) + dbSpecData, ok := xDbSpecMap[table] + if ok && dbSpecData.keyName == nil { + yangKeys := yangKeyFromEntryGet(xDbSpecMap[xpath].dbEntry) + sonicKeyDataAdd(dbIdx, yangKeys, keyStr, curMap) + } + if curMap != nil { + mapSlice = append(mapSlice, curMap) + } + } + return mapSlice +} + +func sonicDbToYangDataFill(uri string, xpath string, dbIdx db.DBNum, table string, key string, dbDataMap *map[db.DBNum]map[string]map[string]db.Value, resultMap map[string]interface{}) { + yangNode, ok := xDbSpecMap[xpath] + + if ok && yangNode.dbEntry != nil { + xpathPrefix := table + if len(table) > 0 { xpathPrefix += "/" } + + for yangChldName := range yangNode.dbEntry.Dir { + chldXpath := xpathPrefix+yangChldName + if xDbSpecMap[chldXpath] != nil && xDbSpecMap[chldXpath].dbEntry != nil { + chldYangType := yangTypeGet(xDbSpecMap[chldXpath].dbEntry) + + if chldYangType == YANG_LEAF || chldYangType == YANG_LEAF_LIST { + log.Infof("tbl(%v), k(%v), yc(%v)", table, key, yangChldName) + fldName := yangChldName + if chldYangType == YANG_LEAF_LIST { + fldName = fldName + "@" + } + sonicDbToYangTerminalNodeFill(table, fldName, (*dbDataMap)[dbIdx][table][key].Field[fldName], resultMap) + } else if chldYangType == YANG_CONTAINER { + curMap := make(map[string]interface{}) + curUri := xpath + "/" + yangChldName + // container can have a static key, so extract key for current container + _, curKey, curTable := sonicXpathKeyExtract(curUri) + // use table-name as xpath from now on + sonicDbToYangDataFill(curUri, curTable, xDbSpecMap[curTable].dbIndex, curTable, curKey, dbDataMap, curMap) + if len(curMap) > 0 { + resultMap[yangChldName] = curMap + } else { + log.Infof("Empty container for xpath(%v)", curUri) + } + } else if chldYangType == YANG_LIST { + var mapSlice []typeMapOfInterface + curUri := xpath + "/" + yangChldName + mapSlice = sonicDbToYangListFill(curUri, curUri, dbIdx, table, key, dbDataMap) + if len(key) > 0 && len(mapSlice) == 1 {// Single instance query. Don't return array of maps + for k, val := range mapSlice[0] { + resultMap[k] = val + } + + } else if len(mapSlice) > 0 { + resultMap[yangChldName] = mapSlice + } else { + log.Infof("Empty list for xpath(%v)", curUri) + } + } + } + } + } + return +} + +/* Traverse db map and create json for cvl yang */ +func directDbToYangJsonCreate(uri string, dbDataMap *map[db.DBNum]map[string]map[string]db.Value, resultMap map[string]interface{}) (string, error) { + xpath, key, table := sonicXpathKeyExtract(uri) + + if len(xpath) > 0 { + var dbNode *dbInfo + + if len(table) > 0 { + tokens:= strings.Split(xpath, "/") + if tokens[SONIC_TABLE_INDEX] == table { + fieldName := tokens[len(tokens)-1] + dbSpecField := table + "/" + fieldName + _, ok := xDbSpecMap[dbSpecField] + if ok && (xDbSpecMap[dbSpecField].fieldType == YANG_LEAF || xDbSpecMap[dbSpecField].fieldType == YANG_LEAF_LIST) { + dbNode = xDbSpecMap[dbSpecField] + xpath = dbSpecField + } else { + dbNode = xDbSpecMap[table] + } + } + } else { + dbNode, _ = xDbSpecMap[xpath] + } + + if dbNode != nil && dbNode.dbEntry != nil { + cdb := db.ConfigDB + yangType := yangTypeGet(dbNode.dbEntry) + if len(table) > 0 { + cdb = xDbSpecMap[table].dbIndex + } + + if yangType == YANG_LEAF || yangType == YANG_LEAF_LIST { + fldName := xDbSpecMap[xpath].dbEntry.Name + if yangType == YANG_LEAF_LIST { + fldName = fldName + "@" + } + sonicDbToYangTerminalNodeFill(table, fldName, (*dbDataMap)[cdb][table][key].Field[fldName], resultMap) + } else if yangType == YANG_CONTAINER { + if len(table) > 0 { + xpath = table + } + sonicDbToYangDataFill(uri, xpath, cdb, table, key, dbDataMap, resultMap) + } else if yangType == YANG_LIST { + mapSlice := sonicDbToYangListFill(uri, xpath, cdb, table, key, dbDataMap) + if len(key) > 0 && len(mapSlice) == 1 {// Single instance query. Don't return array of maps + for k, val := range mapSlice[0] { + resultMap[k] = val + } + + } else if len(mapSlice) > 0 { + pathl := strings.Split(xpath, "/") + lname := pathl[len(pathl) - 1] + resultMap[lname] = mapSlice + } + } + } + } + + jsonMapData, _ := json.Marshal(resultMap) + jsonData := fmt.Sprintf("%v", string(jsonMapData)) + jsonDataPrint(jsonData) + return jsonData, nil +} + +func tableNameAndKeyFromDbMapGet(dbDataMap map[string]map[string]db.Value) (string, string, error) { + tableName := "" + tableKey := "" + for tn, tblData := range dbDataMap { + tableName = tn + for kname, _ := range tblData { + tableKey = kname + } + } + return tableName, tableKey, nil +} + +func fillDbDataMapForTbl(uri string, xpath string, tblName string, tblKey string, cdb db.DBNum, dbs [db.MaxDB]*db.DB) (map[db.DBNum]map[string]map[string]db.Value, error) { + var err error + dbresult := make(map[db.DBNum]map[string]map[string]db.Value) + dbresult[cdb] = make(map[string]map[string]db.Value) + dbFormat := KeySpec{} + dbFormat.Ts.Name = tblName + dbFormat.dbNum = cdb + if tblKey != "" { + dbFormat.Key.Comp = append(dbFormat.Key.Comp, tblKey) + } + err = TraverseDb(dbs, dbFormat, &dbresult, nil) + if err != nil { + log.Errorf("TraverseDb() failure for tbl(DB num) %v(%v) for xpath %v", tblName, cdb, xpath) + return nil, err + } + if _, ok := dbresult[cdb]; !ok { + logStr := fmt.Sprintf("TraverseDb() did not populate Db data for tbl(DB num) %v(%v) for xpath %v", tblName, cdb, xpath) + err = fmt.Errorf("%v", logStr) + return nil, err + } + return dbresult, err + +} + +// Assumption: All tables are from the same DB +func dbDataFromTblXfmrGet(tbl string, inParams XfmrParams, dbDataMap *map[db.DBNum]map[string]map[string]db.Value) error { + xpath, _ := XfmrRemoveXPATHPredicates(inParams.uri) + curDbDataMap, err := fillDbDataMapForTbl(inParams.uri, xpath, tbl, inParams.key, inParams.curDb, inParams.dbs) + if err == nil { + mapCopy((*dbDataMap)[inParams.curDb], curDbDataMap[inParams.curDb]) + } + return nil +} + +func yangListDataFill(dbs [db.MaxDB]*db.DB, ygRoot *ygot.GoStruct, uri string, xpath string, dbDataMap *map[db.DBNum]map[string]map[string]db.Value, resultMap map[string]interface{}, tbl string, tblKey string, cdb db.DBNum, validate bool) error { + var tblList []string + + if tbl == "" && xYangSpecMap[xpath].xfmrTbl != nil { + xfmrTblFunc := *xYangSpecMap[xpath].xfmrTbl + if len(xfmrTblFunc) > 0 { + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, uri, GET, tblKey, dbDataMap, nil) + tblList = xfmrTblHandlerFunc(xfmrTblFunc, inParams) + if len(tblList) != 0 { + for _, curTbl := range tblList { + dbDataFromTblXfmrGet(curTbl, inParams, dbDataMap) + } + } + } + } else if tbl != "" && xYangSpecMap[xpath].xfmrTbl == nil { + tblList = append(tblList, tbl) + } else if tbl != "" && xYangSpecMap[xpath].xfmrTbl != nil { + /*key instance level GET, table name and table key filled from xpathKeyExtract which internally calls table transformer*/ + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, uri, GET, tblKey, dbDataMap, nil) + dbDataFromTblXfmrGet(tbl, inParams, dbDataMap) + tblList = append(tblList, tbl) + + } + + for _, tbl = range(tblList) { + tblData, ok := (*dbDataMap)[cdb][tbl] + + if ok { + var mapSlice []typeMapOfInterface + for dbKey, _ := range tblData { + curMap := make(map[string]interface{}) + curKeyMap, curUri, _ := dbKeyToYangDataConvert(uri, xpath, dbKey, dbs[cdb].Opts.KeySeparator) + if len(xYangSpecMap[xpath].xfmrFunc) > 0 { + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, curUri, GET, "", dbDataMap, nil) + cmap, _ := xfmrHandlerFunc(inParams) + if cmap != nil && len(cmap) > 0 { + mapSlice = append(mapSlice, curMap) + } else { + log.Infof("Empty container returned from overloaded transformer for(\"%v\")", curUri) + } + } else { + _, keyFromCurUri, _ := xpathKeyExtract(dbs[cdb], ygRoot, GET, curUri) + if dbKey == keyFromCurUri { + for k, kv := range curKeyMap { + curMap[k] = kv + } + curXpath, _ := XfmrRemoveXPATHPredicates(curUri) + yangDataFill(dbs, ygRoot, curUri, curXpath, dbDataMap, curMap, tbl, dbKey, cdb, validate) + mapSlice = append(mapSlice, curMap) + } + } + } + if len(mapSlice) > 0 { + resultMap[xYangSpecMap[xpath].yangEntry.Name] = mapSlice + } else { + log.Infof("Empty slice for (\"%v\").\r\n", uri) + } + } + }// end of tblList for + return nil +} + +func terminalNodeProcess(dbs [db.MaxDB]*db.DB, ygRoot *ygot.GoStruct, uri string, xpath string, dbDataMap *map[db.DBNum]map[string]map[string]db.Value, tbl string, tblKey string) (map[string]interface{}, error) { + log.Infof("Received xpath - %v, uri - %v, table - %v, table key - %v", xpath, uri, tbl, tblKey) + var err error + resFldValMap := make(map[string]interface{}) + if xYangSpecMap[xpath].yangEntry == nil { + logStr := fmt.Sprintf("No yang entry found for xpath %v.", xpath) + err = fmt.Errorf("%v", logStr) + return resFldValMap, err + } + + cdb := xYangSpecMap[xpath].dbIndex + if len(xYangSpecMap[xpath].xfmrFunc) > 0 { + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, uri, GET, tblKey, dbDataMap, nil) + fldValMap, err := leafXfmrHandlerFunc(inParams) + if err != nil { + logStr := fmt.Sprintf("%Failed to get data from overloaded function for %v -v.", uri, err) + err = fmt.Errorf("%v", logStr) + return resFldValMap, err + } + if fldValMap != nil { + for lf, val := range fldValMap { + resFldValMap[lf] = val + } + } + } else { + dbFldName := xYangSpecMap[xpath].fieldName + if dbFldName == "NONE" { + return resFldValMap, err + } + /* if there is no transformer extension/annotation then it means leaf-list in yang is also leaflist in db */ + if len(dbFldName) > 0 && !xYangSpecMap[xpath].isKey { + yangType := yangTypeGet(xYangSpecMap[xpath].yangEntry) + if yangType == YANG_LEAF_LIST { + dbFldName += "@" + val, ok := (*dbDataMap)[cdb][tbl][tblKey].Field[dbFldName] + if ok { + resLst := processLfLstDbToYang(xpath, val) + resFldValMap[xYangSpecMap[xpath].yangEntry.Name] = resLst + } + } else { + val, ok := (*dbDataMap)[cdb][tbl][tblKey].Field[dbFldName] + if ok { + yngTerminalNdDtType := xYangSpecMap[xpath].yangEntry.Type.Kind + resVal, err := DbToYangType(yngTerminalNdDtType, xpath, val) + if err != nil { + log.Error("Failure in converting Db value type to yang type for field", xpath) + } else { + resFldValMap[xYangSpecMap[xpath].yangEntry.Name] = resVal + } + } + } + } + } + return resFldValMap, err +} + +func yangDataFill(dbs [db.MaxDB]*db.DB, ygRoot *ygot.GoStruct, uri string, xpath string, dbDataMap *map[db.DBNum]map[string]map[string]db.Value, resultMap map[string]interface{}, tbl string, tblKey string, cdb db.DBNum, validate bool) error { + var err error + isValid := validate + yangNode, ok := xYangSpecMap[xpath] + + if ok && yangNode.yangEntry != nil { + for yangChldName := range yangNode.yangEntry.Dir { + chldXpath := xpath+"/"+yangChldName + chldUri := uri+"/"+yangChldName + if xYangSpecMap[chldXpath] != nil && xYangSpecMap[chldXpath].yangEntry != nil { + cdb = xYangSpecMap[chldXpath].dbIndex + if len(xYangSpecMap[chldXpath].validateFunc) > 0 && !validate { + _, key, _ := xpathKeyExtract(dbs[cdb], ygRoot, GET, chldUri) + // TODO - handle non CONFIG-DB + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, chldUri, GET, key, dbDataMap, nil) + res := validateHandlerFunc(inParams) + if res != true { + continue + } else { + isValid = res + } + } + chldYangType := yangTypeGet(xYangSpecMap[chldXpath].yangEntry) + if chldYangType == YANG_LEAF || chldYangType == YANG_LEAF_LIST { + fldValMap, err := terminalNodeProcess(dbs, ygRoot, chldUri, chldXpath, dbDataMap, tbl, tblKey) + if err != nil { + log.Infof("Failed to get data(\"%v\").", chldUri) + } + for lf, val := range fldValMap { + resultMap[lf] = val + } + } else if chldYangType == YANG_CONTAINER { + cname := xYangSpecMap[chldXpath].yangEntry.Name + if xYangSpecMap[chldXpath].xfmrTbl != nil { + xfmrTblFunc := *xYangSpecMap[chldXpath].xfmrTbl + if len(xfmrTblFunc) > 0 { + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, chldUri, GET, tblKey, dbDataMap, nil) + tblList := xfmrTblHandlerFunc(xfmrTblFunc, inParams) + if len(tblList) > 1 { + log.Warningf("Table transformer returned more than one table for container %v", chldXpath) + } + if len(tblList) == 0 { + continue + } + dbDataFromTblXfmrGet(tblList[0], inParams, dbDataMap) + tbl = tblList[0] + } + } + if len(xYangSpecMap[chldXpath].xfmrFunc) > 0 { + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, chldUri, GET, "", dbDataMap, nil) + cmap, _ := xfmrHandlerFunc(inParams) + if cmap != nil && len(cmap) > 0 { + resultMap[cname] = cmap + } else { + log.Infof("Empty container(\"%v\").\r\n", chldUri) + } + continue + } else { + cmap := make(map[string]interface{}) + err = yangDataFill(dbs, ygRoot, chldUri, chldXpath, dbDataMap, cmap, tbl, tblKey, cdb, isValid) + if len(cmap) > 0 { + resultMap[cname] = cmap + } else { + log.Infof("Empty container(\"%v\").\r\n", chldUri) + } + } + } else if chldYangType == YANG_LIST { + cdb = xYangSpecMap[chldXpath].dbIndex + if len(xYangSpecMap[chldXpath].xfmrFunc) > 0 { + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, chldUri, GET, "", dbDataMap, nil) + cmap, _ := xfmrHandlerFunc(inParams) + if cmap != nil && len(cmap) > 0 { + resultMap = cmap + } else { + log.Infof("Empty list(\"%v\").\r\n", chldUri) + } + } else { + ynode, ok := xYangSpecMap[chldXpath] + lTblName := "" + if ok && ynode.tableName != nil { + lTblName = *ynode.tableName + } + yangListDataFill(dbs, ygRoot, chldUri, chldXpath, dbDataMap, resultMap, lTblName, "", cdb, isValid) + } + } else { + return err + } + } + } + } + return err +} + +/* Traverse linear db-map data and add to nested json data */ +func dbDataToYangJsonCreate(uri string, ygRoot *ygot.GoStruct, dbs [db.MaxDB]*db.DB, dbDataMap *map[db.DBNum]map[string]map[string]db.Value, cdb db.DBNum) (string, error) { + var err error + jsonData := "" + resultMap := make(map[string]interface{}) + if isSonicYang(uri) { + return directDbToYangJsonCreate(uri, dbDataMap, resultMap) + } else { + var d *db.DB + reqXpath, keyName, tableName := xpathKeyExtract(d, ygRoot, GET, uri) + yangNode, ok := xYangSpecMap[reqXpath] + if ok { + yangType := yangTypeGet(yangNode.yangEntry) + validateHandlerFlag := false + tableXfmrFlag := false + IsValidate := false + if len(xYangSpecMap[reqXpath].validateFunc) > 0 { + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, uri, GET, keyName, dbDataMap, nil) + res := validateHandlerFunc(inParams) + if !res { + validateHandlerFlag = true + /* cannot immediately return from here since reXpath yangtype decides the return type */ + } else { + IsValidate = res + } + } + isList := false + switch yangType { + case YANG_LIST: + isList = true + case YANG_LEAF, YANG_LEAF_LIST, YANG_CONTAINER: + isList = false + default: + log.Infof("Unknown yang object type for path %v", reqXpath) + isList = true //do not want non-list processing to happen + } + /*If yangtype is a list separate code path is to be taken in case of table transformer + since that code path already handles the calling of table transformer and subsequent processing + */ + if (!validateHandlerFlag) && (!isList) { + if xYangSpecMap[reqXpath].xfmrTbl != nil { + xfmrTblFunc := *xYangSpecMap[reqXpath].xfmrTbl + if len(xfmrTblFunc) > 0 { + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, uri, GET, keyName, dbDataMap, nil) + tblList := xfmrTblHandlerFunc(xfmrTblFunc, inParams) + if len(tblList) > 1 { + log.Warningf("Table transformer returned more than one table for container %v", reqXpath) + tableXfmrFlag = true + } + if len(tblList) == 0 { + log.Warningf("Table transformer returned no table for conatiner %v", reqXpath) + tableXfmrFlag = true + } + if !tableXfmrFlag { + dbDataFromTblXfmrGet(tblList[0], inParams, dbDataMap) + } + } else { + log.Warningf("empty table transformer function name for xpath - %v", reqXpath) + tableXfmrFlag = true + } + } + } + + for { + if yangType == YANG_LEAF || yangType == YANG_LEAF_LIST { + yangName := xYangSpecMap[reqXpath].yangEntry.Name + if validateHandlerFlag || tableXfmrFlag { + resultMap[yangName] = "" + break + } + tbl, key, _ := tableNameAndKeyFromDbMapGet((*dbDataMap)[cdb]) + fldValMap, err := terminalNodeProcess(dbs, ygRoot, uri, reqXpath, dbDataMap, tbl, key) + if err != nil { + log.Infof("Empty terminal node (\"%v\").", uri) + } + resultMap = fldValMap + break + + } else if yangType == YANG_CONTAINER { + cname := xYangSpecMap[reqXpath].yangEntry.Name + cmap := make(map[string]interface{}) + resultMap[cname] = cmap + if validateHandlerFlag || tableXfmrFlag { + break + } + if len(xYangSpecMap[reqXpath].xfmrFunc) > 0 { + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, uri, GET, "", dbDataMap, nil) + cmap, _ = xfmrHandlerFunc(inParams) + if cmap != nil && len(cmap) > 0 { + resultMap[cname] = cmap + } + break + } + err = yangDataFill(dbs, ygRoot, uri, reqXpath, dbDataMap, resultMap, tableName, keyName, cdb, IsValidate) + if err != nil { + log.Infof("Empty container(\"%v\").\r\n", uri) + } + break + } else if yangType == YANG_LIST { + if len(xYangSpecMap[reqXpath].xfmrFunc) > 0 { + inParams := formXfmrInputRequest(dbs[cdb], dbs, cdb, ygRoot, uri, GET, "", dbDataMap, nil) + cmap, _ := xfmrHandlerFunc(inParams) + if cmap != nil && len(cmap) > 0 { + resultMap = cmap + } else { + log.Infof("Empty list(\"%v\").\r\n", uri) + } + } else { + err = yangListDataFill(dbs, ygRoot, uri, reqXpath, dbDataMap, resultMap, tableName, keyName, cdb, IsValidate) + if err != nil { + log.Infof("yangListDataFill failed for list case(\"%v\").\r\n", uri) + } + } + break + } else { + log.Warningf("Unknown yang object type for path %v", reqXpath) + break + } + } //end of for + } + } + + jsonMapData, _ := json.Marshal(resultMap) + jsonData = fmt.Sprintf("%v", string(jsonMapData)) + jsonDataPrint(jsonData) + return jsonData, nil +} + +func jsonDataPrint(data string) { + fp, err := os.Create("/tmp/dbToYangJson.txt") + if err != nil { + return + } + defer fp.Close() + + fmt.Fprintf (fp, "-----------------------------------------------------------------\r\n") + fmt.Fprintf (fp, "%v \r\n", data) + fmt.Fprintf (fp, "-----------------------------------------------------------------\r\n") +} + diff --git a/src/translib/transformer/xlate_to_db.go b/src/translib/transformer/xlate_to_db.go new file mode 100644 index 0000000000..7ee22a6b33 --- /dev/null +++ b/src/translib/transformer/xlate_to_db.go @@ -0,0 +1,565 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Dell, Inc. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package transformer + +import ( + "errors" + "fmt" + "github.com/openconfig/ygot/ygot" + "os" + "reflect" + "strings" + "translib/db" + "translib/ocbinds" + "github.com/openconfig/ygot/ytypes" + "github.com/openconfig/goyang/pkg/yang" + + log "github.com/golang/glog" +) + +/* Invoke the post tansformer */ +func postXfmrHandlerFunc(inParams XfmrParams) (map[string]map[string]db.Value, error) { + xpath, _ := XfmrRemoveXPATHPredicates(inParams.uri) + ret, err := XlateFuncCall(xYangSpecMap[xpath].xfmrPost, inParams) + if err != nil { + return nil, err + } + retData := ret[0].Interface().(map[string]map[string]db.Value) + log.Info("Post Transformer function :", xYangSpecMap[xpath].xfmrPost, " Xpath: ", xpath, " retData: ", retData) + return retData, err +} + +/* Fill redis-db map with field & value info */ +func dataToDBMapAdd(tableName string, dbKey string, result map[string]map[string]db.Value, field string, value string) { + _, ok := result[tableName] + if !ok { + result[tableName] = make(map[string]db.Value) + } + + _, ok = result[tableName][dbKey] + if !ok { + result[tableName][dbKey] = db.Value{Field: make(map[string]string)} + } + + if field == "NONE" { + result[tableName][dbKey].Field["NULL"] = "NULL" + return + } + + result[tableName][dbKey].Field[field] = value + return +} + +func tblNameFromTblXfmrGet(xfmrTblFunc string, inParams XfmrParams) (string, error){ + tblList := xfmrTblHandlerFunc(xfmrTblFunc, inParams) + if len(tblList) != 1 { + logStr := fmt.Sprintf("Invalid return value(%v) from table transformer for (%v)", tblList, inParams.uri) + log.Error(logStr) + err := errors.New(logStr) + return "", err + } + return tblList[0], nil +} + +/* Fill the redis-db map with data */ +func mapFillData(d *db.DB, ygRoot *ygot.GoStruct, oper int, uri string, dbKey string, result map[string]map[string]db.Value, xpathPrefix string, name string, value interface{}) error { + var dbs [db.MaxDB]*db.DB + var err error + xpath := xpathPrefix + "/" + name + xpathInfo, ok := xYangSpecMap[xpath] + log.Infof("name: \"%v\", xpathPrefix(\"%v\").", name, xpathPrefix) + + if !ok || xpathInfo == nil { + log.Errorf("Yang path(\"%v\") not found.", xpath) + return errors.New("Invalid URI") + } + + if xpathInfo.tableName == nil && xpathInfo.xfmrTbl == nil{ + log.Errorf("Table for yang-path(\"%v\") not found.", xpath) + return errors.New("Invalid table name") + } + + if len(dbKey) == 0 { + log.Errorf("Table key for yang path(\"%v\") not found.", xpath) + return errors.New("Invalid table key") + } + + if xpathInfo.isKey { + return nil + } + + tableName := "" + if xpathInfo.xfmrTbl != nil { + inParams := formXfmrInputRequest(d, dbs, db.MaxDB, ygRoot, uri, oper, "", nil, "") + // expecting only one table name from tbl-xfmr + tableName, err = tblNameFromTblXfmrGet(*xYangSpecMap[xpath].xfmrTbl, inParams) + if err != nil { + return err + } + } else { + tableName = *xpathInfo.tableName + } + + if len(xpathInfo.xfmrFunc) > 0 { + uri = uri + "/" + name + + /* field transformer present */ + log.Infof("Transformer function(\"%v\") invoked for yang path(\"%v\").", xpathInfo.xfmrFunc, xpath) + path, _ := ygot.StringToPath(uri, ygot.StructuredPath, ygot.StringSlicePath) + for _, p := range path.Elem { + pathSlice := strings.Split(p.Name, ":") + p.Name = pathSlice[len(pathSlice)-1] + if len(p.Key) > 0 { + for ekey, ent := range p.Key { + eslice := strings.Split(ent, ":") + p.Key[ekey] = eslice[len(eslice)-1] + } + } + } + ocbSch, _ := ocbinds.Schema() + schRoot := ocbSch.RootSchema() + node, nErr := ytypes.GetNode(schRoot, (*ygRoot).(*ocbinds.Device), path) + log.Info("GetNode data: ", node[0].Data, " nErr :", nErr) + if nErr != nil { + return nErr + } + inParams := formXfmrInputRequest(d, dbs, db.MaxDB, ygRoot, uri, oper, "", nil, node[0].Data) + ret, err := XlateFuncCall(yangToDbXfmrFunc(xYangSpecMap[xpath].xfmrFunc), inParams) + if err != nil { + return err + } + if ret != nil { + retData := ret[0].Interface().(map[string]string) + log.Info("Transformer function :", xpathInfo.xfmrFunc, " Xpath: ", xpath, " retData: ", retData) + for f, v := range retData { + dataToDBMapAdd(tableName, dbKey, result, f, v) + } + } + return nil + } + + if len(xpathInfo.fieldName) == 0 { + log.Infof("Field for yang-path(\"%v\") not found in DB.", xpath) + return errors.New("Invalid field name") + } + fieldName := xpathInfo.fieldName + valueStr := "" + if xpathInfo.yangEntry.IsLeafList() { + /* Both yang side and Db side('@' suffix field) the data type is leaf-list */ + log.Info("Yang type and Db type is Leaflist for field = ", xpath) + fieldName += "@" + if reflect.ValueOf(value).Kind() != reflect.Slice { + logStr := fmt.Sprintf("Value for yang xpath %v which is a leaf-list should be a slice", xpath) + log.Error(logStr) + err := errors.New(logStr) + return err + } + valData := reflect.ValueOf(value) + for fidx := 0; fidx < valData.Len(); fidx++ { + if fidx > 0 { + valueStr += "," + } + fVal := fmt.Sprintf("%v", valData.Index(fidx).Interface()) + valueStr = valueStr + fVal + } + log.Infof("leaf-list value after conversion to DB format %v : %v", fieldName, valueStr) + + } else { // xpath is a leaf + valueStr = fmt.Sprintf("%v", value) + if strings.Contains(valueStr, ":") { + valueStr = strings.Split(valueStr, ":")[1] + } + } + + dataToDBMapAdd(tableName, dbKey, result, fieldName, valueStr) + log.Infof("TblName: \"%v\", key: \"%v\", field: \"%v\", valueStr: \"%v\".", tableName, dbKey, + fieldName, valueStr) + return nil +} + +func sonicYangReqToDbMapCreate(jsonData interface{}, result map[string]map[string]db.Value) error { + if reflect.ValueOf(jsonData).Kind() == reflect.Map { + data := reflect.ValueOf(jsonData) + for _, key := range data.MapKeys() { + _, ok := xDbSpecMap[key.String()] + if ok { + directDbMapData("", key.String(), data.MapIndex(key).Interface(), result) + } else { + sonicYangReqToDbMapCreate(data.MapIndex(key).Interface(), result) + } + } + } + return nil +} + +func dbMapDataFill(uri string, tableName string, keyName string, d map[string]interface{}, result map[string]map[string]db.Value) { + result[tableName][keyName] = db.Value{Field: make(map[string]string)} + for field, value := range d { + fieldXpath := tableName + "/" + field + if _, fieldOk := xDbSpecMap[fieldXpath]; (fieldOk && (xDbSpecMap[fieldXpath].dbEntry != nil)) { + log.Info("Found non-nil yang entry in xDbSpecMap for field xpath = ", fieldXpath) + if xDbSpecMap[fieldXpath].dbEntry.IsLeafList() { + log.Info("Yang type is Leaflist for field = ", field) + field += "@" + fieldDt := reflect.ValueOf(value) + fieldValue := "" + for fidx := 0; fidx < fieldDt.Len(); fidx++ { + if fidx > 0 { + fieldValue += "," + } + fVal := fmt.Sprintf("%v", fieldDt.Index(fidx).Interface()) + fieldValue = fieldValue + fVal + } + result[tableName][keyName].Field[field] = fieldValue + continue + } + } else { + // should ideally never happen , just adding for safety + log.Info("Did not find entry in xDbSpecMap for field xpath = ", fieldXpath) + } + result[tableName][keyName].Field[field] = fmt.Sprintf("%v", value) + } + return +} + +func dbMapListDataFill(uri string, tableName string, dbEntry *yang.Entry, jsonData interface{}, result map[string]map[string]db.Value) { + data := reflect.ValueOf(jsonData) + tblKeyName := strings.Split(dbEntry.Key, " ") + for idx := 0; idx < data.Len(); idx++ { + keyName := "" + d := data.Index(idx).Interface().(map[string]interface{}) + for i, k := range tblKeyName { + if i > 0 { + keyName += "|" + } + keyName += fmt.Sprintf("%v", d[k]) + delete(d, k) + } + dbMapDataFill(uri, tableName, keyName, d, result) + } + return +} + +func directDbMapData(uri string, tableName string, jsonData interface{}, result map[string]map[string]db.Value) bool { + _, ok := xDbSpecMap[tableName] + if ok && xDbSpecMap[tableName].dbEntry != nil { + data := reflect.ValueOf(jsonData).Interface().(map[string]interface{}) + key := "" + dbSpecData := xDbSpecMap[tableName] + result[tableName] = make(map[string]db.Value) + + if dbSpecData.keyName != nil { + key = *dbSpecData.keyName + log.Infof("Fill data for container uri(%v), key(%v)", uri, key) + dbMapDataFill(uri, tableName, key, data, result) + return true + } + + for k, v := range data { + xpath := tableName + "/" + k + curDbSpecData, ok := xDbSpecMap[xpath] + if ok && curDbSpecData.dbEntry != nil { + eType := yangTypeGet(curDbSpecData.dbEntry) + switch eType { + case "list": + log.Infof("Fill data for list uri(%v)", uri) + dbMapListDataFill(uri, tableName, curDbSpecData.dbEntry, v, result) + default: + log.Infof("Invalid node type for uri(%v)", uri) + } + } + } + } + return true +} + +/* Get the db table, key and field name for the incoming delete request */ +func dbMapDelete(d *db.DB, ygRoot *ygot.GoStruct, oper int, path string, jsonData interface{}, result map[string]map[string]db.Value) error { + var err error + if isSonicYang(path) { + xpathPrefix, keyName, tableName := sonicXpathKeyExtract(path) + log.Infof("Delete req: path(\"%v\"), key(\"%v\"), xpathPrefix(\"%v\"), tableName(\"%v\").", path, keyName, xpathPrefix, tableName) + err = sonicYangReqToDbMapDelete(xpathPrefix, tableName, keyName, result) + } else { + xpathPrefix, keyName, tableName := xpathKeyExtract(d, ygRoot, oper, path) + log.Infof("Delete req: path(\"%v\"), key(\"%v\"), xpathPrefix(\"%v\"), tableName(\"%v\").", path, keyName, xpathPrefix, tableName) + spec, ok := xYangSpecMap[xpathPrefix] + if ok { + if spec.tableName != nil { + result[*spec.tableName] = make(map[string]db.Value) + if len(keyName) > 0 { + result[*spec.tableName][keyName] = db.Value{Field: make(map[string]string)} + if spec.yangEntry != nil && spec.yangEntry.Node.Statement().Keyword == "leaf" { + result[*spec.tableName][keyName].Field[spec.fieldName] = "" + } + } + } else if len(spec.childTable) > 0 { + for _, child := range spec.childTable { + result[child] = make(map[string]db.Value) + } + } + } + } + log.Infof("Delete req: path(\"%v\") result(\"%v\").", path, result) + return err +} + +func sonicYangReqToDbMapDelete(xpathPrefix string, tableName string, keyName string, result map[string]map[string]db.Value) error { + if (tableName != "") { + // Specific table entry case + result[tableName] = make(map[string]db.Value) + if (keyName != "") { + // Specific key case + var dbVal db.Value + tokens:= strings.Split(xpathPrefix, "/") + if tokens[SONIC_TABLE_INDEX] == tableName { + fieldName := tokens[len(tokens)-1] + dbSpecField := tableName + "/" + fieldName + _, ok := xDbSpecMap[dbSpecField] + if ok { + yangType := xDbSpecMap[dbSpecField].fieldType + // terminal node case + if yangType == YANG_LEAF_LIST { + fieldName = fieldName + "@" + dbVal.Field = make(map[string]string) + dbVal.Field[fieldName] = "" + } + if yangType == YANG_LEAF { + dbVal.Field = make(map[string]string) + dbVal.Field[fieldName] = "" + } + } + } + result[tableName][keyName] = dbVal + } else { + // Get all keys + } + } else { + // Get all table entries + // If table name not available in xpath get top container name + _, ok := xDbSpecMap[xpathPrefix] + if ok && xDbSpecMap[xpathPrefix] != nil { + dbInfo := xDbSpecMap[xpathPrefix] + if dbInfo.fieldType == "container" { + for dir, _ := range dbInfo.dbEntry.Dir { + result[dir] = make(map[string]db.Value) + } + } + } + } + return nil +} + +/* Get the data from incoming update/replace request, create map and fill with dbValue(ie. field:value to write into redis-db */ +func dbMapUpdate(d *db.DB, ygRoot *ygot.GoStruct, oper int, path string, jsonData interface{}, result map[string]map[string]db.Value) error { + log.Infof("Update/replace req: path(\"%v\").", path) + dbMapCreate(d, ygRoot, oper, path, jsonData, result) + log.Infof("Update/replace req: path(\"%v\") result(\"%v\").", path, result) + printDbData(result, "/tmp/yangToDbDataUpRe.txt") + return nil +} + +/* Get the data from incoming create request, create map and fill with dbValue(ie. field:value to write into redis-db */ +func dbMapCreate(d *db.DB, ygRoot *ygot.GoStruct, oper int, path string, jsonData interface{}, result map[string]map[string]db.Value) error { + var err error + root := xpathRootNameGet(path) + if isSonicYang(path) { + err = sonicYangReqToDbMapCreate(jsonData, result) + } else { + err = yangReqToDbMapCreate(d, ygRoot, oper, root, "", "", jsonData, result) + } + if err == nil { + if oper == CREATE { + moduleNm := "/" + strings.Split(path, "/")[1] + log.Infof("Module name for path %s is %s", path, moduleNm) + if _, ok := xYangSpecMap[moduleNm]; ok { + if xYangSpecMap[moduleNm].yangDataType == "container" && len(xYangSpecMap[moduleNm].xfmrPost) > 0 { + log.Info("Invoke post transformer: ", xYangSpecMap[moduleNm].xfmrPost) + dbDataMap := make(map[db.DBNum]map[string]map[string]db.Value) + dbDataMap[db.ConfigDB] = result + var dbs [db.MaxDB]*db.DB + inParams := formXfmrInputRequest(d, dbs, db.ConfigDB, ygRoot, path, oper, "", &dbDataMap, nil) + result, err = postXfmrHandlerFunc(inParams) + } + } else { + log.Errorf("No Entry exists for module %s in xYangSpecMap. Unable to process post xfmr (\"%v\") path(\"%v\") error (\"%v\").", oper, path, err) + } + } + printDbData(result, "/tmp/yangToDbDataCreate.txt") + } else { + log.Errorf("DBMapCreate req failed for oper (\"%v\") path(\"%v\") error (\"%v\").", oper, path, err) + } + return err +} + +func yangNodeForUriGet(uri string, ygRoot *ygot.GoStruct) (interface{}, error) { + path, _ := ygot.StringToPath(uri, ygot.StructuredPath, ygot.StringSlicePath) + for _, p := range path.Elem { + pathSlice := strings.Split(p.Name, ":") + p.Name = pathSlice[len(pathSlice)-1] + if len(p.Key) > 0 { + for ekey, ent := range p.Key { + eslice := strings.Split(ent, ":") + p.Key[ekey] = eslice[len(eslice)-1] + } + } + } + ocbSch, _ := ocbinds.Schema() + schRoot := ocbSch.RootSchema() + node, nErr := ytypes.GetNode(schRoot, (*ygRoot).(*ocbinds.Device), path) + if nErr != nil { + return nil, nErr + } + return node[0].Data, nil +} + +func yangReqToDbMapCreate(d *db.DB, ygRoot *ygot.GoStruct, oper int, uri string, xpathPrefix string, keyName string, jsonData interface{}, result map[string]map[string]db.Value) error { + log.Infof("key(\"%v\"), xpathPrefix(\"%v\").", keyName, xpathPrefix) + var dbs [db.MaxDB]*db.DB + + if reflect.ValueOf(jsonData).Kind() == reflect.Slice { + log.Infof("slice data: key(\"%v\"), xpathPrefix(\"%v\").", keyName, xpathPrefix) + jData := reflect.ValueOf(jsonData) + dataMap := make([]interface{}, jData.Len()) + for idx := 0; idx < jData.Len(); idx++ { + dataMap[idx] = jData.Index(idx).Interface() + } + for _, data := range dataMap { + curKey := "" + curUri, _ := uriWithKeyCreate(uri, xpathPrefix, data) + _, ok := xYangSpecMap[xpathPrefix] + if ok && len(xYangSpecMap[xpathPrefix].xfmrKey) > 0 { + /* key transformer present */ + curYgotNode, nodeErr := yangNodeForUriGet(curUri, ygRoot) + if nodeErr != nil { + curYgotNode = nil + } + inParams := formXfmrInputRequest(d, dbs, db.MaxDB, ygRoot, curUri, oper, "", nil, curYgotNode) + ret, err := XlateFuncCall(yangToDbXfmrFunc(xYangSpecMap[xpathPrefix].xfmrKey), inParams) + if err != nil { + return err + } + if ret != nil { + curKey = ret[0].Interface().(string) + } + } else if xYangSpecMap[xpathPrefix].keyName != nil { + curKey = *xYangSpecMap[xpathPrefix].keyName + } else { + curKey = keyCreate(keyName, xpathPrefix, data, d.Opts.KeySeparator) + } + yangReqToDbMapCreate(d, ygRoot, oper, curUri, xpathPrefix, curKey, data, result) + } + } else { + if reflect.ValueOf(jsonData).Kind() == reflect.Map { + jData := reflect.ValueOf(jsonData) + for _, key := range jData.MapKeys() { + typeOfValue := reflect.TypeOf(jData.MapIndex(key).Interface()).Kind() + + log.Infof("slice/map data: key(\"%v\"), xpathPrefix(\"%v\").", keyName, xpathPrefix) + xpath := uri + curUri := uri + curKey := keyName + pathAttr := key.String() + if len(xpathPrefix) > 0 { + if strings.Contains(pathAttr, ":") { + pathAttr = strings.Split(pathAttr, ":")[1] + } + xpath = xpathPrefix + "/" + pathAttr + curUri = uri + "/" + pathAttr + } + _, ok := xYangSpecMap[xpath] + log.Infof("slice/map data: curKey(\"%v\"), xpath(\"%v\"), curUri(\"%v\").", + curKey, xpath, curUri) + if ok && xYangSpecMap[xpath] != nil && len(xYangSpecMap[xpath].xfmrKey) > 0 { + /* key transformer present */ + curYgotNode, nodeErr := yangNodeForUriGet(curUri, ygRoot) + if nodeErr != nil { + curYgotNode = nil + } + inParams := formXfmrInputRequest(d, dbs, db.MaxDB, ygRoot, curUri, oper, "", nil, curYgotNode) + ret, err := XlateFuncCall(yangToDbXfmrFunc(xYangSpecMap[xpath].xfmrKey), inParams) + if err != nil { + return err + } + if ret != nil { + curKey = ret[0].Interface().(string) + } + } else if xYangSpecMap[xpath].keyName != nil { + curKey = *xYangSpecMap[xpath].keyName + } + + if (typeOfValue == reflect.Map || typeOfValue == reflect.Slice) && xYangSpecMap[xpath].yangDataType != "leaf-list" { + if ok && xYangSpecMap[xpath] != nil && len(xYangSpecMap[xpath].xfmrFunc) > 0 { + /* subtree transformer present */ + curYgotNode, nodeErr := yangNodeForUriGet(curUri, ygRoot) + if nodeErr != nil { + curYgotNode = nil + } + inParams := formXfmrInputRequest(d, dbs, db.MaxDB, ygRoot, curUri, oper, "", nil, curYgotNode) + ret, err := XlateFuncCall(yangToDbXfmrFunc(xYangSpecMap[xpath].xfmrFunc), inParams) + if err != nil { + return nil + } + if ret != nil { + mapCopy(result, ret[0].Interface().(map[string]map[string]db.Value)) + } + } else { + yangReqToDbMapCreate(d, ygRoot, oper, curUri, xpath, curKey, jData.MapIndex(key).Interface(), result) + } + } else { + pathAttr := key.String() + if strings.Contains(pathAttr, ":") { + pathAttr = strings.Split(pathAttr, ":")[1] + } + value := jData.MapIndex(key).Interface() + log.Infof("data field: key(\"%v\"), value(\"%v\").", key, value) + err := mapFillData(d, ygRoot, oper, uri, curKey, result, xpathPrefix, + pathAttr, value) + if err != nil { + log.Errorf("Failed constructing data for db write: key(\"%v\"), value(\"%v\"), path(\"%v\").", + pathAttr, value, xpathPrefix) + } + } + } + } + } + return nil +} + +/* Debug function to print the map data into file */ +func printDbData(db map[string]map[string]db.Value, fileName string) { + fp, err := os.Create(fileName) + if err != nil { + return + } + defer fp.Close() + + for k, v := range db { + fmt.Fprintf(fp, "-----------------------------------------------------------------\r\n") + fmt.Fprintf(fp, "table name : %v\r\n", k) + for ik, iv := range v { + fmt.Fprintf(fp, " key : %v\r\n", ik) + for k, d := range iv.Field { + fmt.Fprintf(fp, " %v :%v\r\n", k, d) + } + } + } + fmt.Fprintf(fp, "-----------------------------------------------------------------\r\n") + return +} diff --git a/src/translib/transformer/xlate_utils.go b/src/translib/transformer/xlate_utils.go new file mode 100644 index 0000000000..10c4861e29 --- /dev/null +++ b/src/translib/transformer/xlate_utils.go @@ -0,0 +1,591 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Dell, Inc. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package transformer + +import ( + "fmt" + "strings" + "reflect" + "regexp" + "translib/db" + "github.com/openconfig/goyang/pkg/yang" + "github.com/openconfig/gnmi/proto/gnmi" + "github.com/openconfig/ygot/ygot" + log "github.com/golang/glog" +) + +/* Create db key from data xpath(request) */ +func keyCreate(keyPrefix string, xpath string, data interface{}, dbKeySep string) string { + _, ok := xYangSpecMap[xpath] + if ok { + if xYangSpecMap[xpath].yangEntry != nil { + yangEntry := xYangSpecMap[xpath].yangEntry + delim := dbKeySep + if len(xYangSpecMap[xpath].delim) > 0 { + delim = xYangSpecMap[xpath].delim + log.Infof("key concatenater(\"%v\") found for xpath %v ", delim, xpath) + } + + if len(keyPrefix) > 0 { keyPrefix += delim } + keyVal := "" + for i, k := range (strings.Split(yangEntry.Key, " ")) { + if i > 0 { keyVal = keyVal + delim } + val := fmt.Sprint(data.(map[string]interface{})[k]) + if strings.Contains(val, ":") { + val = strings.Split(val, ":")[1] + } + keyVal += val + } + keyPrefix += string(keyVal) + } + } + return keyPrefix +} + +/* Copy redis-db source to destn map */ +func mapCopy(destnMap map[string]map[string]db.Value, srcMap map[string]map[string]db.Value) { + for table, tableData := range srcMap { + _, ok := destnMap[table] + if !ok { + destnMap[table] = make(map[string]db.Value) + } + for rule, ruleData := range tableData { + _, ok = destnMap[table][rule] + if !ok { + destnMap[table][rule] = db.Value{Field: make(map[string]string)} + } + for field, value := range ruleData.Field { + destnMap[table][rule].Field[field] = value + } + } + } +} + +func parentXpathGet(xpath string) string { + path := "" + if len(xpath) > 0 { + p := strings.Split(xpath, "/") + path = strings.Join(p[:len(p)-1], "/") + } + return path +} + +func isYangResType(ytype string) bool { + if ytype == "choose" || ytype == "case" { + return true + } + return false +} + +func yangTypeGet(entry *yang.Entry) string { + if entry != nil && entry.Node != nil { + return entry.Node.Statement().Keyword + } + return "" +} + +func dbKeyToYangDataConvert(uri string, xpath string, dbKey string, dbKeySep string) (map[string]interface{}, string, error) { + var err error + if len(uri) == 0 && len(xpath) == 0 && len(dbKey) == 0 { + err = fmt.Errorf("Insufficient input") + return nil, "", err + } + + if _, ok := xYangSpecMap[xpath]; ok { + if xYangSpecMap[xpath].yangEntry == nil { + err = fmt.Errorf("Yang Entry not available for xpath ", xpath) + return nil, "", nil + } + } + + keyNameList := yangKeyFromEntryGet(xYangSpecMap[xpath].yangEntry) + id := xYangSpecMap[xpath].keyLevel + keyDataList := strings.SplitN(dbKey, dbKeySep, id) + uriWithKey := fmt.Sprintf("%v", xpath) + uriWithKeyCreate := true + if len(keyDataList) == 0 { + keyDataList = append(keyDataList, dbKey) + } + + /* if uri contins key, use it else use xpath */ + if strings.Contains(uri, "[") { + uriXpath, _ := XfmrRemoveXPATHPredicates(uri) + if (uriXpath == xpath && (strings.HasSuffix(uri, "]") || strings.HasSuffix(uri, "]/"))) { + uriWithKeyCreate = false + } + uriWithKey = fmt.Sprintf("%v", uri) + } + + if len(xYangSpecMap[xpath].xfmrKey) > 0 { + var dbs [db.MaxDB]*db.DB + inParams := formXfmrInputRequest(nil, dbs, db.MaxDB, nil, uri, GET, dbKey, nil, nil) + ret, err := XlateFuncCall(dbToYangXfmrFunc(xYangSpecMap[xpath].xfmrKey), inParams) + if err != nil { + return nil, "", err + } + rmap := ret[0].Interface().(map[string]interface{}) + if uriWithKeyCreate { + for k, v := range rmap { + uriWithKey += fmt.Sprintf("[%v=%v]", k, v) + } + } + return rmap, uriWithKey, nil + } + + if len(keyNameList) == 0 { + return nil, "", nil + } + + + rmap := make(map[string]interface{}) + if len(keyNameList) > 1 { + log.Infof("No key transformer found for multi element yang key mapping to a single redis key string.") + return rmap, uriWithKey, nil + } + rmap[keyNameList[0]] = keyDataList[0] + if uriWithKeyCreate { + uriWithKey += fmt.Sprintf("[%v=%v]", keyNameList[0], keyDataList[0]) + } + + return rmap, uriWithKey, nil +} + +func contains(sl []string, str string) bool { + for _, v := range sl { + if v == str { + return true + } + } + return false +} + +func isSubtreeRequest(targetUriPath string, nodePath string) bool { + if len(targetUriPath) > 0 && len(nodePath) > 0 { + return strings.HasPrefix(targetUriPath, nodePath) + } + return false +} + +func getYangPathFromUri(uri string) (string, error) { + var path *gnmi.Path + var err error + + path, err = ygot.StringToPath(uri, ygot.StructuredPath, ygot.StringSlicePath) + if err != nil { + log.Errorf("Error in uri to path conversion: %v", err) + return "", err + } + + yangPath, yperr := ygot.PathToSchemaPath(path) + if yperr != nil { + log.Errorf("Error in Gnmi path to Yang path conversion: %v", yperr) + return "", yperr + } + + return yangPath, err +} + +func yangKeyFromEntryGet(entry *yang.Entry) []string { + var keyList []string + for _, key := range strings.Split(entry.Key, " ") { + keyList = append(keyList, key) + } + return keyList +} + +func isSonicYang(path string) bool { + if strings.HasPrefix(path, "/sonic") { + return true + } + return false +} + +func sonicKeyDataAdd(dbIndex db.DBNum, keyNameList []string, keyStr string, resultMap map[string]interface{}) { + var dbOpts db.Options + dbOpts = getDBOptions(dbIndex) + keySeparator := dbOpts.KeySeparator + keyValList := strings.Split(keyStr, keySeparator) + + if len(keyNameList) != len(keyValList) { + return + } + + for i, keyName := range keyNameList { + resultMap[keyName] = keyValList[i] + } +} + +func yangToDbXfmrFunc(funcName string) string { + return ("YangToDb_" + funcName) +} + +func uriWithKeyCreate (uri string, xpathTmplt string, data interface{}) (string, error) { + var err error + if _, ok := xYangSpecMap[xpathTmplt]; ok { + yangEntry := xYangSpecMap[xpathTmplt].yangEntry + if yangEntry != nil { + for _, k := range (strings.Split(yangEntry.Key, " ")) { + uri += fmt.Sprintf("[%v=%v]", k, data.(map[string]interface{})[k]) + } + } else { + err = fmt.Errorf("Yang Entry not available for xpath ", xpathTmplt) + } + } else { + err = fmt.Errorf("No entry in xYangSpecMap for xpath ", xpathTmplt) + } + return uri, err +} + +func xpathRootNameGet(path string) string { + if len(path) > 0 { + pathl := strings.Split(path, "/") + return ("/" + pathl[1]) + } + return "" +} + +func getDbNum(xpath string ) db.DBNum { + _, ok := xYangSpecMap[xpath] + if ok { + xpathInfo := xYangSpecMap[xpath] + return xpathInfo.dbIndex + } + // Default is ConfigDB + return db.ConfigDB +} + +func dbToYangXfmrFunc(funcName string) string { + return ("DbToYang_" + funcName) +} + +func uriModuleNameGet(uri string) (string, error) { + var err error + result := "" + if len(uri) == 0 { + log.Error("Empty uri string supplied") + err = fmt.Errorf("Empty uri string supplied") + return result, err + } + urislice := strings.Split(uri, ":") + if len(urislice) == 1 { + log.Errorf("uri string %s does not have module name", uri) + err = fmt.Errorf("uri string does not have module name: ", uri) + return result, err + } + moduleNm := strings.Split(urislice[0], "/") + result = moduleNm[1] + if len(strings.Trim(result, " ")) == 0 { + log.Error("Empty module name") + err = fmt.Errorf("No module name found in uri %s", uri) + } + log.Info("module name = ", result) + return result, err +} + +func recMap(rMap interface{}, name []string, id int, max int) { + if id == max || id < 0 { + return + } + val := name[id] + if reflect.ValueOf(rMap).Kind() == reflect.Map { + data := reflect.ValueOf(rMap) + dMap := data.Interface().(map[string]interface{}) + _, ok := dMap[val] + if ok { + recMap(dMap[val], name, id+1, max) + } else { + dMap[val] = make(map[string]interface{}) + recMap(dMap[val], name, id+1, max) + } + } + return +} + +func mapCreate(xpath string) map[string]interface{} { + retMap := make(map[string]interface{}) + if len(xpath) > 0 { + attrList := strings.Split(xpath, "/") + alLen := len(attrList) + recMap(retMap, attrList, 1, alLen) + } + return retMap +} + +func mapInstGet(name []string, id int, max int, inMap interface{}) map[string]interface{} { + if inMap == nil { + return nil + } + result := reflect.ValueOf(inMap).Interface().(map[string]interface{}) + if id == max { + return result + } + val := name[id] + if reflect.ValueOf(inMap).Kind() == reflect.Map { + data := reflect.ValueOf(inMap) + dMap := data.Interface().(map[string]interface{}) + _, ok := dMap[val] + if ok { + result = mapInstGet(name, id+1, max, dMap[val]) + } else { + return result + } + } + return result +} + +func mapGet(xpath string, inMap map[string]interface{}) map[string]interface{} { + attrList := strings.Split(xpath, "/") + alLen := len(attrList) + recMap(inMap, attrList, 1, alLen) + retMap := mapInstGet(attrList, 1, alLen, inMap) + return retMap +} + +func formXfmrInputRequest(d *db.DB, dbs [db.MaxDB]*db.DB, cdb db.DBNum, ygRoot *ygot.GoStruct, uri string, oper int, key string, dbDataMap *map[db.DBNum]map[string]map[string]db.Value, param interface{}) XfmrParams { + var inParams XfmrParams + inParams.d = d + inParams.dbs = dbs + inParams.curDb = cdb + inParams.ygRoot = ygRoot + inParams.uri = uri + inParams.oper = oper + inParams.key = key + inParams.dbDataMap = dbDataMap + inParams.param = param // generic param + + return inParams +} + +func findByValue(m map[string]string, value string) string { + for key, val := range m { + if val == value { + return key + } + } + return "" +} +func findByKey(m map[string]string, key string) string { + if val, found := m[key]; found { + return val + } + return "" +} +func findInMap(m map[string]string, str string) string { + // Check if str exists as a value in map m. + if val := findByKey(m, str); val != "" { + return val + } + + // Check if str exists as a key in map m. + if val := findByValue(m, str); val != "" { + return val + } + + // str doesn't exist in map m. + return "" +} + +func getDBOptions(dbNo db.DBNum) db.Options { + var opt db.Options + + switch dbNo { + case db.ApplDB, db.CountersDB: + opt = getDBOptionsWithSeparator(dbNo, "", ":", ":") + break + case db.FlexCounterDB, db.AsicDB, db.LogLevelDB, db.ConfigDB, db.StateDB: + opt = getDBOptionsWithSeparator(dbNo, "", "|", "|") + break + } + + return opt +} + +func getDBOptionsWithSeparator(dbNo db.DBNum, initIndicator string, tableSeparator string, keySeparator string) db.Options { + return(db.Options { + DBNo : dbNo, + InitIndicator : initIndicator, + TableNameSeparator: tableSeparator, + KeySeparator : keySeparator, + }) +} + +func stripAugmentedModuleNames(xpath string) string { + pathList := strings.Split(xpath, "/") + pathList = pathList[1:] + for i, pvar := range pathList { + if (i > 0) && strings.Contains(pvar, ":") { + pvar = strings.Split(pvar,":")[1] + pathList[i] = pvar + } + } + path := "/" + strings.Join(pathList, "/") + return path +} + +func XfmrRemoveXPATHPredicates(xpath string) (string, error) { + pathList := strings.Split(xpath, "/") + pathList = pathList[1:] + for i, pvar := range pathList { + if strings.Contains(pvar, "[") && strings.Contains(pvar, "]") { + si, ei := strings.Index(pvar, "["), strings.Index(pvar, "]") + // substring contains [] entries + if (si < ei) { + pvar = strings.Split(pvar, "[")[0] + pathList[i] = pvar + + } else { + // This substring contained a ] before a [. + return "", fmt.Errorf("Incorrect ordering of [] within substring %s of %s, [ pos: %d, ] pos: %d", pvar, xpath, si, ei) + } + } else if strings.Contains(pvar, "[") || strings.Contains(pvar, "]") { + // This substring contained a mismatched pair of []s. + return "", fmt.Errorf("Mismatched brackets within substring %s of %s", pvar, xpath) + } + if (i > 0) && strings.Contains(pvar, ":") { + pvar = strings.Split(pvar,":")[1] + pathList[i] = pvar + } + } + path := "/" + strings.Join(pathList, "/") + return path,nil +} + + /* Extract key vars, create db key and xpath */ + func xpathKeyExtract(d *db.DB, ygRoot *ygot.GoStruct, oper int, path string) (string, string, string) { + keyStr := "" + tableName := "" + pfxPath := "" + rgp := regexp.MustCompile(`\[([^\[\]]*)\]`) + curPathWithKey := "" + cdb := db.ConfigDB + var dbs [db.MaxDB]*db.DB + + pfxPath, _ = XfmrRemoveXPATHPredicates(path) + xpathInfo, ok := xYangSpecMap[pfxPath] + if !ok { + log.Errorf("No entry found in xYangSpecMap for xpath %v.", pfxPath) + return pfxPath, keyStr, tableName + } + cdb = xpathInfo.dbIndex + dbOpts := getDBOptions(cdb) + keySeparator := dbOpts.KeySeparator + if len(xpathInfo.delim) > 0 { + keySeparator = xpathInfo.delim + } + + for _, k := range strings.Split(path, "/") { + curPathWithKey += k + yangXpath, _ := XfmrRemoveXPATHPredicates(curPathWithKey) + _, ok := xYangSpecMap[yangXpath] + if ok { + if strings.Contains(k, "[") { + if len(keyStr) > 0 { + keyStr += keySeparator + } + if len(xYangSpecMap[yangXpath].xfmrKey) > 0 { + xfmrFuncName := yangToDbXfmrFunc(xYangSpecMap[yangXpath].xfmrKey) + inParams := formXfmrInputRequest(d, dbs, db.MaxDB, ygRoot, curPathWithKey, oper, "", nil, nil) + ret, err := XlateFuncCall(xfmrFuncName, inParams) + if err != nil { + return "", "", "" + } + if ret != nil { + keyStr = ret[0].Interface().(string) + } + } else if xYangSpecMap[yangXpath].keyName != nil { + keyStr += *xYangSpecMap[yangXpath].keyName + } else { + /* multi-leaf yang key together forms a single key-string in redis. + There should be key-transformer, if not then the yang key leaves + will be concatenated with respective default DB type key-delimiter + */ + for idx, kname := range rgp.FindAllString(k, -1) { + if idx > 0 { keyStr += keySeparator } + keyl := strings.TrimRight(strings.TrimLeft(kname, "["), "]") + if strings.Contains(keyl, ":") { + keyl = strings.Split(keyl, ":")[1] + } + keyStr += strings.Split(keyl, "=")[1] + } + } + } else if len(xYangSpecMap[yangXpath].xfmrKey) > 0 { + xfmrFuncName := yangToDbXfmrFunc(xYangSpecMap[yangXpath].xfmrKey) + inParams := formXfmrInputRequest(d, dbs, db.MaxDB, ygRoot, curPathWithKey, oper, "", nil, nil) + ret, err := XlateFuncCall(xfmrFuncName, inParams) + if err != nil { + return "", "", "" + } + if ret != nil { + keyStr = ret[0].Interface().(string) + } + } else if xYangSpecMap[yangXpath].keyName != nil { + keyStr += *xYangSpecMap[yangXpath].keyName + } + } + curPathWithKey += "/" + } + curPathWithKey = strings.TrimSuffix(curPathWithKey, "/") + tblPtr := xpathInfo.tableName + if tblPtr != nil { + tableName = *tblPtr + } else if xpathInfo.xfmrTbl != nil { + inParams := formXfmrInputRequest(d, dbs, cdb, ygRoot, curPathWithKey, oper, "", nil, nil) + tableName, _ = tblNameFromTblXfmrGet(*xpathInfo.xfmrTbl, inParams) + } + return pfxPath, keyStr, tableName + } + + func sonicXpathKeyExtract(path string) (string, string, string) { + xpath, keyStr, tableName := "", "", "" + var err error + xpath, err = XfmrRemoveXPATHPredicates(path) + if err != nil { + return xpath, keyStr, tableName + } + rgp := regexp.MustCompile(`\[([^\[\]]*)\]`) + pathsubStr := strings.Split(path , "/") + if len(pathsubStr) > SONIC_TABLE_INDEX { + if strings.Contains(pathsubStr[2], "[") { + tableName = strings.Split(pathsubStr[SONIC_TABLE_INDEX], "[")[0] + } else { + tableName = pathsubStr[SONIC_TABLE_INDEX] + } + dbInfo, ok := xDbSpecMap[tableName] + cdb := db.ConfigDB + if !ok { + log.Infof("No entry in xDbSpecMap for xpath %v in order to fetch DB index.", tableName) + return xpath, keyStr, tableName + } + cdb = dbInfo.dbIndex + dbOpts := getDBOptions(cdb) + if dbInfo.keyName != nil { + keyStr = *dbInfo.keyName + } else { + for i, kname := range rgp.FindAllString(path, -1) { + if i > 0 { + keyStr += dbOpts.KeySeparator + } + val := strings.Split(kname, "=")[1] + keyStr += strings.TrimRight(val, "]") + } + } + } + return xpath, keyStr, tableName + } + diff --git a/src/translib/transformer/xspec.go b/src/translib/transformer/xspec.go new file mode 100644 index 0000000000..6c556deb85 --- /dev/null +++ b/src/translib/transformer/xspec.go @@ -0,0 +1,598 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Dell, Inc. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package transformer + +import ( + "fmt" + "os" + "strings" + log "github.com/golang/glog" + "translib/db" + + "github.com/openconfig/goyang/pkg/yang" +) + +/* Data needed to construct lookup table from yang */ +type yangXpathInfo struct { + yangDataType string + tableName *string + xfmrTbl *string + childTable []string + dbEntry *yang.Entry + yangEntry *yang.Entry + keyXpath map[int]*[]string + delim string + fieldName string + xfmrFunc string + xfmrPost string + validateFunc string + xfmrKey string + keyName *string + dbIndex db.DBNum + keyLevel int + isKey bool +} + +type dbInfo struct { + dbIndex db.DBNum + keyName *string + fieldType string + dbEntry *yang.Entry + yangXpath []string + module string +} + +var xYangSpecMap map[string]*yangXpathInfo +var xDbSpecMap map[string]*dbInfo +var xDbSpecOrdTblMap map[string][]string //map of module-name to ordered list of db tables { "sonic-acl" : ["ACL_TABLE", "ACL_RULE"] } + +/* update transformer spec with db-node */ +func updateDbTableData (xpath string, xpathData *yangXpathInfo, tableName string) { + _, ok := xDbSpecMap[tableName] + if ok { + xDbSpecMap[tableName].yangXpath = append(xDbSpecMap[tableName].yangXpath, xpath) + xpathData.dbEntry = xDbSpecMap[tableName].dbEntry + } +} + +/* Recursive api to fill the map with yang details */ +func yangToDbMapFill (keyLevel int, xYangSpecMap map[string]*yangXpathInfo, entry *yang.Entry, xpathPrefix string) { + xpath := "" + /* create the yang xpath */ + if xYangSpecMap[xpathPrefix] != nil && xYangSpecMap[xpathPrefix].yangDataType == "module" { + /* module name is separated from the rest of xpath with ":" */ + xpath = xpathPrefix + ":" + entry.Name + } else { + xpath = xpathPrefix + "/" + entry.Name + } + + xpathData, ok := xYangSpecMap[xpath] + if !ok { + xpathData = new(yangXpathInfo) + xYangSpecMap[xpath] = xpathData + xpathData.dbIndex = db.ConfigDB // default value + } else { + xpathData = xYangSpecMap[xpath] + } + + xpathData.yangDataType = entry.Node.Statement().Keyword + if entry.Node.Statement().Keyword == "list" && xpathData.tableName != nil { + childToUpdateParent(xpath, *xpathData.tableName) + } + + parentXpathData, ok := xYangSpecMap[xpathPrefix] + /* init current xpath table data with its parent data, change only if needed. */ + if ok { + if xpathData.tableName == nil && parentXpathData.tableName != nil && xpathData.xfmrTbl == nil { + xpathData.tableName = parentXpathData.tableName + } else if xpathData.xfmrTbl == nil && parentXpathData.xfmrTbl != nil { + xpathData.xfmrTbl = parentXpathData.xfmrTbl + } + } + + if ok && xpathData.dbIndex == db.ConfigDB && parentXpathData.dbIndex != db.ConfigDB { + // If DB Index is not annotated and parent DB index is annotated inherit the DB Index of the parent + xpathData.dbIndex = parentXpathData.dbIndex + } + + if ok && len(parentXpathData.validateFunc) > 0 { + xpathData.validateFunc = parentXpathData.validateFunc + } + + if ok && len(parentXpathData.xfmrFunc) > 0 && len(xpathData.xfmrFunc) == 0 { + xpathData.xfmrFunc = parentXpathData.xfmrFunc + } + + if xpathData.yangDataType == "leaf" && len(xpathData.fieldName) == 0 { + if xpathData.tableName != nil && xDbSpecMap[*xpathData.tableName] != nil { + if xDbSpecMap[*xpathData.tableName].dbEntry.Dir[entry.Name] != nil { + xpathData.fieldName = entry.Name + } else if xDbSpecMap[*xpathData.tableName].dbEntry.Dir[strings.ToUpper(entry.Name)] != nil { + xpathData.fieldName = strings.ToUpper(entry.Name) + } + } else if xpathData.xfmrTbl != nil { + /* table transformer present */ + xpathData.fieldName = entry.Name + } + } + + if xpathData.yangDataType == "leaf" && len(xpathData.fieldName) > 0 && xpathData.tableName != nil { + dbPath := *xpathData.tableName + "/" + xpathData.fieldName + if xDbSpecMap[dbPath] != nil { + xDbSpecMap[dbPath].yangXpath = append(xDbSpecMap[dbPath].yangXpath, xpath) + } + } + + /* fill table with key data. */ + curKeyLevel := keyLevel + if len(entry.Key) != 0 { + parentKeyLen := 0 + + /* create list with current keys */ + keyXpath := make([]string, len(strings.Split(entry.Key, " "))) + for id, keyName := range(strings.Split(entry.Key, " ")) { + keyXpath[id] = xpath + "/" + keyName + keyXpathData := new(yangXpathInfo) + xYangSpecMap[xpath + "/" + keyName] = keyXpathData + xYangSpecMap[xpath + "/" + keyName].isKey = true + } + + xpathData.keyXpath = make(map[int]*[]string, (parentKeyLen + 1)) + k := 0 + for ; k < parentKeyLen; k++ { + /* copy parent key-list to child key-list*/ + xpathData.keyXpath[k] = parentXpathData.keyXpath[k] + } + xpathData.keyXpath[k] = &keyXpath + xpathData.keyLevel = curKeyLevel + curKeyLevel++ + } else if parentXpathData != nil && parentXpathData.keyXpath != nil { + xpathData.keyXpath = parentXpathData.keyXpath + } + + /* get current obj's children */ + var childList []string + for k := range entry.Dir { + childList = append(childList, k) + } + + xpathData.yangEntry = entry + /* now recurse, filling the map with current node's children info */ + for _, child := range childList { + yangToDbMapFill(curKeyLevel, xYangSpecMap, entry.Dir[child], xpath) + } +} + +/* Build lookup table based of yang xpath */ +func yangToDbMapBuild(entries map[string]*yang.Entry) { + if entries == nil { + return + } + + if xYangSpecMap == nil { + xYangSpecMap = make(map[string]*yangXpathInfo) + } + + for module, e := range entries { + if e == nil || len(e.Dir) == 0 { + continue + } + + /* Start to fill xpath based map with yang data */ + keyLevel := 0 + yangToDbMapFill(keyLevel, xYangSpecMap, e, "") + + // Fill the ordered map of child tables list for oc yangs + updateSchemaOrderedMap(module, e) + } + mapPrint(xYangSpecMap, "/tmp/fullSpec.txt") + dbMapPrint("/tmp/dbSpecMap.txt") +} + +/* Fill the map with db details */ +func dbMapFill(tableName string, curPath string, moduleNm string, trkTpCnt bool, xDbSpecMap map[string]*dbInfo, entry *yang.Entry) { + entryType := entry.Node.Statement().Keyword + + if entry.Name != moduleNm { + if entryType == "container" { + tableName = entry.Name + } + + if !isYangResType(entryType) { + dbXpath := tableName + if entryType != "container" { + dbXpath = tableName + "/" + entry.Name + } + xDbSpecMap[dbXpath] = new(dbInfo) + xDbSpecMap[dbXpath].dbIndex = db.MaxDB + xDbSpecMap[dbXpath].dbEntry = entry + xDbSpecMap[dbXpath].fieldType = entryType + xDbSpecMap[dbXpath].module = moduleNm + if entryType == "container" { + xDbSpecMap[dbXpath].dbIndex = db.ConfigDB + if entry.Exts != nil && len(entry.Exts) > 0 { + for _, ext := range entry.Exts { + dataTagArr := strings.Split(ext.Keyword, ":") + tagType := dataTagArr[len(dataTagArr)-1] + switch tagType { + case "key-name" : + if xDbSpecMap[dbXpath].keyName == nil { + xDbSpecMap[dbXpath].keyName = new(string) + } + *xDbSpecMap[dbXpath].keyName = ext.NName() + default : + log.Infof("Unsupported ext type(%v) for xpath(%v).", tagType, dbXpath) + } + } + } + } + } + } else { + moduleXpath := "/" + moduleNm + ":" + entry.Name + xDbSpecMap[moduleXpath] = new(dbInfo) + xDbSpecMap[moduleXpath].dbEntry = entry + xDbSpecMap[moduleXpath].fieldType = entryType + xDbSpecMap[moduleXpath].module = moduleNm + } + + var childList []string + for _, k := range entry.DirOKeys { + childList = append(childList, k) + } + + if entryType == "container" && trkTpCnt { + xDbSpecOrdTblMap[moduleNm] = childList + log.Info("xDbSpecOrdTblMap after appending ", xDbSpecOrdTblMap) + trkTpCnt = false + } + + for _, child := range childList { + childPath := tableName + "/" + entry.Dir[child].Name + dbMapFill(tableName, childPath, moduleNm, trkTpCnt, xDbSpecMap, entry.Dir[child]) + } +} + +/* Build redis db lookup map */ +func dbMapBuild(entries []*yang.Entry) { + if entries == nil { + return + } + xDbSpecMap = make(map[string]*dbInfo) + xDbSpecOrdTblMap = make(map[string][]string) + + for _, e := range entries { + if e == nil || len(e.Dir) == 0 { + continue + } + moduleNm := e.Name + log.Infof("Module name(%v)", moduleNm) + trkTpCnt := true + dbMapFill("", "", moduleNm, trkTpCnt, xDbSpecMap, e) + } +} + +func childToUpdateParent( xpath string, tableName string) { + var xpathData *yangXpathInfo + parent := parentXpathGet(xpath) + if len(parent) == 0 || parent == "/" { + return + } + + _, ok := xYangSpecMap[parent] + if !ok { + xpathData = new(yangXpathInfo) + xYangSpecMap[parent] = xpathData + } + xYangSpecMap[parent].childTable = append(xYangSpecMap[parent].childTable, tableName) + if xYangSpecMap[parent].yangEntry != nil && + xYangSpecMap[parent].yangEntry.Node.Statement().Keyword == "list" { + return + } + childToUpdateParent(parent, tableName) +} + +/* Build lookup map based on yang xpath */ +func annotEntryFill(xYangSpecMap map[string]*yangXpathInfo, xpath string, entry *yang.Entry) { + xpathData := new(yangXpathInfo) + _, ok := xYangSpecMap[xpath] + if !ok { + fmt.Printf("Xpath not found(%v) \r\n", xpath) + } + + xpathData.dbIndex = db.ConfigDB // default value + /* fill table with yang extension data. */ + if entry != nil && len(entry.Exts) > 0 { + for _, ext := range entry.Exts { + dataTagArr := strings.Split(ext.Keyword, ":") + tagType := dataTagArr[len(dataTagArr)-1] + switch tagType { + case "table-name" : + if xpathData.tableName == nil { + xpathData.tableName = new(string) + } + *xpathData.tableName = ext.NName() + updateDbTableData(xpath, xpathData, *xpathData.tableName) + case "key-name" : + if xpathData.keyName == nil { + xpathData.keyName = new(string) + } + *xpathData.keyName = ext.NName() + case "table-transformer" : + if xpathData.xfmrTbl == nil { + xpathData.xfmrTbl = new(string) + } + *xpathData.xfmrTbl = ext.NName() + case "field-name" : + xpathData.fieldName = ext.NName() + case "subtree-transformer" : + xpathData.xfmrFunc = ext.NName() + case "key-transformer" : + xpathData.xfmrKey = ext.NName() + case "key-delimiter" : + xpathData.delim = ext.NName() + case "field-transformer" : + xpathData.xfmrFunc = ext.NName() + case "post-transformer" : + xpathData.xfmrPost = ext.NName() + case "get-validate" : + xpathData.validateFunc = ext.NName() + case "use-self-key" : + xpathData.keyXpath = nil + case "db-name" : + if ext.NName() == "APPL_DB" { + xpathData.dbIndex = db.ApplDB + } else if ext.NName() == "ASIC_DB" { + xpathData.dbIndex = db.AsicDB + } else if ext.NName() == "COUNTERS_DB" { + xpathData.dbIndex = db.CountersDB + } else if ext.NName() == "LOGLEVEL_DB" { + xpathData.dbIndex = db.LogLevelDB + } else if ext.NName() == "CONFIG_DB" { + xpathData.dbIndex = db.ConfigDB + } else if ext.NName() == "FLEX_COUNTER_DB" { + xpathData.dbIndex = db.FlexCounterDB + } else if ext.NName() == "STATE_DB" { + xpathData.dbIndex = db.StateDB + } else { + xpathData.dbIndex = db.ConfigDB + } + } + } + } + xYangSpecMap[xpath] = xpathData +} + +/* Build xpath from yang-annotation */ +func xpathFromDevCreate(path string) string { + p := strings.Split(path, "/") + for i, k := range p { + if len(k) > 0 { p[i] = strings.Split(k, ":")[1] } + } + return strings.Join(p[1:], "/") +} + +/* Build lookup map based on yang xpath */ +func annotToDbMapBuild(annotEntries []*yang.Entry) { + if annotEntries == nil { + return + } + if xYangSpecMap == nil { + xYangSpecMap = make(map[string]*yangXpathInfo) + } + + for _, e := range annotEntries { + if e != nil && len(e.Deviations) > 0 { + for _, d := range e.Deviations { + xpath := xpathFromDevCreate(d.Name) + xpath = "/" + strings.Replace(e.Name, "-annot", "", -1) + ":" + xpath + for i, deviate := range d.Deviate { + if i == 2 { + for _, ye := range deviate { + annotEntryFill(xYangSpecMap, xpath, ye) + } + } + } + } + } + } + mapPrint(xYangSpecMap, "/tmp/annotSpec.txt") +} + +func annotDbSpecMapFill(xDbSpecMap map[string]*dbInfo, dbXpath string, entry *yang.Entry) error { + var err error + var dbXpathData *dbInfo + var ok bool + + //Currently sonic-yang annotation is supported for "list" type only. + listName := strings.Split(dbXpath, "/") + if len(listName) < 3 { + log.Errorf("Invalid list xpath length(%v) \r\n", dbXpath) + return err + } + dbXpathData, ok = xDbSpecMap[listName[2]] + if !ok { + log.Errorf("DB spec-map data not found(%v) \r\n", dbXpath) + return err + } + log.Infof("Annotate dbSpecMap for (%v)(listName:%v)\r\n", dbXpath, listName[2]) + dbXpathData.dbIndex = db.ConfigDB // default value + + /* fill table with cvl yang extension data. */ + if entry != nil && len(entry.Exts) > 0 { + for _, ext := range entry.Exts { + dataTagArr := strings.Split(ext.Keyword, ":") + tagType := dataTagArr[len(dataTagArr)-1] + switch tagType { + case "key-name" : + if dbXpathData.keyName == nil { + dbXpathData.keyName = new(string) + } + *dbXpathData.keyName = ext.NName() + case "db-name" : + if ext.NName() == "APPL_DB" { + dbXpathData.dbIndex = db.ApplDB + } else if ext.NName() == "ASIC_DB" { + dbXpathData.dbIndex = db.AsicDB + } else if ext.NName() == "COUNTERS_DB" { + dbXpathData.dbIndex = db.CountersDB + } else if ext.NName() == "LOGLEVEL_DB" { + dbXpathData.dbIndex = db.LogLevelDB + } else if ext.NName() == "CONFIG_DB" { + dbXpathData.dbIndex = db.ConfigDB + } else if ext.NName() == "FLEX_COUNTER_DB" { + dbXpathData.dbIndex = db.FlexCounterDB + } else if ext.NName() == "STATE_DB" { + dbXpathData.dbIndex = db.StateDB + } else { + dbXpathData.dbIndex = db.ConfigDB + } + default : + } + } + } + + dbMapPrint("/tmp/dbSpecMapFull.txt") + return err +} + +func annotDbSpecMap(annotEntries []*yang.Entry) { + if annotEntries == nil || xDbSpecMap == nil { + return + } + for _, e := range annotEntries { + if e != nil && len(e.Deviations) > 0 { + for _, d := range e.Deviations { + xpath := xpathFromDevCreate(d.Name) + xpath = "/" + strings.Replace(e.Name, "-annot", "", -1) + ":" + xpath + for i, deviate := range d.Deviate { + if i == 2 { + for _, ye := range deviate { + annotDbSpecMapFill(xDbSpecMap, xpath, ye) + } + } + } + } + } + } +} + +/* Debug function to print the yang xpath lookup map */ +func mapPrint(inMap map[string]*yangXpathInfo, fileName string) { + fp, err := os.Create(fileName) + if err != nil { + return + } + defer fp.Close() + + for k, d := range inMap { + fmt.Fprintf (fp, "-----------------------------------------------------------------\r\n") + fmt.Fprintf(fp, "%v:\r\n", k) + fmt.Fprintf(fp, " yangDataType: %v\r\n", d.yangDataType) + fmt.Fprintf(fp, " tableName: ") + if d.tableName != nil { + fmt.Fprintf(fp, "%v", *d.tableName) + } + fmt.Fprintf(fp, "\r\n xfmrTbl : ") + if d.xfmrTbl != nil { + fmt.Fprintf(fp, "%v", *d.xfmrTbl) + } + fmt.Fprintf(fp, "\r\n keyName : ") + if d.keyName != nil { + fmt.Fprintf(fp, "%v", *d.keyName) + } + fmt.Fprintf(fp, "\r\n childTbl : %v", d.childTable) + fmt.Fprintf(fp, "\r\n FieldName: %v", d.fieldName) + fmt.Fprintf(fp, "\r\n keyLevel : %v", d.keyLevel) + fmt.Fprintf(fp, "\r\n xfmrKeyFn: %v", d.xfmrKey) + fmt.Fprintf(fp, "\r\n xfmrFunc : %v", d.xfmrFunc) + fmt.Fprintf(fp, "\r\n dbIndex : %v", d.dbIndex) + fmt.Fprintf(fp, "\r\n validateFunc : %v", d.validateFunc) + fmt.Fprintf(fp, "\r\n yangEntry: ") + if d.yangEntry != nil { + fmt.Fprintf(fp, "%v", *d.yangEntry) + } + fmt.Fprintf(fp, "\r\n dbEntry: ") + if d.dbEntry != nil { + fmt.Fprintf(fp, "%v", *d.dbEntry) + } + fmt.Fprintf(fp, "\r\n keyXpath: %d\r\n", d.keyXpath) + for i, kd := range d.keyXpath { + fmt.Fprintf(fp, " %d. %#v\r\n", i, kd) + } + fmt.Fprintf(fp, "\r\n isKey : %v\r\n", d.isKey) + } + fmt.Fprintf (fp, "-----------------------------------------------------------------\r\n") + +} + +/* Debug function to print redis db lookup map */ +func dbMapPrint( fname string) { + fp, err := os.Create(fname) + if err != nil { + return + } + defer fp.Close() + fmt.Fprintf (fp, "-----------------------------------------------------------------\r\n") + for k, v := range xDbSpecMap { + fmt.Fprintf(fp, " field:%v \r\n", k) + fmt.Fprintf(fp, " type :%v \r\n", v.fieldType) + fmt.Fprintf(fp, " db-type :%v \r\n", v.dbIndex) + fmt.Fprintf(fp, " module :%v \r\n", v.module) + fmt.Fprintf(fp, " KeyName: ") + if v.keyName != nil { + fmt.Fprintf(fp, "%v", *v.keyName) + } + fmt.Fprintf(fp, "\r\n oc-yang :%v \r\n", v.yangXpath) + fmt.Fprintf(fp, " cvl-yang :%v \r\n", v.dbEntry) + fmt.Fprintf (fp, "-----------------------------------------------------------------\r\n") + + } +} + +func updateSchemaOrderedMap(module string, entry *yang.Entry) { + var children []string + if entry.Node.Statement().Keyword == "module" { + for _, dir := range entry.DirOKeys { + // Gives the yang xpath for the top level container + xpath := "/" + module + ":" + dir + _, ok := xYangSpecMap[xpath] + if ok { + yentry := xYangSpecMap[xpath].yangEntry + if yentry.Node.Statement().Keyword == "container" { + var keyspec = make([]KeySpec, 0) + keyspec = FillKeySpecs(xpath, "" , &keyspec) + children = updateChildTable(keyspec, &children) + } + } + } + } + xDbSpecOrdTblMap[module] = children +} + +func updateChildTable(keyspec []KeySpec, chlist *[]string) ([]string) { + for _, ks := range keyspec { + if (ks.Ts.Name != "") { + if !contains(*chlist, ks.Ts.Name) { + *chlist = append(*chlist, ks.Ts.Name) + } + } + *chlist = updateChildTable(ks.Child, chlist) + } + return *chlist +} diff --git a/src/translib/translib.go b/src/translib/translib.go new file mode 100644 index 0000000000..3170128a21 --- /dev/null +++ b/src/translib/translib.go @@ -0,0 +1,745 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +/* +Package translib implements APIs like Create, Get, Subscribe etc. + +to be consumed by the north bound management server implementations + +This package take care of translating the incoming requests to + +Redis ABNF format and persisting them in the Redis DB. + +It can also translate the ABNF format to YANG specific JSON IETF format + +This package can also talk to non-DB clients. +*/ + +package translib + +import ( + //"errors" + "sync" + "translib/db" + "github.com/Workiva/go-datastructures/queue" + log "github.com/golang/glog" + "translib/tlerr" +) + +//Write lock for all write operations to be synchronized +var writeMutex = &sync.Mutex{} + +//minimum global interval for subscribe in secs +var minSubsInterval = 20 +var maxSubsInterval = 60 + +type ErrSource int + +const( + ProtoErr ErrSource = iota + AppErr +) + +type SetRequest struct{ + Path string + Payload []byte +} + +type SetResponse struct{ + ErrSrc ErrSource +} + +type GetRequest struct{ + Path string +} + +type GetResponse struct{ + Payload []byte + ErrSrc ErrSource +} + +type SubscribeResponse struct{ + Path string + Payload []byte + Timestamp int64 + SyncComplete bool + IsTerminated bool +} + +type NotificationType int + +const( + Sample NotificationType = iota + OnChange +) + +type IsSubscribeResponse struct{ + Path string + IsOnChangeSupported bool + MinInterval int + Err error + PreferredType NotificationType +} + +type ModelData struct{ + Name string + Org string + Ver string +} + +type notificationOpts struct { + mInterval int + pType NotificationType // for TARGET_DEFINED +} + +//initializes logging and app modules +func init() { + log.Flush() +} + +//Creates entries in the redis DB pertaining to the path and payload +func Create(req SetRequest) (SetResponse, error){ + var keys []db.WatchKeys + var resp SetResponse + + path := req.Path + payload := req.Payload + + log.Info("Create request received with path =", path) + log.Info("Create request received with payload =", string(payload)) + + app, appInfo, err := getAppModule(path) + + if err != nil { + resp.ErrSrc = ProtoErr + return resp, err + } + + err = appInitialize(app, appInfo, path, &payload, CREATE) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + writeMutex.Lock() + defer writeMutex.Unlock() + + d, err := db.NewDB(getDBOptions(db.ConfigDB)) + + if err != nil { + resp.ErrSrc = ProtoErr + return resp, err + } + + defer d.DeleteDB() + + keys, err = (*app).translateCreate(d) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + err = d.StartTx(keys, appInfo.tablesToWatch) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + resp, err = (*app).processCreate (d) + + if err != nil { + d.AbortTx() + resp.ErrSrc = AppErr + return resp, err + } + + err = d.CommitTx() + + if err != nil { + resp.ErrSrc = AppErr + } + + return resp, err +} + +//Updates entries in the redis DB pertaining to the path and payload +func Update(req SetRequest) (SetResponse, error){ + var keys []db.WatchKeys + var resp SetResponse + + path := req.Path + payload := req.Payload + + log.Info("Update request received with path =", path) + log.Info("Update request received with payload =", string(payload)) + + app, appInfo, err := getAppModule(path) + + if err != nil { + resp.ErrSrc = ProtoErr + return resp, err + } + + err = appInitialize(app, appInfo, path, &payload, UPDATE) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + writeMutex.Lock() + defer writeMutex.Unlock() + + d, err := db.NewDB(getDBOptions(db.ConfigDB)) + + if err != nil { + resp.ErrSrc = ProtoErr + return resp, err + } + + defer d.DeleteDB() + + keys, err = (*app).translateUpdate(d) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + err = d.StartTx(keys, appInfo.tablesToWatch) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + resp, err = (*app).processUpdate (d) + + if err != nil { + d.AbortTx() + resp.ErrSrc = AppErr + return resp, err + } + + err = d.CommitTx() + + if err != nil { + resp.ErrSrc = AppErr + } + + return resp, err +} + +//Replaces entries in the redis DB pertaining to the path and payload +func Replace(req SetRequest) (SetResponse, error){ + var err error + var keys []db.WatchKeys + var resp SetResponse + + path := req.Path + payload := req.Payload + + log.Info("Replace request received with path =", path) + log.Info("Replace request received with payload =", string(payload)) + + app, appInfo, err := getAppModule(path) + + if err != nil { + resp.ErrSrc = ProtoErr + return resp, err + } + + err = appInitialize(app, appInfo, path, &payload, REPLACE) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + writeMutex.Lock() + defer writeMutex.Unlock() + + d, err := db.NewDB(getDBOptions(db.ConfigDB)) + + if err != nil { + resp.ErrSrc = ProtoErr + return resp, err + } + + defer d.DeleteDB() + + keys, err = (*app).translateReplace(d) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + err = d.StartTx(keys, appInfo.tablesToWatch) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + resp, err = (*app).processReplace (d) + + if err != nil { + d.AbortTx() + resp.ErrSrc = AppErr + return resp, err + } + + err = d.CommitTx() + + if err != nil { + resp.ErrSrc = AppErr + } + + return resp, err +} + +//Deletes entries in the redis DB pertaining to the path +func Delete(req SetRequest) (SetResponse, error){ + var err error + var keys []db.WatchKeys + var resp SetResponse + + path := req.Path + + log.Info("Delete request received with path =", path) + + app, appInfo, err := getAppModule(path) + + if err != nil { + resp.ErrSrc = ProtoErr + return resp, err + } + + err = appInitialize(app, appInfo, path, nil, DELETE) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + writeMutex.Lock() + defer writeMutex.Unlock() + + d, err := db.NewDB(getDBOptions(db.ConfigDB)) + + if err != nil { + resp.ErrSrc = ProtoErr + return resp, err + } + + defer d.DeleteDB() + + keys, err = (*app).translateDelete(d) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + err = d.StartTx(keys, appInfo.tablesToWatch) + + if err != nil { + resp.ErrSrc = AppErr + return resp, err + } + + resp, err = (*app).processDelete(d) + + if err != nil { + d.AbortTx() + resp.ErrSrc = AppErr + return resp, err + } + + err = d.CommitTx() + + if err != nil { + resp.ErrSrc = AppErr + } + + return resp, err +} + +//Gets data from the redis DB and converts it to northbound format +func Get(req GetRequest) (GetResponse, error){ + var payload []byte + var resp GetResponse + + path := req.Path + + log.Info("Received Get request for path = ",path) + + app, appInfo, err := getAppModule(path) + + if err != nil { + resp = GetResponse{Payload:payload, ErrSrc:ProtoErr} + return resp, err + } + + err = appInitialize(app, appInfo, path, nil, GET) + + if err != nil { + resp = GetResponse{Payload:payload, ErrSrc:AppErr} + return resp, err + } + + dbs, err := getAllDbs() + + if err != nil { + resp = GetResponse{Payload:payload, ErrSrc:ProtoErr} + return resp, err + } + + defer closeAllDbs(dbs[:]) + + err = (*app).translateGet (dbs) + + if err != nil { + resp = GetResponse{Payload:payload, ErrSrc:AppErr} + return resp, err + } + + resp, err = (*app).processGet(dbs) + + return resp, err +} + +//Subscribes to the paths requested and sends notifications when the data changes in DB +func Subscribe(paths []string, q *queue.PriorityQueue, stop chan struct{}) ([]*IsSubscribeResponse, error) { + var err error + var sErr error + //err = errors.New("Not implemented") + + dbNotificationMap := make(map[db.DBNum][]*notificationInfo) + + resp := make ([]*IsSubscribeResponse, len(paths)) + + for i, _ := range resp { + resp[i] = &IsSubscribeResponse{Path: paths[i], + IsOnChangeSupported: false, + MinInterval: minSubsInterval, + PreferredType:Sample, + Err:nil} + } + + dbs, err := getAllDbs() + + if err != nil { + return resp, err + } + + //Do NOT close the DBs here as we need to use them during subscribe notification + + for i, path := range paths { + + app, appInfo, err := getAppModule(path) + + if err != nil { + + if sErr == nil { + sErr = err + } + + resp[i].Err = err + continue + } + + nOpts, nInfo, errApp := (*app).translateSubscribe (dbs, path) + + if errApp != nil { + resp[i].Err = errApp + + if sErr == nil { + sErr = errApp + } + + resp[i].MinInterval = maxSubsInterval + + if nOpts != nil { + if nOpts.mInterval != 0 { + resp[i].MinInterval = nOpts.mInterval + } + + resp[i].PreferredType = nOpts.pType + } + + continue + } else { + + if nOpts != nil { + if nOpts.mInterval != 0 { + resp[i].MinInterval = nOpts.mInterval + } + + resp[i].PreferredType = nOpts.pType + } + + if nInfo == nil { + sErr = tlerr.NotSupportedError{ + Format: "Subscribe not supported", Path: path} + resp[i].Err = sErr + continue + } + + resp[i].IsOnChangeSupported = true + + nInfo.path = path + nInfo.app = app + nInfo.appInfo = appInfo + nInfo.dbs = dbs + + dbNotificationMap[nInfo.dbno] = append(dbNotificationMap[nInfo.dbno], nInfo) + } + + } + + log.Info("map=", dbNotificationMap) + + if sErr != nil { + return resp, sErr + } + + sInfo := &subscribeInfo {syncDone:false, + q:q, + stop:stop} + + sErr = startSubscribe(sInfo, dbNotificationMap) + + return resp, sErr +} + +//Check if subscribe is supported on the given paths +func IsSubscribeSupported(paths []string) ([]*IsSubscribeResponse, error) { + + resp := make ([]*IsSubscribeResponse, len(paths)) + + for i, _ := range resp { + resp[i] = &IsSubscribeResponse{Path: paths[i], + IsOnChangeSupported: false, + MinInterval: minSubsInterval, + PreferredType:Sample, + Err:nil} + } + + dbs, err := getAllDbs() + + if err != nil { + return resp, err + } + + defer closeAllDbs(dbs[:]) + + for i, path := range paths { + + app, _, err := getAppModule(path) + + if err != nil { + resp[i].Err = err + continue + } + + nOpts, _, errApp := (*app).translateSubscribe (dbs, path) + + if errApp != nil { + resp[i].Err = errApp + err = errApp + continue + } else { + resp[i].IsOnChangeSupported= true + + if nOpts != nil { + if nOpts.mInterval != 0 { + resp[i].MinInterval = nOpts.mInterval + } + resp[i].PreferredType = nOpts.pType + } + } + } + + return resp, err +} + +//Gets all the models supported by Translib +func GetModels() ([]ModelData, error) { + var err error + + return getModels(), err +} + +//Creates connection will all the redis DBs. To be used for get request +func getAllDbs() ([db.MaxDB]*db.DB, error) { + var dbs [db.MaxDB]*db.DB + var err error + + //Create Application DB connection + dbs[db.ApplDB], err = db.NewDB(getDBOptions(db.ApplDB)) + + if err != nil { + closeAllDbs(dbs[:]) + return dbs, err + } + + //Create ASIC DB connection + dbs[db.AsicDB], err = db.NewDB(getDBOptions(db.AsicDB)) + + if err != nil { + closeAllDbs(dbs[:]) + return dbs, err + } + + //Create Counter DB connection + dbs[db.CountersDB], err = db.NewDB(getDBOptions(db.CountersDB)) + + if err != nil { + closeAllDbs(dbs[:]) + return dbs, err + } + + //Create Log Level DB connection + dbs[db.LogLevelDB], err = db.NewDB(getDBOptions(db.LogLevelDB)) + + if err != nil { + closeAllDbs(dbs[:]) + return dbs, err + } + + //Create Config DB connection + dbs[db.ConfigDB], err = db.NewDB(getDBOptions(db.ConfigDB)) + + if err != nil { + closeAllDbs(dbs[:]) + return dbs, err + } + + //Create Flex Counter DB connection + dbs[db.FlexCounterDB], err = db.NewDB(getDBOptions(db.FlexCounterDB)) + + if err != nil { + closeAllDbs(dbs[:]) + return dbs, err + } + + //Create State DB connection + dbs[db.StateDB], err = db.NewDB(getDBOptions(db.StateDB)) + + if err != nil { + closeAllDbs(dbs[:]) + return dbs, err + } + + return dbs, err +} + +//Closes the dbs, and nils out the arr. +func closeAllDbs(dbs []*db.DB) { + for dbsi, d := range dbs { + if d != nil { + d.DeleteDB() + dbs[dbsi] = nil + } + } +} + +// Implement Compare method for priority queue for SubscribeResponse struct +func (val SubscribeResponse) Compare(other queue.Item) int { + o := other.(*SubscribeResponse) + if val.Timestamp > o.Timestamp { + return 1 + } else if val.Timestamp == o.Timestamp { + return 0 + } + return -1 +} + +func getDBOptions(dbNo db.DBNum) db.Options { + var opt db.Options + + switch dbNo { + case db.ApplDB, db.CountersDB: + opt = getDBOptionsWithSeparator(dbNo, "", ":", ":") + break + case db.FlexCounterDB, db.AsicDB, db.LogLevelDB, db.ConfigDB, db.StateDB: + opt = getDBOptionsWithSeparator(dbNo, "", "|", "|") + break + } + + return opt +} + +func getDBOptionsWithSeparator(dbNo db.DBNum, initIndicator string, tableSeparator string, keySeparator string) db.Options { + return(db.Options { + DBNo : dbNo, + InitIndicator : initIndicator, + TableNameSeparator: tableSeparator, + KeySeparator : keySeparator, + }) +} + +func getAppModule (path string) (*appInterface, *appInfo, error) { + var app appInterface + + aInfo, err := getAppModuleInfo(path) + + if err != nil { + return nil, aInfo, err + } + + app, err = getAppInterface(aInfo.appType) + + if err != nil { + return nil, aInfo, err + } + + return &app, aInfo, err +} + +func appInitialize (app *appInterface, appInfo *appInfo, path string, payload *[]byte, opCode int) error { + var err error + var input []byte + + if payload != nil { + input = *payload + } + + if appInfo.isNative { + log.Info("Native MSFT format") + data := appData{path: path, payload: input} + (*app).initialize(data) + } else { + ygotStruct, ygotTarget, err := getRequestBinder (&path, payload, opCode, &(appInfo.ygotRootType)).unMarshall() + if err != nil { + log.Info("Error in request binding: ", err) + return err + } + + data := appData{path: path, payload: input, ygotRoot: ygotStruct, ygotTarget: ygotTarget} + (*app).initialize(data) + } + + return err +} diff --git a/src/translib/translib_test.go b/src/translib/translib_test.go new file mode 100644 index 0000000000..9ceb1e1a80 --- /dev/null +++ b/src/translib/translib_test.go @@ -0,0 +1,59 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package translib_test + +import ( + "fmt" + "path/filepath" + "reflect" + "runtime" + "testing" +) + +// assert fails the test if the condition is false. +func assert(tb testing.TB, condition bool, msg string, v ...interface{}) { + if !condition { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d: "+msg+"\033[39m\n\n", append([]interface{}{filepath.Base(file), line}, v...)...) + tb.FailNow() + } +} + +// ok fails the test if an err is not nil. +func ok(tb testing.TB, err error) { + if err != nil { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d: unexpected error: %s\033[39m\n\n", filepath.Base(file), line, err.Error()) + tb.FailNow() + } +} + +// equals fails the test if exp is not equal to act. +func equals(tb testing.TB, exp, act interface{}) { + if !reflect.DeepEqual(exp, act) { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act) + tb.FailNow() + } +} + +func Test_Create(t *testing.T) { + +} diff --git a/tools/.gitkeep b/tools/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/pyang/pyang_plugins/openapi.py b/tools/pyang/pyang_plugins/openapi.py new file mode 100644 index 0000000000..45a407d88d --- /dev/null +++ b/tools/pyang/pyang_plugins/openapi.py @@ -0,0 +1,832 @@ +################################################################################ +# # +# Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or # +# its subsidiaries. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# # +################################################################################ + +import optparse +import sys + +from pyang import plugin +from pyang import statements +import pdb +import yaml +from collections import OrderedDict +import copy +import os + +# globals +codegenTypesToYangTypesMap = {"int8": {"type":"integer", "format": "int32"}, + "int16": {"type":"integer", "format": "int32"}, + "int32": {"type":"integer", "format": "int32"}, + "int64": {"type":"integer", "format": "int64"}, + "uint8": {"type":"integer", "format": "int32"}, + "uint16": {"type":"integer", "format": "int32"}, + "uint32": {"type":"integer", "format": "int32"}, + "uint64": {"type":"integer", "format": "int64"}, + "decimal64": {"type":"number", "format": "double"}, + "string": {"type":"string"}, + "binary": {"type":"string", "format": "binary"}, + "boolean": {"type":"boolean"}, + "bits": {"type":"integer", "format": "int32"}, + "identityref": {"type":"string"}, + "union": {"type":"string"}, + "counter32": {"type":"integer", "format": "int64"}, + "counter64": {"type":"integer", "format": "int64"}, + "long": {"type":"integer", "format": "int64"}, + } +moduleDict = OrderedDict() +nodeDict = OrderedDict() +XpathToBodyTagDict = OrderedDict() +keysToLeafRefObjSet = set() +currentTag = None +base_path = '/restconf/data' +verbs = ["post", "put", "patch", "get", "delete"] +responses = { # Common to all verbs + "500": {"description": "Internal Server Error"}, + "401": {"description": "Unauthorized"}, + "405": {"description": "Method Not Allowed"}, + "400": {"description": "Bad request"}, + "415": {"description": "Unsupported Media Type"}, +} +verb_responses = {} +verb_responses["post"] = { + "201": {"description": "Created"}, + "409": {"description": "Conflict"}, + "404": {"description": "Not Found"}, + "403": {"description": "Forbidden"}, +} +verb_responses["put"] = { + "201": {"description": "Created"}, + "204": {"description": "No Content"}, + "404": {"description": "Not Found"}, + "409": {"description": "Conflict"}, + "403": {"description": "Forbidden"}, +} +verb_responses["patch"] = { + "204": {"description": "No Content"}, + "404": {"description": "Not Found"}, + "409": {"description": "Conflict"}, + "403": {"description": "Forbidden"}, +} +verb_responses["delete"] = { + "204": {"description": "No Content"}, + "404": {"description": "Not Found"}, +} +verb_responses["get"] = { + "200": {"description": "Ok"}, + "404": {"description": "Not Found"}, +} + +def merge_two_dicts(x, y): + z = x.copy() # start with x's keys and values + z.update(y) # modifies z with y's keys and values & returns None + return z + +def ordered_dump(data, stream=None, Dumper=yaml.Dumper, **kwds): + class OrderedDumper(Dumper): + pass + def _dict_representer(dumper, data): + return dumper.represent_mapping( + yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, + data.items()) + OrderedDumper.add_representer(OrderedDict, _dict_representer) + return yaml.dump(data, stream, OrderedDumper, **kwds) + +swaggerDict = OrderedDict() +swaggerDict["swagger"] = "2.0" +swaggerDict["info"] = OrderedDict() +swaggerDict["info"]["description"] = "Network management Open APIs for Broadcom's Sonic." +swaggerDict["info"]["version"] = "1.0.0" +swaggerDict["info"]["title"] = "SONiC Network Management APIs" +swaggerDict["basePath"] = base_path +swaggerDict["schemes"] = ["https", "http"] +swagger_tags = [] +swaggerDict["tags"] = swagger_tags +swaggerDict["paths"] = OrderedDict() +swaggerDict["definitions"] = OrderedDict() + +def resetSwaggerDict(): + global moduleDict + global nodeDict + global XpathToBodyTagDict + global keysToLeafRefObjSet + global swaggerDict + global swagger_tags + global currentTag + + moduleDict = OrderedDict() + XpathToBodyTagDict = OrderedDict() + keysToLeafRefObjSet = set() + + swaggerDict = OrderedDict() + swaggerDict["swagger"] = "2.0" + swaggerDict["info"] = OrderedDict() + swaggerDict["info"]["description"] = "Network management Open APIs for Sonic." + swaggerDict["info"]["version"] = "1.0.0" + swaggerDict["info"]["title"] = "Sonic Network Management APIs" + swaggerDict["basePath"] = base_path + swaggerDict["schemes"] = ["https", "http"] + swagger_tags = [] + currentTag = None + swaggerDict["tags"] = swagger_tags + swaggerDict["paths"] = OrderedDict() + swaggerDict["definitions"] = OrderedDict() + +def pyang_plugin_init(): + plugin.register_plugin(OpenApiPlugin()) + +class OpenApiPlugin(plugin.PyangPlugin): + def add_output_format(self, fmts): + self.multiple_modules = True + fmts['swaggerapi'] = self + + def add_opts(self, optparser): + optlist = [ + optparse.make_option("--outdir", + type="string", + dest="outdir", + help="Output directory for specs"), + ] + g = optparser.add_option_group("OpenApiPlugin options") + g.add_options(optlist) + + def setup_fmt(self, ctx): + ctx.implicit_errors = False + + def emit(self, ctx, modules, fd): + + global currentTag + + if ctx.opts.outdir is None: + print("[Error]: Output directory is not mentioned") + sys.exit(2) + + if not os.path.exists(ctx.opts.outdir): + print("[Error]: Specified outdir: ", ctx.opts.outdir, " does not exists") + sys.exit(2) + + for module in modules: + print("===> processing ", module.i_modulename) + if module.keyword == "submodule": + continue + resetSwaggerDict() + currentTag = module.i_modulename + walk_module(module) + # delete root '/' as we dont support it. + + if len(swaggerDict["paths"]) > 0: + if "/" in swaggerDict["paths"]: + del(swaggerDict["paths"]["/"]) + + if len(swaggerDict["paths"]) <= 0: + continue + + # check if file is same + yamlFn = ctx.opts.outdir + '/' + module.i_modulename + ".yaml" + code = ordered_dump(swaggerDict, Dumper=yaml.SafeDumper) + if os.path.isfile(yamlFn): + f=open(yamlFn,'r') + oldCode = f.read() + if (oldCode==code): + print('code unchanged.. skipping write for file:'+yamlFn) + f.close() + continue + else: + print('code changed.. overwriting file:'+yamlFn) + fout = open(yamlFn,'w') + fout.write(code) + fout.close() + else: + with open(ctx.opts.outdir + '/' + module.i_modulename + ".yaml", "w") as spec: + spec.write(ordered_dump(swaggerDict, Dumper=yaml.SafeDumper)) + +def walk_module(module): + for child in module.i_children: + walk_child(child) + +def add_swagger_tag(module): + if module.i_modulename not in moduleDict: + moduleDict[module.i_modulename] = OrderedDict() + moduleDict[module.i_modulename]["name"] = module.i_modulename + moduleDict[module.i_modulename]["description"] = "Operations for " + module.i_modulename + swagger_tags.append(moduleDict[module.i_modulename]) + else: + return + +def swagger_it(child, defName, pathstr, payload, metadata, verb, operId=False): + + firstEncounter = True + verbPathStr = pathstr + global currentTag + if verb == "post": + pathstrList = pathstr.split('/') + pathstrList.pop() + verbPathStr = "/".join(pathstrList) + if not verbPathStr.startswith("/"): + verbPathStr = "/" + verbPathStr + + if verbPathStr not in swaggerDict["paths"]: + swaggerDict["paths"][verbPathStr] = OrderedDict() + + if verb not in swaggerDict["paths"][verbPathStr]: + swaggerDict["paths"][verbPathStr][verb] = OrderedDict() + swaggerDict["paths"][verbPathStr][verb]["tags"] = [currentTag] + if verb != "delete" and verb != "get": + swaggerDict["paths"][verbPathStr][verb]["consumes"] = ["application/yang-data+json"] + swaggerDict["paths"][verbPathStr][verb]["produces"] = ["application/yang-data+json"] + swaggerDict["paths"][verbPathStr][verb]["parameters"] = [] + swaggerDict["paths"][verbPathStr][verb]["responses"] = copy.deepcopy(merge_two_dicts(responses, verb_responses[verb])) + firstEncounter = False + + opId = None + if "operationId" not in swaggerDict["paths"][verbPathStr][verb]: + if not operId: + swaggerDict["paths"][verbPathStr][verb]["operationId"] = verb + '_' + defName + else: + swaggerDict["paths"][verbPathStr][verb]["operationId"] = operId + + opId = swaggerDict["paths"][verbPathStr][verb]["operationId"] + + desc = child.search_one('description') + if desc is None: + desc = '' + else: + desc = desc.arg + desc = "OperationId: " + opId + "\n" + desc + swaggerDict["paths"][verbPathStr][verb]["description"] = desc + + else: + opId = swaggerDict["paths"][verbPathStr][verb]["operationId"] + + verbPath = swaggerDict["paths"][verbPathStr][verb] + + if not firstEncounter: + for meta in metadata: + metaTag = OrderedDict() + metaTag["in"] = "path" + metaTag["name"] = meta["name"] + metaTag["required"] = True + metaTag["type"] = meta["type"] + if 'enums' in meta: + metaTag["enum"] = meta["enums"] + if hasattr(meta,'format'): + if meta["format"] != "": + metaTag["format"] = meta["format"] + metaTag["description"] = meta["desc"] + verbPath["parameters"].append(metaTag) + + + if verb in ["post", "put", "patch"]: + if not firstEncounter: + bodyTag = OrderedDict() + bodyTag["in"] = "body" + bodyTag["name"] = "body" + bodyTag["required"] = True + bodyTag["schema"] = OrderedDict() + operationDefnName = opId + swaggerDict["definitions"][operationDefnName] = OrderedDict() + swaggerDict["definitions"][operationDefnName]["allOf"] = [] + bodyTag["schema"]["$ref"] = "#/definitions/" + operationDefnName + verbPath["parameters"].append(bodyTag) + swaggerDict["definitions"][operationDefnName]["allOf"].append({"$ref" : "#/definitions/" + defName}) + else: + bodyTag = None + for entry in verbPath["parameters"]: + if entry["name"] == "body" and entry["in"] == "body": + bodyTag = entry + break + operationDefnName = bodyTag["schema"]["$ref"].split('/')[-1] + swaggerDict["definitions"][operationDefnName]["allOf"].append({"$ref" : "#/definitions/" + defName}) + + if verb == "get": + verbPath["responses"]["200"]["schema"] = OrderedDict() + verbPath["responses"]["200"]["schema"]["$ref"] = "#/definitions/" + defName + +def walk_child(child): + global XpathToBodyTagDict + + actXpath = statements.mk_path_str(child, True) + metadata = [] + keyNodesInPath = [] + pathstr = mk_path_refine(child, metadata, keyNodesInPath) + + if actXpath in keysToLeafRefObjSet: + return + + if child.keyword in ["list", "container", "leaf", "leaf-list"]: + payload = OrderedDict() + + add_swagger_tag(child.i_module) + build_payload(child, payload, pathstr, True, actXpath, True) + + if len(payload) == 0 and child.i_config == True: + return + + if child.keyword == "leaf" or child.keyword == "leaf-list": + if hasattr(child, 'i_is_key'): + if child.i_leafref is not None: + listKeyPath = statements.mk_path_str(child.i_leafref_ptr[0], True) + if listKeyPath not in keysToLeafRefObjSet: + keysToLeafRefObjSet.add(listKeyPath) + return + + defName = shortenNodeName(child) + + if child.i_config == False: + payload_get = OrderedDict() + build_payload(child, payload_get, pathstr, True, actXpath, True, True) + if len(payload_get) == 0: + return + + defName_get = "get" + '_' + defName + swaggerDict["definitions"][defName_get] = OrderedDict() + swaggerDict["definitions"][defName_get]["type"] = "object" + swaggerDict["definitions"][defName_get]["properties"] = copy.deepcopy(payload_get) + swagger_it(child, defName_get, pathstr, payload_get, metadata, "get", defName_get) + else: + swaggerDict["definitions"][defName] = OrderedDict() + swaggerDict["definitions"][defName]["type"] = "object" + swaggerDict["definitions"][defName]["properties"] = copy.deepcopy(payload) + + for verb in verbs: + if child.keyword == "leaf-list": + metadata_leaf_list = [] + keyNodesInPath_leaf_list = [] + pathstr_leaf_list = mk_path_refine(child, metadata_leaf_list, keyNodesInPath_leaf_list, True) + + if verb == "get": + payload_get = OrderedDict() + build_payload(child, payload_get, pathstr, True, actXpath, True, True) + if len(payload_get) == 0: + continue + defName_get = "get" + '_' + defName + swaggerDict["definitions"][defName_get] = OrderedDict() + swaggerDict["definitions"][defName_get]["type"] = "object" + swaggerDict["definitions"][defName_get]["properties"] = copy.deepcopy(payload_get) + swagger_it(child, defName_get, pathstr, payload_get, metadata, verb, defName_get) + + if child.keyword == "leaf-list": + defName_get_leaf_list = "get" + '_llist_' + defName + swagger_it(child, defName_get, pathstr_leaf_list, payload_get, metadata_leaf_list, verb, defName_get_leaf_list) + + continue + + if verb == "post" and child.keyword == "list": + continue + + if verb == "delete" and child.keyword == "container": + # Check to see if any of the child is part of + # key list, if so skip delete operation + if isUriKeyInPayload(child,keyNodesInPath): + continue + + swagger_it(child, defName, pathstr, payload, metadata, verb) + if verb == "delete" and child.keyword == "leaf-list": + defName_del_leaf_list = "del" + '_llist_' + defName + swagger_it(child, defName, pathstr_leaf_list, payload, metadata_leaf_list, verb, defName_del_leaf_list) + + if child.keyword == "list": + listMetaData = copy.deepcopy(metadata) + walk_child_for_list_base(child,actXpath,pathstr, listMetaData, defName) + + if hasattr(child, 'i_children'): + for ch in child.i_children: + walk_child(ch) + +def walk_child_for_list_base(child, actXpath, pathstr, metadata, nonBaseDefName=None): + + payload = OrderedDict() + pathstrList = pathstr.split('/') + + lastNode = pathstrList[-1] + nodeName = lastNode.split('=')[0] + pathstrList.pop() + pathstrList.append(nodeName) + + verbPathStr = "/".join(pathstrList) + if not verbPathStr.startswith("/"): + pathstr = "/" + verbPathStr + else: + pathstr = verbPathStr + + for key in child.i_key: + metadata.pop() + + add_swagger_tag(child.i_module) + build_payload(child, payload, pathstr, False, "", True) + + if len(payload) == 0 and child.i_config == True: + return + + defName = shortenNodeName(child) + defName = "list"+'_'+defName + + if child.i_config == False: + + payload_get = OrderedDict() + build_payload(child, payload_get, pathstr, False, "", True, True) + + if len(payload_get) == 0: + return + + defName_get = "get" + '_' + defName + if nonBaseDefName is not None: + swagger_it(child, "get" + '_' + nonBaseDefName, pathstr, payload_get, metadata, "get", defName_get) + else: + swaggerDict["definitions"][defName_get] = OrderedDict() + swaggerDict["definitions"][defName_get]["type"] = "object" + swaggerDict["definitions"][defName_get]["properties"] = copy.deepcopy(payload_get) + swagger_it(child, defName_get, pathstr, payload_get, metadata, "get", defName_get) + else: + if nonBaseDefName is None: + swaggerDict["definitions"][defName] = OrderedDict() + swaggerDict["definitions"][defName]["type"] = "object" + swaggerDict["definitions"][defName]["properties"] = copy.deepcopy(payload) + + for verb in verbs: + if verb == "get": + payload_get = OrderedDict() + build_payload(child, payload_get, pathstr, False, "", True, True) + + if len(payload_get) == 0: + continue + + defName_get = "get" + '_' + defName + if nonBaseDefName is not None: + swagger_it(child, "get" + '_' + nonBaseDefName, pathstr, payload_get, metadata, verb, defName_get) + else: + swaggerDict["definitions"][defName_get] = OrderedDict() + swaggerDict["definitions"][defName_get]["type"] = "object" + swaggerDict["definitions"][defName_get]["properties"] = copy.deepcopy(payload_get) + swagger_it(child, defName_get, pathstr, payload_get, metadata, verb, defName_get) + continue + + if nonBaseDefName is not None: + swagger_it(child, nonBaseDefName, pathstr, payload, metadata, verb, verb + '_' + defName) + else: + swagger_it(child, defName, pathstr, payload, metadata, verb, verb + '_' + defName) + +def build_payload(child, payloadDict, uriPath="", oneInstance=False, Xpath="", firstCall=False, config_false=False, moduleList=[]): + + nodeModuleName = child.i_module.i_modulename + if nodeModuleName not in moduleList: + moduleList.append(nodeModuleName) + firstCall = True + + global keysToLeafRefObjSet + + if child.i_config == False and not config_false: + return # temporary + + chs=[] + try: + chs = [ch for ch in child.i_children + if ch.keyword in statements.data_definition_keywords] + except: + # do nothing as it could be due to i_children not present + pass + + childJson = None + if child.keyword == "container" and len(chs) > 0: + if firstCall: + nodeName = child.i_module.i_modulename + ':' + child.arg + else: + nodeName = child.arg + payloadDict[nodeName] = OrderedDict() + payloadDict[nodeName]["type"] = "object" + payloadDict[nodeName]["properties"] = OrderedDict() + childJson = payloadDict[nodeName]["properties"] + + elif child.keyword == "list" and len(chs) > 0: + if firstCall: + nodeName = child.i_module.i_modulename + ':' + child.arg + else: + nodeName = child.arg + payloadDict[nodeName] = OrderedDict() + returnJson = None + + payloadDict[nodeName]["type"] = "array" + payloadDict[nodeName]["items"] = OrderedDict() + payloadDict[nodeName]["items"]["type"] = "object" + payloadDict[nodeName]["items"]["required"] = [] + + for listKey in child.i_key: + payloadDict[nodeName]["items"]["required"].append(listKey.arg) + + payloadDict[nodeName]["items"]["properties"] = OrderedDict() + returnJson = payloadDict[nodeName]["items"]["properties"] + + childJson = returnJson + + elif child.keyword == "leaf": + + if firstCall: + nodeName = child.i_module.i_modulename + ':' + child.arg + else: + nodeName = child.arg + payloadDict[nodeName] = OrderedDict() + typeInfo = getType(child) + enums = None + if isinstance(typeInfo, tuple): + enums = typeInfo[1] + typeInfo = typeInfo[0] + + if 'type' in typeInfo: + dType = typeInfo["type"] + else: + dType = "string" + + payloadDict[nodeName]["type"] = dType + if enums is not None: + payloadDict[nodeName]["enum"] = enums + + if 'format' in typeInfo: + payloadDict[nodeName]["format"] = typeInfo["format"] + + elif child.keyword == "leaf-list": + + if firstCall: + nodeName = child.i_module.i_modulename + ':' + child.arg + else: + nodeName = child.arg + + payloadDict[nodeName] = OrderedDict() + payloadDict[nodeName]["type"] = "array" + payloadDict[nodeName]["items"] = OrderedDict() + + typeInfo = getType(child) + enums = None + if isinstance(typeInfo, tuple): + enums = typeInfo[1] + typeInfo = typeInfo[0] + + if 'type' in typeInfo: + dType = typeInfo["type"] + else: + dType = "string" + + payloadDict[nodeName]["items"]["type"] = dType + if enums is not None: + payloadDict[nodeName]["items"]["enum"] = enums + + if 'format' in typeInfo: + payloadDict[nodeName]["items"]["format"] = typeInfo["format"] + + elif child.keyword == "choice" or child.keyword == "case": + childJson = payloadDict + + if hasattr(child, 'i_children'): + for ch in child.i_children: + build_payload(ch,childJson,uriPath, False, Xpath, False, config_false, copy.deepcopy(moduleList)) + +def mk_path_refine(node, metadata, keyNodes=[], restconf_leaflist=False): + def mk_path(node): + """Returns the XPath path of the node""" + if node.keyword in ['choice', 'case']: + return mk_path(node.parent) + def name(node): + extra = "" + if node.keyword == "leaf-list" and restconf_leaflist: + extraKeys = [] + extraKeys.append('{' + node.arg + '}') + desc = node.search_one('description') + if desc is None: + desc = '' + else: + desc = desc.arg + metaInfo = OrderedDict() + metaInfo["desc"] = desc + metaInfo["name"] = node.arg + metaInfo["type"] = "string" + metaInfo["format"] = "" + metadata.append(metaInfo) + extra = ",".join(extraKeys) + + if node.keyword == "list": + extraKeys = [] + for index, list_key in enumerate(node.i_key): + keyNodes.append(list_key) + if list_key.i_leafref is not None: + keyNodes.append(list_key.i_leafref_ptr[0]) + extraKeys.append('{' + list_key.arg + '}') + desc = list_key.search_one('description') + if desc is None: + desc = '' + else: + desc = desc.arg + metaInfo = OrderedDict() + metaInfo["desc"] = desc + metaInfo["name"] = list_key.arg + typeInfo = getType(list_key) + + if isinstance(typeInfo, tuple): + metaInfo["enums"] = typeInfo[1] + typeInfo = typeInfo[0] + + if 'type' in typeInfo: + dType = typeInfo["type"] + else: + dType = "string" + + metaInfo["type"] = dType + + if 'format' in typeInfo: + metaInfo["format"] = typeInfo["format"] + else: + metaInfo["format"] = "" + + metadata.append(metaInfo) + extra = ",".join(extraKeys) + + if len(extra) > 0: + xpathToReturn = node.i_module.i_modulename + ':' + node.arg + '=' + extra + else: + xpathToReturn = node.i_module.i_modulename + ':' + node.arg + return xpathToReturn + + if node.parent.keyword in ['module', 'submodule']: + return "/" + name(node) + else: + p = mk_path(node.parent) + return p + "/" + name(node) + + xpath = mk_path(node) + module_name = "" + final_xpathList = [] + for path in xpath.split('/')[1:]: + mod_name, node_name = path.split(':') + if mod_name != module_name: + final_xpathList.append(path) + module_name = mod_name + else: + final_xpathList.append(node_name) + + xpath = "/".join(final_xpathList) + if not xpath.startswith('/'): + xpath = '/' + xpath + return xpath + +def handle_leafref(node,xpath): + path_type_spec = node.i_leafref + target_node = path_type_spec.i_target_node + if target_node.keyword in ["leaf", "leaf-list"]: + return getType(target_node) + else: + print("leafref not pointing to leaf/leaflist") + sys.exit(2) + +def shortenNodeName(node): + global nodeDict + xpath = statements.mk_path_str(node, False) + name = node.i_module.i_modulename + xpath.replace('/','_') + name = name.replace('-','_').lower() + if name not in nodeDict: + nodeDict[name] = xpath + else: + while name in nodeDict: + if xpath == nodeDict[name]: + break + name = node.i_module.i_modulename + '_' + name + name = name.replace('-','_').lower() + nodeDict[name] = xpath + return name + +def getCamelForm(moName): + hasHiphen = False + moName = moName.replace('_','-') + if '-' in moName: + hasHiphen = True + + while (hasHiphen): + index = moName.find('-') + if index != -1: + moNameList = list(moName) + # capitalize character hiphen + moNameList[index+1] = moNameList[index+1].upper() + # delete '-' + del(moNameList[index]) + moName = "".join(moNameList) + + if '-' in moName: + hasHiphen = True + else: + hasHiphen = False + else: + break + + return moName + +def getType(node): + + global codegenTypesToYangTypesMap + xpath = statements.mk_path_str(node, True) + + def resolveType(stmt, nodeType): + if nodeType == "string" \ + or nodeType == "instance-identifier" \ + or nodeType == "identityref": + return codegenTypesToYangTypesMap["string"] + elif nodeType == "enumeration": + enums = [] + for enum in stmt.substmts: + if enum.keyword == "enum": + enums.append(enum.arg) + return codegenTypesToYangTypesMap["string"], enums + elif nodeType == "empty" or nodeType == "boolean": + return {"type": "boolean", "format": "boolean"} + elif nodeType == "leafref": + return handle_leafref(node,xpath) + elif nodeType == "union": + return codegenTypesToYangTypesMap["string"] + elif nodeType == "decimal64": + return codegenTypesToYangTypesMap[nodeType] + elif nodeType in ['int8', 'int16', 'int32', 'int64', + 'uint8', 'uint16', 'uint32', 'uint64', 'binary', 'bits']: + return codegenTypesToYangTypesMap[nodeType] + else: + print("no base type found") + sys.exit(2) + + base_types = ['int8', 'int16', 'int32', 'int64', + 'uint8', 'uint16', 'uint32', 'uint64', + 'decimal64', 'string', 'boolean', 'enumeration', + 'bits', 'binary', 'leafref', 'identityref', 'empty', + 'union', 'instance-identifier' + ] + # Get Type of a node + t = node.search_one('type') + + while t.arg not in base_types: + # chase typedef + name = t.arg + if name.find(":") == -1: + prefix = None + else: + [prefix, name] = name.split(':', 1) + if prefix is None or t.i_module.i_prefix == prefix: + # check local typedefs + pmodule = node.i_module + typedef = statements.search_typedef(t, name) + else: + # this is a prefixed name, check the imported modules + err = [] + pmodule = statements.prefix_to_module(t.i_module,prefix,t.pos,err) + if pmodule is None: + return + typedef = statements.search_typedef(pmodule, name) + + if typedef is None: + print("Typedef ", name, " is not found, make sure all dependent modules are present") + sys.exit(2) + t=typedef.search_one('type') + + return resolveType(t, t.arg) + + +class Abort(Exception): + """used to abort an iteration""" + pass + +def isUriKeyInPayload(stmt, keyNodesList): + result = False # atleast one key is present + + def checkFunc(node): + result = "continue" + if node in keyNodesList: + result = "stop" + return result + + def _iterate(stmt): + res = "continue" + if stmt.keyword == "leaf" or \ + stmt.keyword == "leaf-list": + res = checkFunc(stmt) + if res == 'stop': + raise Abort + else: + # default is to recurse + if hasattr(stmt, 'i_children'): + for s in stmt.i_children: + _iterate(s) + + try: + _iterate(stmt) + except Abort: + result = True + + return result + diff --git a/tools/pyang/pyang_plugins/yin_cvl.py b/tools/pyang/pyang_plugins/yin_cvl.py new file mode 100644 index 0000000000..71689003b0 --- /dev/null +++ b/tools/pyang/pyang_plugins/yin_cvl.py @@ -0,0 +1,179 @@ +################################################################################ +# # +# Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or # +# its subsidiaries. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# # +################################################################################ +"""CVL YIN output plugin""" + +from xml.sax.saxutils import quoteattr +from xml.sax.saxutils import escape + +import optparse +import re + +from pyang import plugin +from pyang import util +from pyang import grammar +from pyang import syntax +from pyang import statements + +new_line ='' #replace with '\n' for adding new line +indent_space = '' #replace with ' ' for indentation +ns_indent_space = '' #replace with ' ' for indentation +yin_namespace = "urn:ietf:params:xml:ns:yang:yin:1" +revision_added = False + +def pyang_plugin_init(): + plugin.register_plugin(YINPluginCVL()) + +class YINPluginCVL(plugin.PyangPlugin): + def add_output_format(self, fmts): + fmts['yin-cvl'] = self + def emit(self, ctx, modules, fd): + module = modules[0] + emit_yin(ctx, module, fd) + +def emit_yin(ctx, module, fd): + fd.write('' + new_line) + fd.write(('<%s name="%s"' + new_line) % (module.keyword, module.arg)) + fd.write(ns_indent_space * len(module.keyword) + ns_indent_space + ' xmlns="%s"' % yin_namespace) + + prefix = module.search_one('prefix') + if prefix is not None: + namespace = module.search_one('namespace') + fd.write('' + new_line) + fd.write(ns_indent_space * len(module.keyword)) + fd.write(ns_indent_space + ' xmlns:' + prefix.arg + '=' + + quoteattr(namespace.arg)) + else: + belongs_to = module.search_one('belongs-to') + if belongs_to is not None: + prefix = belongs_to.search_one('prefix') + if prefix is not None: + # read the parent module in order to find the namespace uri + res = ctx.read_module(belongs_to.arg, extra={'no_include':True}) + if res is not None: + namespace = res.search_one('namespace') + if namespace is None or namespace.arg is None: + pass + else: + # success - namespace found + fd.write('' + new_line) + fd.write(sonic-acl.yin * len(module.keyword)) + fd.write(sonic-acl.yin + ' xmlns:' + prefix.arg + '=' + + quoteattr(namespace.arg)) + + for imp in module.search('import'): + prefix = imp.search_one('prefix') + if prefix is not None: + rev = None + r = imp.search_one('revision-date') + if r is not None: + rev = r.arg + mod = statements.modulename_to_module(module, imp.arg, rev) + if mod is not None: + ns = mod.search_one('namespace') + if ns is not None: + fd.write('' + new_line) + fd.write(ns_indent_space * len(module.keyword)) + fd.write(ns_indent_space + ' xmlns:' + prefix.arg + '=' + + quoteattr(ns.arg)) + fd.write('>' + new_line) + + substmts = module.substmts + for s in substmts: + emit_stmt(ctx, module, s, fd, indent_space, indent_space) + fd.write(('' + new_line) % module.keyword) + +def emit_stmt(ctx, module, stmt, fd, indent, indentstep): + global revision_added + + if stmt.raw_keyword == "revision" and revision_added == False: + revision_added = True + elif stmt.raw_keyword == "revision" and revision_added == True: + #Only add the latest revision + return + + #Don't keep the following keywords as they are not used in CVL + # stmt.raw_keyword == "revision" or + if ((stmt.raw_keyword == "organization" or + stmt.raw_keyword == "contact" or + stmt.raw_keyword == "rpc" or + stmt.raw_keyword == "notification" or + stmt.raw_keyword == "description") or + (len(stmt.substmts) > 0 and stmt.substmts[0].raw_keyword == "config" and + stmt.substmts[0].arg == "false")): + return + + if util.is_prefixed(stmt.raw_keyword): + # this is an extension. need to find its definition + (prefix, identifier) = stmt.raw_keyword + tag = prefix + ':' + identifier + if stmt.i_extension is not None: + ext_arg = stmt.i_extension.search_one('argument') + if ext_arg is not None: + yin_element = ext_arg.search_one('yin-element') + if yin_element is not None and yin_element.arg == 'true': + argname = prefix + ':' + ext_arg.arg + argiselem = True + else: + # explicit false or no yin-element given + argname = ext_arg.arg + argiselem = False + else: + argiselem = False + argname = None + else: + argiselem = False + argname = None + else: + (argname, argiselem) = syntax.yin_map[stmt.raw_keyword] + tag = stmt.raw_keyword + if argiselem == False or argname is None: + if argname is None: + attr = '' + else: + attr = ' ' + argname + '=' + quoteattr(stmt.arg) + if len(stmt.substmts) == 0: + fd.write(indent + '<' + tag + attr + '/>' + new_line) + else: + fd.write(indent + '<' + tag + attr + '>' + new_line) + for s in stmt.substmts: + emit_stmt(ctx, module, s, fd, indent + indentstep, + indentstep) + fd.write(indent + '' + new_line) + else: + fd.write(indent + '<' + tag + '>' + new_line) + fd.write(indent + indentstep + '<' + argname + '>' + \ + escape(stmt.arg) + \ + '' + new_line) + substmts = stmt.substmts + + for s in substmts: + emit_stmt(ctx, module, s, fd, indent + indentstep, indentstep) + + fd.write(indent + '' + new_line) + +def fmt_text(indent, data): + res = [] + for line in re.split("(\n)", escape(data)): + if line == '': + continue + if line == '' + new_line: + res.extend(line) + else: + res.extend(indent + line) + return ''.join(res) diff --git a/tools/swagger_codegen/.gitignore b/tools/swagger_codegen/.gitignore new file mode 100644 index 0000000000..31be659360 --- /dev/null +++ b/tools/swagger_codegen/.gitignore @@ -0,0 +1 @@ +swagger-codegen-*.jar diff --git a/tools/swagger_codegen/go-server/src/swagger/routes.go b/tools/swagger_codegen/go-server/src/swagger/routes.go new file mode 100644 index 0000000000..ce305b72aa --- /dev/null +++ b/tools/swagger_codegen/go-server/src/swagger/routes.go @@ -0,0 +1,24 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or // +// its subsidiaries. // +// // +// Licensed under the Apache License, Version 2.0 (the "License"); // +// you may not use this file except in compliance with the License. // +// You may obtain a copy of the License at // +// // +// http://www.apache.org/licenses/LICENSE-2.0 // +// // +// Unless required by applicable law or agreed to in writing, software // +// distributed under the License is distributed on an "AS IS" BASIS, // +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // +// See the License for the specific language governing permissions and // +// limitations under the License. // +// // +//////////////////////////////////////////////////////////////////////////////// + +package swagger + +// Load function logs swagger generated routes into REST server. +func Load() { +} diff --git a/tools/swagger_codegen/go-server/templates-nonyang/README.mustache b/tools/swagger_codegen/go-server/templates-nonyang/README.mustache new file mode 100644 index 0000000000..89019f8e21 --- /dev/null +++ b/tools/swagger_codegen/go-server/templates-nonyang/README.mustache @@ -0,0 +1,30 @@ +# Go API Server for {{packageName}} + +{{#appDescription}} +{{{appDescription}}} +{{/appDescription}} + +## Overview +This server was generated by the [swagger-codegen] +(https://github.com/swagger-api/swagger-codegen) project. +By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub. +- + +To see how to make this your own, look here: + +[README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md) + +- API version: {{appVersion}}{{^hideGenerationTimestamp}} +- Build date: {{generatedDate}}{{/hideGenerationTimestamp}} +{{#infoUrl}} +For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}}) +{{/infoUrl}} + + +### Running the server +To run the server, follow these simple steps: + +``` +go run main.go +``` + diff --git a/tools/swagger_codegen/go-server/templates-nonyang/controller-api.mustache b/tools/swagger_codegen/go-server/templates-nonyang/controller-api.mustache new file mode 100644 index 0000000000..c1bbec0e8c --- /dev/null +++ b/tools/swagger_codegen/go-server/templates-nonyang/controller-api.mustache @@ -0,0 +1,24 @@ +{{>partial_header}} +package {{packageName}} + +{{#operations}} +import ( + "net/http" + + "rest/server" +){{#operation}} + +func {{nickname}}(w http.ResponseWriter, r *http.Request) { + rc, r := server.GetContext(r) + rc.Name = "{{operationId}}" + {{#consumes}} + rc.Consumes.Add("{{mediaType}}") + {{/consumes}} + {{#produces}} + rc.Produces.Add("{{mediaType}}") + {{/produces}} + {{#bodyParam.required}} + rc.Model = &{{bodyParam.dataType}}{} + {{/bodyParam.required}} + server.Process(w, r) +}{{/operation}}{{/operations}} diff --git a/tools/swagger_codegen/go-server/templates-nonyang/logger.mustache b/tools/swagger_codegen/go-server/templates-nonyang/logger.mustache new file mode 100644 index 0000000000..aa0d894d83 --- /dev/null +++ b/tools/swagger_codegen/go-server/templates-nonyang/logger.mustache @@ -0,0 +1,24 @@ +{{>partial_header}} +package {{packageName}} + +import ( + "log" + "net/http" + "time" +) + +func Logger(inner http.Handler, name string) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + start := time.Now() + + inner.ServeHTTP(w, r) + + log.Printf( + "%s %s %s %s", + r.Method, + r.RequestURI, + name, + time.Since(start), + ) + }) +} diff --git a/tools/swagger_codegen/go-server/templates-nonyang/main.mustache b/tools/swagger_codegen/go-server/templates-nonyang/main.mustache new file mode 100644 index 0000000000..5a1de41602 --- /dev/null +++ b/tools/swagger_codegen/go-server/templates-nonyang/main.mustache @@ -0,0 +1,33 @@ +{{>partial_header}} +package main + +import ( + "flag" + "fmt" + "log" + "net/http" + + // WARNING! + // Change this to a fully-qualified import path + // once you place this file into your project. + // For example, + // + // sw "github.com/myname/myrepo/{{apiPath}}" + // + sw "./{{apiPath}}" +) + +func main() { + var port int + + flag.IntVar(&port, "port", {{serverPort}}, "Listen port") + flag.Parse() + + address := fmt.Sprintf(":%d", port) + + log.Printf("Server started on %s", address) + + router := sw.NewRouter() + + log.Fatal(http.ListenAndServe(address, router)) +} diff --git a/tools/swagger_codegen/go-server/templates-nonyang/model.mustache b/tools/swagger_codegen/go-server/templates-nonyang/model.mustache new file mode 100644 index 0000000000..8754da0581 --- /dev/null +++ b/tools/swagger_codegen/go-server/templates-nonyang/model.mustache @@ -0,0 +1,32 @@ +{{>partial_header}} +package {{packageName}} +{{#models}}{{#imports}} +import ({{/imports}}{{#imports}} + "{{import}}"{{/imports}}{{#imports}} +) +{{/imports}}{{#model}}{{#isEnum}}{{#description}}// {{{classname}}} : {{{description}}}{{/description}} +type {{{name}}} {{^format}}{{dataType}}{{/format}}{{#format}}{{{format}}}{{/format}} + +// List of {{{name}}} +const ( + {{#allowableValues}} + {{#enumVars}} + {{name}} {{{classname}}} = "{{{value}}}" + {{/enumVars}} + {{/allowableValues}} +){{/isEnum}}{{^isEnum}}{{#description}} +// {{{description}}}{{/description}} +type {{classname}} struct { +{{#requiredVars}} + {{name}} {{^isEnum}}{{^isPrimitiveType}}{{^isContainer}}{{^isDateTime}}*{{/isDateTime}}{{/isContainer}}{{/isPrimitiveType}}{{/isEnum}}{{{datatype}}} `validate:"required" json:"{{baseName}}{{^required}},omitempty{{/required}}"` +{{/requiredVars}} +{{#vars}}{{#description}} + // {{{description}}}{{/description}} +{{^required}}{{#isContainer}} + {{name}} {{^isEnum}}{{^isPrimitiveType}}{{^isContainer}}{{^isDateTime}}*{{/isDateTime}}{{/isContainer}}{{/isPrimitiveType}}{{/isEnum}}{{{datatype}}} `validate:"dive" json:"{{baseName}}{{^required}},omitempty{{/required}}"` +{{/isContainer}}{{/required}} +{{^required}}{{^isContainer}} + {{name}} {{^isEnum}}{{^isPrimitiveType}}{{^isContainer}}{{^isDateTime}}*{{/isDateTime}}{{/isContainer}}{{/isPrimitiveType}}{{/isEnum}}{{{datatype}}} `json:"{{baseName}}{{^required}},omitempty{{/required}}"` +{{/isContainer}}{{/required}} +{{/vars}} +}{{/isEnum}}{{/model}}{{/models}} diff --git a/tools/swagger_codegen/go-server/templates-nonyang/partial_header.mustache b/tools/swagger_codegen/go-server/templates-nonyang/partial_header.mustache new file mode 100644 index 0000000000..d24dfec369 --- /dev/null +++ b/tools/swagger_codegen/go-server/templates-nonyang/partial_header.mustache @@ -0,0 +1,17 @@ +/* + {{#appName}} + * {{{appName}}} + * + {{/appName}} + {{#appDescription}} + * {{{appDescription}}} + * + {{/appDescription}} + {{#version}} + * API version: {{{version}}} + {{/version}} + {{#infoEmail}} + * Contact: {{{infoEmail}}} + {{/infoEmail}} + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ diff --git a/tools/swagger_codegen/go-server/templates-nonyang/routers.mustache b/tools/swagger_codegen/go-server/templates-nonyang/routers.mustache new file mode 100644 index 0000000000..cb0dc6e503 --- /dev/null +++ b/tools/swagger_codegen/go-server/templates-nonyang/routers.mustache @@ -0,0 +1,17 @@ +{{>partial_header}} +package {{packageName}} + +import ( + "rest/server" +) + +func init() { + {{#apiInfo}}{{#apis}}{{#operations}}{{#operation}} + server.AddRoute( + "{{operationId}}", + "{{httpMethod}}", + "{{{basePathWithoutHost}}}{{{path}}}", + {{operationId}}, + ) + {{/operation}}{{/operations}}{{/apis}}{{/apiInfo}} +} diff --git a/tools/swagger_codegen/go-server/templates-nonyang/swagger.mustache b/tools/swagger_codegen/go-server/templates-nonyang/swagger.mustache new file mode 100644 index 0000000000..51560926bb --- /dev/null +++ b/tools/swagger_codegen/go-server/templates-nonyang/swagger.mustache @@ -0,0 +1 @@ +{{{swagger-yaml}}} \ No newline at end of file diff --git a/tools/swagger_codegen/go-server/templates-yang/controller-api.mustache b/tools/swagger_codegen/go-server/templates-yang/controller-api.mustache new file mode 100644 index 0000000000..790f1ee6b2 --- /dev/null +++ b/tools/swagger_codegen/go-server/templates-yang/controller-api.mustache @@ -0,0 +1,21 @@ +{{>partial_header}} +package {{packageName}} + +{{#operations}} +import ( + "net/http" + + "rest/server" +){{#operation}} + +func {{nickname}}(w http.ResponseWriter, r *http.Request) { + rc, r := server.GetContext(r) + rc.Name = "{{operationId}}" + {{#consumes}} + rc.Consumes.Add("{{mediaType}}") + {{/consumes}} + {{#produces}} + rc.Produces.Add("{{mediaType}}") + {{/produces}} + server.Process(w, r) +}{{/operation}}{{/operations}} diff --git a/tools/swagger_codegen/go-server/templates-yang/routers.mustache b/tools/swagger_codegen/go-server/templates-yang/routers.mustache new file mode 100644 index 0000000000..cb0dc6e503 --- /dev/null +++ b/tools/swagger_codegen/go-server/templates-yang/routers.mustache @@ -0,0 +1,17 @@ +{{>partial_header}} +package {{packageName}} + +import ( + "rest/server" +) + +func init() { + {{#apiInfo}}{{#apis}}{{#operations}}{{#operation}} + server.AddRoute( + "{{operationId}}", + "{{httpMethod}}", + "{{{basePathWithoutHost}}}{{{path}}}", + {{operationId}}, + ) + {{/operation}}{{/operations}}{{/apis}}{{/apiInfo}} +} diff --git a/tools/swagger_codegen/ui-dist/favicon-16x16.png b/tools/swagger_codegen/ui-dist/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..8b194e617af1c135e6b37939591d24ac3a5efa18 GIT binary patch literal 665 zcmV;K0%rY*P)}JKSduyL>)s!A4EhTMMEM%Q;aL6%l#xiZiF>S;#Y{N2Zz%pvTGHJduXuC6Lx-)0EGfRy*N{Tv4i8@4oJ41gw zKzThrcRe|7J~(YYIBq{SYCkn-KQm=N8$CrEK1CcqMI1dv9z#VRL_{D)L|`QmF8}}l zJ9JV`Q}p!p_4f7m_U`WQ@apR4;o;!mnU<7}iG_qr zF(e)x9~BG-3IzcG2M4an0002kNkl41`ZiN1i62V%{PM@Ry|IS_+Yc7{bb`MM~xm(7p4|kMHP&!VGuDW4kFixat zXw43VmgwEvB$hXt_u=vZ>+v4i7E}n~eG6;n4Z=zF1n?T*yg<;W6kOfxpC6nao>VR% z?fpr=asSJ&`L*wu^rLJ5Peq*PB0;alL#XazZCBxJLd&giTfw@!hW167F^`7kobi;( ze<<>qNlP|xy7S1zl@lZNIBR7#o9ybJsptO#%}P0hz~sBp00000NkvXXu0mjfUsDF? literal 0 HcmV?d00001 diff --git a/tools/swagger_codegen/ui-dist/favicon-32x32.png b/tools/swagger_codegen/ui-dist/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..249737fe44558e679f0b67134e274461d988fa98 GIT binary patch literal 628 zcmV-)0*n2LP)Ma*GM0}OV<074bNCP7P7GVd{iMr*I6y~TMLss@FjvgL~HxU z%Vvj33AwpD(Z4*$Mfx=HaU16axM zt2xG_rloN<$iy9j9I5 + + + + + Swagger UI + + + + + + + +
    + + + + + + diff --git a/tools/swagger_codegen/ui-dist/oauth2-redirect.html b/tools/swagger_codegen/ui-dist/oauth2-redirect.html new file mode 100644 index 0000000000..fb68399d26 --- /dev/null +++ b/tools/swagger_codegen/ui-dist/oauth2-redirect.html @@ -0,0 +1,67 @@ + + + + + + diff --git a/tools/swagger_codegen/ui-dist/swagger-ui-bundle.js b/tools/swagger_codegen/ui-dist/swagger-ui-bundle.js new file mode 100644 index 0000000000..55e2f50c0a --- /dev/null +++ b/tools/swagger_codegen/ui-dist/swagger-ui-bundle.js @@ -0,0 +1,93 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SwaggerUIBundle=t():e.SwaggerUIBundle=t()}(this,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist",n(n.s=446)}([function(e,t,n){"use strict";e.exports=n(75)},function(e,t,n){e.exports=n(854)()},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t,n){"use strict";t.__esModule=!0;var r,o=n(263),i=(r=o)&&r.__esModule?r:{default:r};t.default=function(){function e(e,t){for(var n=0;n>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?C(e)+t:t}function A(){return!0}function O(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function P(e,t){return M(e,t,0)}function T(e,t){return M(e,t,t)}function M(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var I=0,j=1,N=2,R="function"==typeof Symbol&&Symbol.iterator,D="@@iterator",L=R||D;function U(e){this.next=e}function q(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function F(){return{value:void 0,done:!0}}function z(e){return!!H(e)}function B(e){return e&&"function"==typeof e.next}function V(e){var t=H(e);return t&&t.call(e)}function H(e){var t=e&&(R&&e[R]||e[D]);if("function"==typeof t)return t}function W(e){return e&&"number"==typeof e.length}function J(e){return null===e||void 0===e?ie():a(e)?e.toSeq():function(e){var t=se(e)||"object"==typeof e&&new te(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}(e)}function Y(e){return null===e||void 0===e?ie().toKeyedSeq():a(e)?u(e)?e.toSeq():e.fromEntrySeq():ae(e)}function K(e){return null===e||void 0===e?ie():a(e)?u(e)?e.entrySeq():e.toIndexedSeq():ue(e)}function G(e){return(null===e||void 0===e?ie():a(e)?u(e)?e.entrySeq():e:ue(e)).toSetSeq()}U.prototype.toString=function(){return"[Iterator]"},U.KEYS=I,U.VALUES=j,U.ENTRIES=N,U.prototype.inspect=U.prototype.toSource=function(){return this.toString()},U.prototype[L]=function(){return this},t(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString("Seq {","}")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(e,t){return le(this,e,t,!0)},J.prototype.__iterator=function(e,t){return ce(this,e,t,!0)},t(Y,J),Y.prototype.toKeyedSeq=function(){return this},t(K,J),K.of=function(){return K(arguments)},K.prototype.toIndexedSeq=function(){return this},K.prototype.toString=function(){return this.__toString("Seq [","]")},K.prototype.__iterate=function(e,t){return le(this,e,t,!1)},K.prototype.__iterator=function(e,t){return ce(this,e,t,!1)},t(G,J),G.of=function(){return G(arguments)},G.prototype.toSetSeq=function(){return this},J.isSeq=oe,J.Keyed=Y,J.Set=G,J.Indexed=K;var $,Z,X,Q="@@__IMMUTABLE_SEQ__@@";function ee(e){this._array=e,this.size=e.length}function te(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function ne(e){this._iterable=e,this.size=e.length||e.size}function re(e){this._iterator=e,this._iteratorCache=[]}function oe(e){return!(!e||!e[Q])}function ie(){return $||($=new ee([]))}function ae(e){var t=Array.isArray(e)?new ee(e).fromEntrySeq():B(e)?new re(e).fromEntrySeq():z(e)?new ne(e).fromEntrySeq():"object"==typeof e?new te(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function ue(e){var t=se(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function se(e){return W(e)?new ee(e):B(e)?new re(e):z(e)?new ne(e):void 0}function le(e,t,n,r){var o=e._cache;if(o){for(var i=o.length-1,a=0;a<=i;a++){var u=o[n?i-a:a];if(!1===t(u[1],r?u[0]:a,e))return a+1}return a}return e.__iterateUncached(t,n)}function ce(e,t,n,r){var o=e._cache;if(o){var i=o.length-1,a=0;return new U(function(){var e=o[n?i-a:a];return a++>i?{value:void 0,done:!0}:q(t,r?e[0]:a-1,e[1])})}return e.__iteratorUncached(t,n)}function fe(e,t){return t?function e(t,n,r,o){if(Array.isArray(n))return t.call(o,r,K(n).map(function(r,o){return e(t,r,o,n)}));if(de(n))return t.call(o,r,Y(n).map(function(r,o){return e(t,r,o,n)}));return n}(t,e,"",{"":e}):pe(e)}function pe(e){return Array.isArray(e)?K(e).map(pe).toList():de(e)?Y(e).map(pe).toMap():e}function de(e){return e&&(e.constructor===Object||void 0===e.constructor)}function he(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function ve(e,t){if(e===t)return!0;if(!a(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||u(e)!==u(t)||s(e)!==s(t)||c(e)!==c(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!l(e);if(c(e)){var r=e.entries();return t.every(function(e,t){var o=r.next().value;return o&&he(o[1],e)&&(n||he(o[0],t))})&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var i=e;e=t,t=i}var f=!0,p=t.__iterate(function(t,r){if(n?!e.has(t):o?!he(t,e.get(r,y)):!he(e.get(r,y),t))return f=!1,!1});return f&&e.size===p}function me(e,t){if(!(this instanceof me))return new me(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(Z)return Z;Z=this}}function ge(e,t){if(!e)throw new Error(t)}function ye(e,t,n){if(!(this instanceof ye))return new ye(e,t,n);if(ge(0!==n,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),tr?{value:void 0,done:!0}:q(e,o,n[t?r-o++:o++])})},t(te,Y),te.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},te.prototype.has=function(e){return this._object.hasOwnProperty(e)},te.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,i=0;i<=o;i++){var a=r[t?o-i:i];if(!1===e(n[a],a,this))return i+1}return i},te.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,i=0;return new U(function(){var a=r[t?o-i:i];return i++>o?{value:void 0,done:!0}:q(e,a,n[a])})},te.prototype[h]=!0,t(ne,K),ne.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=V(this._iterable),r=0;if(B(n))for(var o;!(o=n.next()).done&&!1!==e(o.value,r++,this););return r},ne.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=V(this._iterable);if(!B(n))return new U(F);var r=0;return new U(function(){var t=n.next();return t.done?t:q(e,r++,t.value)})},t(re,K),re.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n,r=this._iterator,o=this._iteratorCache,i=0;i=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return q(e,o,r[o++])})},t(me,K),me.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},me.prototype.get=function(e,t){return this.has(e)?this._value:t},me.prototype.includes=function(e){return he(this._value,e)},me.prototype.slice=function(e,t){var n=this.size;return O(e,t,n)?this:new me(this._value,T(t,n)-P(e,n))},me.prototype.reverse=function(){return this},me.prototype.indexOf=function(e){return he(this._value,e)?0:-1},me.prototype.lastIndexOf=function(e){return he(this._value,e)?this.size:-1},me.prototype.__iterate=function(e,t){for(var n=0;n=0&&t=0&&nn?{value:void 0,done:!0}:q(e,i++,a)})},ye.prototype.equals=function(e){return e instanceof ye?this._start===e._start&&this._end===e._end&&this._step===e._step:ve(this,e)},t(be,n),t(_e,be),t(we,be),t(Ee,be),be.Keyed=_e,be.Indexed=we,be.Set=Ee;var xe="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function Se(e){return e>>>1&1073741824|3221225471&e}function Ce(e){if(!1===e||null===e||void 0===e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null===e||void 0===e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){if(e!=e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)n^=e/=4294967295;return Se(n)}if("string"===t)return e.length>je?function(e){var t=De[e];void 0===t&&(t=ke(e),Re===Ne&&(Re=0,De={}),Re++,De[e]=t);return t}(e):ke(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return function(e){var t;if(Te&&void 0!==(t=Pe.get(e)))return t;if(void 0!==(t=e[Ie]))return t;if(!Oe){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Ie]))return t;if(void 0!==(t=function(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}(e)))return t}t=++Me,1073741824&Me&&(Me=0);if(Te)Pe.set(e,t);else{if(void 0!==Ae&&!1===Ae(e))throw new Error("Non-extensible objects are not allowed as keys.");if(Oe)Object.defineProperty(e,Ie,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Ie]=t;else{if(void 0===e.nodeType)throw new Error("Unable to set a non-enumerable property on object.");e[Ie]=t}}return t}(e);if("function"==typeof e.toString)return ke(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function ke(e){for(var t=0,n=0;n=t.length)throw new Error("Missing value for key: "+t[n]);e.set(t[n],t[n+1])}})},Ue.prototype.toString=function(){return this.__toString("Map {","}")},Ue.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},Ue.prototype.set=function(e,t){return Qe(this,e,t)},Ue.prototype.setIn=function(e,t){return this.updateIn(e,y,function(){return t})},Ue.prototype.remove=function(e){return Qe(this,e,y)},Ue.prototype.deleteIn=function(e){return this.updateIn(e,function(){return y})},Ue.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},Ue.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=function e(t,n,r,o){var i=t===y;var a=n.next();if(a.done){var u=i?r:t,s=o(u);return s===u?t:s}ge(i||t&&t.set,"invalid keyPath");var l=a.value;var c=i?y:t.get(l,y);var f=e(c,n,r,o);return f===c?t:f===y?t.remove(l):(i?Xe():t).set(l,f)}(this,nn(e),t,n);return r===y?void 0:r},Ue.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):Xe()},Ue.prototype.merge=function(){return rt(this,void 0,arguments)},Ue.prototype.mergeWith=function(t){return rt(this,t,e.call(arguments,1))},Ue.prototype.mergeIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,Xe(),function(e){return"function"==typeof e.merge?e.merge.apply(e,n):n[n.length-1]})},Ue.prototype.mergeDeep=function(){return rt(this,ot,arguments)},Ue.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return rt(this,it(t),n)},Ue.prototype.mergeDeepIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,Xe(),function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,n):n[n.length-1]})},Ue.prototype.sort=function(e){return Pt(Wt(this,e))},Ue.prototype.sortBy=function(e,t){return Pt(Wt(this,t,e))},Ue.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},Ue.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new x)},Ue.prototype.asImmutable=function(){return this.__ensureOwner()},Ue.prototype.wasAltered=function(){return this.__altered},Ue.prototype.__iterator=function(e,t){return new Ke(this,e,t)},Ue.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate(function(t){return r++,e(t[1],t[0],n)},t),r},Ue.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Ze(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Ue.isMap=qe;var Fe,ze="@@__IMMUTABLE_MAP__@@",Be=Ue.prototype;function Ve(e,t){this.ownerID=e,this.entries=t}function He(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function We(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function Je(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function Ye(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function Ke(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&$e(e._root)}function Ge(e,t){return q(e,t[0],t[1])}function $e(e,t){return{node:e,index:0,__prev:t}}function Ze(e,t,n,r){var o=Object.create(Be);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Xe(){return Fe||(Fe=Ze(0))}function Qe(e,t,n){var r,o;if(e._root){var i=w(b),a=w(_);if(r=et(e._root,e.__ownerID,0,void 0,t,n,i,a),!a.value)return e;o=e.size+(i.value?n===y?-1:1:0)}else{if(n===y)return e;o=1,r=new Ve(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?Ze(o,r):Xe()}function et(e,t,n,r,o,i,a,u){return e?e.update(t,n,r,o,i,a,u):i===y?e:(E(u),E(a),new Ye(t,r,[o,i]))}function tt(e){return e.constructor===Ye||e.constructor===Je}function nt(e,t,n,r,o){if(e.keyHash===r)return new Je(t,r,[e.entry,o]);var i,a=(0===n?e.keyHash:e.keyHash>>>n)&g,u=(0===n?r:r>>>n)&g;return new He(t,1<>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function st(e,t,n,r){var o=r?e:S(e);return o[t]=n,o}Be[ze]=!0,Be.delete=Be.remove,Be.removeIn=Be.deleteIn,Ve.prototype.get=function(e,t,n,r){for(var o=this.entries,i=0,a=o.length;i=lt)return function(e,t,n,r){e||(e=new x);for(var o=new Ye(e,Ce(n),[n,r]),i=0;i>>e)&g),i=this.bitmap;return 0==(i&o)?r:this.nodes[ut(i&o-1)].get(e+v,t,n,r)},He.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=Ce(r));var u=(0===t?n:n>>>t)&g,s=1<=ct)return function(e,t,n,r,o){for(var i=0,a=new Array(m),u=0;0!==n;u++,n>>>=1)a[u]=1&n?t[i++]:void 0;return a[r]=o,new We(e,i+1,a)}(e,p,l,u,h);if(c&&!h&&2===p.length&&tt(p[1^f]))return p[1^f];if(c&&h&&1===p.length&&tt(h))return h;var b=e&&e===this.ownerID,_=c?h?l:l^s:l|s,w=c?h?st(p,f,h,b):function(e,t,n){var r=e.length-1;if(n&&t===r)return e.pop(),e;for(var o=new Array(r),i=0,a=0;a>>e)&g,i=this.nodes[o];return i?i.get(e+v,t,n,r):r},We.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=Ce(r));var u=(0===t?n:n>>>t)&g,s=o===y,l=this.nodes,c=l[u];if(s&&!c)return this;var f=et(c,e,t+v,n,r,o,i,a);if(f===c)return this;var p=this.count;if(c){if(!f&&--p0&&r=0&&e=e.size||t<0)return e.withMutations(function(e){t<0?kt(e,t).set(0,n):kt(e,0,t+1).set(t,n)});t+=e._origin;var r=e._tail,o=e._root,i=w(_);t>=Ot(e._capacity)?r=xt(r,e.__ownerID,0,t,n,i):o=xt(o,e.__ownerID,e._level,t,n,i);if(!i.value)return e;if(e.__ownerID)return e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e;return wt(e._origin,e._capacity,e._level,o,r)}(this,e,t)},pt.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},pt.prototype.insert=function(e,t){return this.splice(e,0,t)},pt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=v,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Et()},pt.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations(function(n){kt(n,0,t+e.length);for(var r=0;r>>t&g;if(r>=this.array.length)return new mt([],e);var o,i=0===r;if(t>0){var a=this.array[r];if((o=a&&a.removeBefore(e,t-v,n))===a&&i)return this}if(i&&!o)return this;var u=St(this,e);if(!i)for(var s=0;s>>t&g;if(o>=this.array.length)return this;if(t>0){var i=this.array[o];if((r=i&&i.removeAfter(e,t-v,n))===i&&o===this.array.length-1)return this}var a=St(this,e);return a.array.splice(o+1),r&&(a.array[o]=r),a};var gt,yt,bt={};function _t(e,t){var n=e._origin,r=e._capacity,o=Ot(r),i=e._tail;return a(e._root,e._level,0);function a(e,u,s){return 0===u?function(e,a){var u=a===o?i&&i.array:e&&e.array,s=a>n?0:n-a,l=r-a;l>m&&(l=m);return function(){if(s===l)return bt;var e=t?--l:s++;return u&&u[e]}}(e,s):function(e,o,i){var u,s=e&&e.array,l=i>n?0:n-i>>o,c=1+(r-i>>o);c>m&&(c=m);return function(){for(;;){if(u){var e=u();if(e!==bt)return e;u=null}if(l===c)return bt;var n=t?--c:l++;u=a(s&&s[n],o-v,i+(n<>>n&g,s=e&&u0){var l=e&&e.array[u],c=xt(l,t,n-v,r,o,i);return c===l?e:((a=St(e,t)).array[u]=c,a)}return s&&e.array[u]===o?e:(E(i),a=St(e,t),void 0===o&&u===a.array.length-1?a.array.pop():a.array[u]=o,a)}function St(e,t){return t&&e&&t===e.ownerID?e:new mt(e?e.array.slice():[],t)}function Ct(e,t){if(t>=Ot(e._capacity))return e._tail;if(t<1<0;)n=n.array[t>>>r&g],r-=v;return n}}function kt(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new x,o=e._origin,i=e._capacity,a=o+t,u=void 0===n?i:n<0?i+n:o+n;if(a===o&&u===i)return e;if(a>=u)return e.clear();for(var s=e._level,l=e._root,c=0;a+c<0;)l=new mt(l&&l.array.length?[void 0,l]:[],r),c+=1<<(s+=v);c&&(a+=c,o+=c,u+=c,i+=c);for(var f=Ot(i),p=Ot(u);p>=1<f?new mt([],r):d;if(d&&p>f&&av;y-=v){var b=f>>>y&g;m=m.array[b]=St(m.array[b],r)}m.array[f>>>v&g]=d}if(u=p)a-=p,u-=p,s=v,l=null,h=h&&h.removeBefore(r,0,a);else if(a>o||p>>s&g;if(_!==p>>>s&g)break;_&&(c+=(1<o&&(l=l.removeBefore(r,s,a-c)),l&&pi&&(i=l.size),a(s)||(l=l.map(function(e){return fe(e)})),r.push(l)}return i>e.size&&(e=e.setSize(i)),at(e,t,r)}function Ot(e){return e>>v<=m&&a.size>=2*i.size?(r=(o=a.filter(function(e,t){return void 0!==e&&u!==t})).toKeyedSeq().map(function(e){return e[0]}).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=i.remove(t),o=u===a.size-1?a.pop():a.set(u,void 0))}else if(s){if(n===a.get(u)[1])return e;r=i,o=a.set(u,[t,n])}else r=i.set(t,a.size),o=a.set(a.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):Mt(r,o)}function Nt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function Rt(e){this._iter=e,this.size=e.size}function Dt(e){this._iter=e,this.size=e.size}function Lt(e){this._iter=e,this.size=e.size}function Ut(e){var t=Qt(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=en,t.__iterateUncached=function(t,n){var r=this;return e.__iterate(function(e,n){return!1!==t(n,e,r)},n)},t.__iteratorUncached=function(t,n){if(t===N){var r=e.__iterator(t,n);return new U(function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e})}return e.__iterator(t===j?I:j,n)},t}function qt(e,t,n){var r=Qt(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var i=e.get(r,y);return i===y?o:t.call(n,i,r,e)},r.__iterateUncached=function(r,o){var i=this;return e.__iterate(function(e,o,a){return!1!==r(t.call(n,e,o,a),o,i)},o)},r.__iteratorUncached=function(r,o){var i=e.__iterator(N,o);return new U(function(){var o=i.next();if(o.done)return o;var a=o.value,u=a[0];return q(r,u,t.call(n,a[1],u,e),o)})},r}function Ft(e,t){var n=Qt(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=Ut(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=en,n.__iterate=function(t,n){var r=this;return e.__iterate(function(e,n){return t(e,n,r)},!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function zt(e,t,n,r){var o=Qt(e);return r&&(o.has=function(r){var o=e.get(r,y);return o!==y&&!!t.call(n,o,r,e)},o.get=function(r,o){var i=e.get(r,y);return i!==y&&t.call(n,i,r,e)?i:o}),o.__iterateUncached=function(o,i){var a=this,u=0;return e.__iterate(function(e,i,s){if(t.call(n,e,i,s))return u++,o(e,r?i:u-1,a)},i),u},o.__iteratorUncached=function(o,i){var a=e.__iterator(N,i),u=0;return new U(function(){for(;;){var i=a.next();if(i.done)return i;var s=i.value,l=s[0],c=s[1];if(t.call(n,c,l,e))return q(o,r?l:u++,c,i)}})},o}function Bt(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),O(t,n,o))return e;var i=P(t,o),a=T(n,o);if(i!=i||a!=a)return Bt(e.toSeq().cacheResult(),t,n,r);var u,s=a-i;s==s&&(u=s<0?0:s);var l=Qt(e);return l.size=0===u?u:e.size&&u||void 0,!r&&oe(e)&&u>=0&&(l.get=function(t,n){return(t=k(this,t))>=0&&tu)return{value:void 0,done:!0};var e=o.next();return r||t===j?e:q(t,s-1,t===I?void 0:e.value[1],e)})},l}function Vt(e,t,n,r){var o=Qt(e);return o.__iterateUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterate(o,i);var u=!0,s=0;return e.__iterate(function(e,i,l){if(!u||!(u=t.call(n,e,i,l)))return s++,o(e,r?i:s-1,a)}),s},o.__iteratorUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterator(o,i);var u=e.__iterator(N,i),s=!0,l=0;return new U(function(){var e,i,c;do{if((e=u.next()).done)return r||o===j?e:q(o,l++,o===I?void 0:e.value[1],e);var f=e.value;i=f[0],c=f[1],s&&(s=t.call(n,c,i,a))}while(s);return o===N?e:q(o,i,c,e)})},o}function Ht(e,t,n){var r=Qt(e);return r.__iterateUncached=function(r,o){var i=0,u=!1;return function e(s,l){var c=this;s.__iterate(function(o,s){return(!t||l0}function Kt(e,t,r){var o=Qt(e);return o.size=new ee(r).map(function(e){return e.size}).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(j,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var i=r.map(function(e){return e=n(e),V(o?e.reverse():e)}),a=0,u=!1;return new U(function(){var n;return u||(n=i.map(function(e){return e.next()}),u=n.some(function(e){return e.done})),u?{value:void 0,done:!0}:q(e,a++,t.apply(null,n.map(function(e){return e.value})))})},o}function Gt(e,t){return oe(e)?t:e.constructor(t)}function $t(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function Zt(e){return Le(e.size),C(e)}function Xt(e){return u(e)?r:s(e)?o:i}function Qt(e){return Object.create((u(e)?Y:s(e)?K:G).prototype)}function en(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function tn(e,t){return e>t?1:e=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):An(e,t)},En.prototype.pushAll=function(e){if(0===(e=o(e)).size)return this;Le(e.size);var t=this.size,n=this._head;return e.reverse().forEach(function(e){t++,n={value:e,next:n}}),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):An(t,n)},En.prototype.pop=function(){return this.slice(1)},En.prototype.unshift=function(){return this.push.apply(this,arguments)},En.prototype.unshiftAll=function(e){return this.pushAll(e)},En.prototype.shift=function(){return this.pop.apply(this,arguments)},En.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):On()},En.prototype.slice=function(e,t){if(O(e,t,this.size))return this;var n=P(e,this.size);if(T(t,this.size)!==this.size)return we.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):An(r,o)},En.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?An(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},En.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},En.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new U(function(){if(r){var t=r.value;return r=r.next,q(e,n++,t)}return{value:void 0,done:!0}})},En.isStack=xn;var Sn,Cn="@@__IMMUTABLE_STACK__@@",kn=En.prototype;function An(e,t,n,r){var o=Object.create(kn);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function On(){return Sn||(Sn=An(0))}function Pn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}kn[Cn]=!0,kn.withMutations=Be.withMutations,kn.asMutable=Be.asMutable,kn.asImmutable=Be.asImmutable,kn.wasAltered=Be.wasAltered,n.Iterator=U,Pn(n,{toArray:function(){Le(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate(function(t,n){e[n]=t}),e},toIndexedSeq:function(){return new Rt(this)},toJS:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJS?e.toJS():e}).__toJS()},toJSON:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e}).__toJS()},toKeyedSeq:function(){return new Nt(this,!0)},toMap:function(){return Ue(this.toKeyedSeq())},toObject:function(){Le(this.size);var e={};return this.__iterate(function(t,n){e[n]=t}),e},toOrderedMap:function(){return Pt(this.toKeyedSeq())},toOrderedSet:function(){return mn(u(this)?this.valueSeq():this)},toSet:function(){return sn(u(this)?this.valueSeq():this)},toSetSeq:function(){return new Dt(this)},toSeq:function(){return s(this)?this.toIndexedSeq():u(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return En(u(this)?this.valueSeq():this)},toList:function(){return pt(u(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){return Gt(this,function(e,t){var n=u(e),o=[e].concat(t).map(function(e){return a(e)?n&&(e=r(e)):e=n?ae(e):ue(Array.isArray(e)?e:[e]),e}).filter(function(e){return 0!==e.size});if(0===o.length)return e;if(1===o.length){var i=o[0];if(i===e||n&&u(i)||s(e)&&s(i))return i}var l=new ee(o);return n?l=l.toKeyedSeq():s(e)||(l=l.toSetSeq()),(l=l.flatten(!0)).size=o.reduce(function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}},0),l}(this,e.call(arguments,0)))},includes:function(e){return this.some(function(t){return he(t,e)})},entries:function(){return this.__iterator(N)},every:function(e,t){Le(this.size);var n=!0;return this.__iterate(function(r,o,i){if(!e.call(t,r,o,i))return n=!1,!1}),n},filter:function(e,t){return Gt(this,zt(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return Le(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Le(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate(function(r){n?n=!1:t+=e,t+=null!==r&&void 0!==r?r.toString():""}),t},keys:function(){return this.__iterator(I)},map:function(e,t){return Gt(this,qt(this,e,t))},reduce:function(e,t,n){var r,o;return Le(this.size),arguments.length<2?o=!0:r=t,this.__iterate(function(t,i,a){o?(o=!1,r=t):r=e.call(n,r,t,i,a)}),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return Gt(this,Ft(this,!0))},slice:function(e,t){return Gt(this,Bt(this,e,t,!0))},some:function(e,t){return!this.every(Nn(e),t)},sort:function(e){return Gt(this,Wt(this,e))},values:function(){return this.__iterator(j)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(e,t){return C(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return function(e,t,n){var r=Ue().asMutable();return e.__iterate(function(o,i){r.update(t.call(n,o,i,e),0,function(e){return e+1})}),r.asImmutable()}(this,e,t)},equals:function(e){return ve(this,e)},entrySeq:function(){var e=this;if(e._cache)return new ee(e._cache);var t=e.toSeq().map(jn).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(Nn(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate(function(n,o,i){if(e.call(t,n,o,i))return r=[o,n],!1}),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(A)},flatMap:function(e,t){return Gt(this,function(e,t,n){var r=Xt(e);return e.toSeq().map(function(o,i){return r(t.call(n,o,i,e))}).flatten(!0)}(this,e,t))},flatten:function(e){return Gt(this,Ht(this,e,!0))},fromEntrySeq:function(){return new Lt(this)},get:function(e,t){return this.find(function(t,n){return he(n,e)},void 0,t)},getIn:function(e,t){for(var n,r=this,o=nn(e);!(n=o.next()).done;){var i=n.value;if((r=r&&r.get?r.get(i,y):y)===y)return t}return r},groupBy:function(e,t){return function(e,t,n){var r=u(e),o=(c(e)?Pt():Ue()).asMutable();e.__iterate(function(i,a){o.update(t.call(n,i,a,e),function(e){return(e=e||[]).push(r?[a,i]:i),e})});var i=Xt(e);return o.map(function(t){return Gt(e,i(t))})}(this,e,t)},has:function(e){return this.get(e,y)!==y},hasIn:function(e){return this.getIn(e,y)!==y},isSubset:function(e){return e="function"==typeof e.includes?e:n(e),this.every(function(t){return e.includes(t)})},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:n(e)).isSubset(this)},keyOf:function(e){return this.findKey(function(t){return he(t,e)})},keySeq:function(){return this.toSeq().map(In).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return Jt(this,e)},maxBy:function(e,t){return Jt(this,t,e)},min:function(e){return Jt(this,e?Rn(e):Un)},minBy:function(e,t){return Jt(this,t?Rn(t):Un,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return Gt(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return Gt(this,Vt(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(Nn(e),t)},sortBy:function(e,t){return Gt(this,Wt(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return Gt(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return Gt(this,function(e,t,n){var r=Qt(e);return r.__iterateUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterate(r,o);var a=0;return e.__iterate(function(e,o,u){return t.call(n,e,o,u)&&++a&&r(e,o,i)}),a},r.__iteratorUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterator(r,o);var a=e.__iterator(N,o),u=!0;return new U(function(){if(!u)return{value:void 0,done:!0};var e=a.next();if(e.done)return e;var o=e.value,s=o[0],l=o[1];return t.call(n,l,s,i)?r===N?e:q(r,s,l,e):(u=!1,{value:void 0,done:!0})})},r}(this,e,t))},takeUntil:function(e,t){return this.takeWhile(Nn(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function(e){if(e.size===1/0)return 0;var t=c(e),n=u(e),r=t?1:0;return function(e,t){return t=xe(t,3432918353),t=xe(t<<15|t>>>-15,461845907),t=xe(t<<13|t>>>-13,5),t=xe((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=Se((t=xe(t^t>>>13,3266489909))^t>>>16)}(e.__iterate(n?t?function(e,t){r=31*r+qn(Ce(e),Ce(t))|0}:function(e,t){r=r+qn(Ce(e),Ce(t))|0}:t?function(e){r=31*r+Ce(e)|0}:function(e){r=r+Ce(e)|0}),r)}(this))}});var Tn=n.prototype;Tn[f]=!0,Tn[L]=Tn.values,Tn.__toJS=Tn.toArray,Tn.__toStringMapper=Dn,Tn.inspect=Tn.toSource=function(){return this.toString()},Tn.chain=Tn.flatMap,Tn.contains=Tn.includes,Pn(r,{flip:function(){return Gt(this,Ut(this))},mapEntries:function(e,t){var n=this,r=0;return Gt(this,this.toSeq().map(function(o,i){return e.call(t,[i,o],r++,n)}).fromEntrySeq())},mapKeys:function(e,t){var n=this;return Gt(this,this.toSeq().flip().map(function(r,o){return e.call(t,r,o,n)}).flip())}});var Mn=r.prototype;function In(e,t){return t}function jn(e,t){return[t,e]}function Nn(e){return function(){return!e.apply(this,arguments)}}function Rn(e){return function(){return-e.apply(this,arguments)}}function Dn(e){return"string"==typeof e?JSON.stringify(e):String(e)}function Ln(){return S(arguments)}function Un(e,t){return et?-1:0}function qn(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return Mn[p]=!0,Mn[L]=Tn.entries,Mn.__toJS=Tn.toObject,Mn.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+Dn(e)},Pn(o,{toKeyedSeq:function(){return new Nt(this,!1)},filter:function(e,t){return Gt(this,zt(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return Gt(this,Ft(this,!1))},slice:function(e,t){return Gt(this,Bt(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=P(e,e<0?this.count():this.size);var r=this.slice(0,e);return Gt(this,1===n?r:r.concat(S(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return Gt(this,Ht(this,e,!1))},get:function(e,t){return(e=k(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find(function(t,n){return n===e},void 0,t)},has:function(e){return(e=k(this,e))>=0&&(void 0!==this.size?this.size===1/0||e5e3)return e.textContent;return function(e){for(var n,r,o,i,a,u=e.textContent,s=0,l=u[0],c=1,f=e.innerHTML="",p=0;r=n,n=p<7&&"\\"==n?1:c;){if(c=l,l=u[++s],i=f.length>1,!c||p>8&&"\n"==c||[/\S/.test(c),1,1,!/[$\w]/.test(c),("/"==n||"\n"==n)&&i,'"'==n&&i,"'"==n&&i,u[s-4]+r+n=="--\x3e",r+n=="*/"][p])for(f&&(e.appendChild(a=t.createElement("span")).setAttribute("style",["color: #555; font-weight: bold;","","","color: #555;",""][p?p<3?2:p>6?4:p>3?3:+/^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(icrolight|odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/.test(f):0]),a.appendChild(t.createTextNode(f))),o=p&&p<7?p:o,f="",p=11;![1,/[\/{}[(\-+*=<>:;|\\.,?!&@~]/.test(c),/[\])]/.test(c),/[$\w]/.test(c),"/"==c&&o<2&&"<"!=n,'"'==c,"'"==c,c+l+u[s+1]+u[s+2]=="\x3c!--",c+l=="/*",c+l=="//","#"==c][--p];);f+=c}}(e)},t.mapToList=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"key";var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:l.default.Map();if(!l.default.Map.isMap(t)||!t.size)return l.default.List();Array.isArray(n)||(n=[n]);if(n.length<1)return t.merge(r);var a=l.default.List();var u=n[0];var s=!0;var c=!1;var f=void 0;try{for(var p,d=(0,i.default)(t.entries());!(s=(p=d.next()).done);s=!0){var h=p.value,v=(0,o.default)(h,2),m=v[0],g=v[1],y=e(g,n.slice(1),r.set(u,m));a=l.default.List.isList(y)?a.concat(y):a.push(y)}}catch(e){c=!0,f=e}finally{try{!s&&d.return&&d.return()}finally{if(c)throw f}}return a},t.extractFileNameFromContentDispositionHeader=function(e){var t=void 0;if([/filename\*=[^']+'\w*'"([^"]+)";?/i,/filename\*=[^']+'\w*'([^;]+);?/i,/filename="([^;]*);?"/i,/filename=([^;]*);?/i].some(function(n){return null!==(t=n.exec(e))}),null!==t&&t.length>1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null},t.pascalCase=C,t.pascalCaseFilename=function(e){return C(e.replace(/\.[^./]*$/,""))},t.sanitizeUrl=function(e){if("string"!=typeof e||""===e)return"";return(0,c.sanitizeUrl)(e)},t.getAcceptControllingResponse=function(e){if(!l.default.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=e.find(function(e,t){return t.startsWith("2")&&(0,u.default)(e.get("content")||{}).length>0}),n=e.get("default")||l.default.OrderedMap(),r=(n.get("content")||l.default.OrderedMap()).keySeq().toJS().length?n:null;return t||r},t.deeplyStripKey=function e(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==(void 0===t?"undefined":(0,s.default)(t))||Array.isArray(t)||null===t||!n)return t;var o=(0,a.default)({},t);(0,u.default)(o).forEach(function(t){t===n&&r(o[t],t)?delete o[t]:o[t]=e(o[t],n,r)});return o},t.stringify=function(e){if("string"==typeof e)return e;e.toJS&&(e=e.toJS());if("object"===(void 0===e?"undefined":(0,s.default)(e))&&null!==e)try{return(0,r.default)(e,null,2)}catch(t){return String(e)}return e.toString()},t.numberToString=function(e){if("number"==typeof e)return e.toString();return e},t.paramToIdentifier=q,t.paramToValue=function(e,t){return q(e,{returnAll:!0}).map(function(e){return t[e]}).filter(function(e){return void 0!==e})[0]};var l=_(n(7)),c=n(572),f=_(n(573)),p=_(n(281)),d=_(n(285)),h=_(n(288)),v=_(n(651)),m=_(n(105)),g=n(194),y=_(n(32)),b=_(n(724));function _(e){return e&&e.__esModule?e:{default:e}}var w="default",E=t.isImmutable=function(e){return l.default.Iterable.isIterable(e)};function x(e){return Array.isArray(e)?e:[e]}function S(e){return!!e&&"object"===(void 0===e?"undefined":(0,s.default)(e))}t.memoize=d.default;function C(e){return(0,p.default)((0,f.default)(e))}t.propChecker=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];return(0,u.default)(e).length!==(0,u.default)(t).length||((0,v.default)(e,function(e,n){if(r.includes(n))return!1;var o=t[n];return l.default.Iterable.isIterable(e)?!l.default.is(e,o):("object"!==(void 0===e?"undefined":(0,s.default)(e))||"object"!==(void 0===o?"undefined":(0,s.default)(o)))&&e!==o})||n.some(function(n){return!(0,m.default)(e[n],t[n])}))};var k=t.validateMaximum=function(e,t){if(e>t)return"Value must be less than Maximum"},A=t.validateMinimum=function(e,t){if(et)return"Value must be less than MaxLength"},D=t.validateMinLength=function(e,t){if(e.length2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,o=void 0!==r&&r,i=n.bypassRequiredCheck,a=void 0!==i&&i,u=[],c=e.get("required"),f=o?e.get("schema"):e;if(!f)return u;var p=f.get("maximum"),d=f.get("minimum"),h=f.get("type"),v=f.get("format"),m=f.get("maxLength"),g=f.get("minLength"),b=f.get("pattern");if(h&&(c||t)){var _="string"===h&&t,w="array"===h&&Array.isArray(t)&&t.length,E="array"===h&&l.default.List.isList(t)&&t.count(),x="file"===h&&t instanceof y.default.File,S="boolean"===h&&(t||!1===t),C="number"===h&&(t||0===t),U="integer"===h&&(t||0===t),q=!1;if(o&&"object"===h)if("object"===(void 0===t?"undefined":(0,s.default)(t)))q=!0;else if("string"==typeof t)try{JSON.parse(t),q=!0}catch(e){return u.push("Parameter string value must be valid JSON"),u}var F=[_,w,E,x,S,C,U,q].some(function(e){return!!e});if(c&&!F&&!a)return u.push("Required field is not provided"),u;if(b){var z=L(t,b);z&&u.push(z)}if(m||0===m){var B=R(t,m);B&&u.push(B)}if(g){var V=D(t,g);V&&u.push(V)}if(p||0===p){var H=k(t,p);H&&u.push(H)}if(d||0===d){var W=A(t,d);W&&u.push(W)}if("string"===h){var J=void 0;if(!(J="date-time"===v?j(t):"uuid"===v?N(t):I(t)))return u;u.push(J)}else if("boolean"===h){var Y=M(t);if(!Y)return u;u.push(Y)}else if("number"===h){var K=O(t);if(!K)return u;u.push(K)}else if("integer"===h){var G=P(t);if(!G)return u;u.push(G)}else if("array"===h){var $;if(!E||!t.count())return u;$=f.getIn(["items","type"]),t.forEach(function(e,t){var n=void 0;"number"===$?n=O(e):"integer"===$?n=P(e):"string"===$&&(n=I(e)),n&&u.push({index:t,error:n})})}else if("file"===h){var Z=T(t);if(!Z)return u;u.push(Z)}}return u},t.getSampleSchema=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(/xml/.test(t)){if(!e.xml||!e.xml.name){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var o=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=o[1]}return(0,g.memoizedCreateXMLExample)(e,n)}var i=(0,g.memoizedSampleFromSchema)(e,n);return"object"===(void 0===i?"undefined":(0,s.default)(i))?(0,r.default)(i,null,2):i},t.parseSearch=function(){var e={},t=y.default.location.search;if(!t)return{};if(""!=t){var n=t.substr(1).split("&");for(var r in n)n.hasOwnProperty(r)&&(r=n[r].split("="),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||"")}return e},t.serializeSearch=function(e){return(0,u.default)(e).map(function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])}).join("&")},t.btoa=function(t){return(t instanceof e?t:new e(t.toString(),"utf-8")).toString("base64")},t.sorters={operationsSorter:{alpha:function(e,t){return e.get("path").localeCompare(t.get("path"))},method:function(e,t){return e.get("method").localeCompare(t.get("method"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},t.buildFormData=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&""!==r&&t.push([n,"=",encodeURIComponent(r).replace(/%20/g,"+")].join(""))}return t.join("&")},t.shallowEqualKeys=function(e,t,n){return!!(0,h.default)(n,function(n){return(0,m.default)(e[n],t[n])})};var U=t.createDeepLinkPath=function(e){return"string"==typeof e||e instanceof String?e.trim().replace(/\s/g,"%20"):""};t.escapeDeepLinkPath=function(e){return(0,b.default)(U(e).replace(/%20/g,"_"))},t.getExtensions=function(e){return e.filter(function(e,t){return/^x-/.test(t)})},t.getCommonExtensions=function(e){return e.filter(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)})};function q(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,o=t.allowHashes,i=void 0===o||o;if(!l.default.Map.isMap(e))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var a=e.get("name"),u=e.get("in"),s=[];return e&&e.hashCode&&u&&a&&i&&s.push(u+"."+a+".hash-"+e.hashCode()),u&&a&&s.push(u+"."+a),s.push(a),r?s:s[0]||""}}).call(t,n(54).Buffer)},function(e,t,n){"use strict";var r=n(34);e.exports=r},function(e,t,n){"use strict";e.exports=function(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,r=0;r>",i={listOf:function(e){return l(e,"List",r.List.isList)},mapOf:function(e,t){return c(e,t,"Map",r.Map.isMap)},orderedMapOf:function(e,t){return c(e,t,"OrderedMap",r.OrderedMap.isOrderedMap)},setOf:function(e){return l(e,"Set",r.Set.isSet)},orderedSetOf:function(e){return l(e,"OrderedSet",r.OrderedSet.isOrderedSet)},stackOf:function(e){return l(e,"Stack",r.Stack.isStack)},iterableOf:function(e){return l(e,"Iterable",r.Iterable.isIterable)},recordOf:function(e){return u(function(t,n,o,i,u){for(var s=arguments.length,l=Array(s>5?s-5:0),c=5;c6?s-6:0),c=6;c5?l-5:0),f=5;f5?i-5:0),u=5;u key("+c[f]+")"].concat(a));if(d instanceof Error)return d}})).apply(void 0,i);var s})}function f(e){var t=void 0===arguments[1]?"Iterable":arguments[1],n=void 0===arguments[2]?r.Iterable.isIterable:arguments[2];return u(function(r,o,i,u,s){for(var l=arguments.length,c=Array(l>5?l-5:0),f=5;f?@[\]^_`{|}~-])/g;function a(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function u(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var s=/&([a-z#][a-z0-9]{1,31});/gi,l=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,c=n(417);function f(e,t){var n=0;return o(c,t)?c[t]:35===t.charCodeAt(0)&&l.test(t)&&a(n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?u(n):e}var p=/[&<>"]/,d=/[&<>"]/g,h={"&":"&","<":"<",">":">",'"':"""};function v(e){return h[e]}t.assign=function(e){return[].slice.call(arguments,1).forEach(function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach(function(n){e[n]=t[n]})}}),e},t.isString=function(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)},t.has=o,t.unescapeMd=function(e){return e.indexOf("\\")<0?e:e.replace(i,"$1")},t.isValidEntityCode=a,t.fromCodePoint=u,t.replaceEntities=function(e){return e.indexOf("&")<0?e:e.replace(s,f)},t.escapeHtml=function(e){return p.test(e)?e.replace(d,v):e}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){var r=n(33),o=n(61),i=n(59),a=n(73),u=n(120),s=function(e,t,n){var l,c,f,p,d=e&s.F,h=e&s.G,v=e&s.S,m=e&s.P,g=e&s.B,y=h?r:v?r[t]||(r[t]={}):(r[t]||{}).prototype,b=h?o:o[t]||(o[t]={}),_=b.prototype||(b.prototype={});for(l in h&&(n=t),n)f=((c=!d&&y&&void 0!==y[l])?y:n)[l],p=g&&c?u(f,r):m&&"function"==typeof f?u(Function.call,f):f,y&&a(y,l,f,e&s.U),b[l]!=f&&i(b,l,p),m&&_[l]!=f&&(_[l]=f)};r.core=o,s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,e.exports=s},function(e,t,n){var r=n(29),o=n(101),i=n(53),a=/"/g,u=function(e,t,n,r){var o=String(i(e)),u="<"+t;return""!==n&&(u+=" "+n+'="'+String(r).replace(a,""")+'"'),u+">"+o+""};e.exports=function(e,t){var n={};n[e]=t(u),r(r.P+r.F*o(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",n)}},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";var r,o=n(91),i=(r=o)&&r.__esModule?r:{default:r};e.exports=function(){var e={location:{},history:{},open:function(){},close:function(){},File:function(){}};if("undefined"==typeof window)return e;try{e=window;var t=!0,n=!1,r=void 0;try{for(var o,a=(0,i.default)(["File","Blob","FormData"]);!(t=(o=a.next()).done);t=!0){var u=o.value;u in window&&(e[u]=window[u])}}catch(e){n=!0,r=e}finally{try{!t&&a.return&&a.return()}finally{if(n)throw r}}}catch(e){console.error(e)}return e}()},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){"use strict";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=i(n(25));t.isOAS3=a,t.isSwagger2=function(e){var t=e.get("swagger");if("string"!=typeof t)return!1;return t.startsWith("2.0")},t.OAS3ComponentWrapFactory=function(e){return function(t,n){return function(i){if(n&&n.specSelectors&&n.specSelectors.specJson){var u=n.specSelectors.specJson();return a(u)?o.default.createElement(e,(0,r.default)({},i,n,{Ori:t})):o.default.createElement(t,i)}return console.warn("OAS3 wrapper: couldn't get spec"),null}}};var o=i(n(0));function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=e.get("openapi");return"string"==typeof t&&(t.startsWith("3.0.")&&t.length>4)}},function(e,t,n){var r=n(28);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){var r=n(279),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();e.exports=i},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){"use strict";var r=null;e.exports={debugTool:r}},function(e,t,n){var r=n(36),o=n(239),i=n(158),a=Object.defineProperty;t.f=n(44)?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){e.exports={default:n(517),__esModule:!0}},function(e,t,n){e.exports={default:n(518),__esModule:!0}},function(e,t,n){"use strict";var r=n(11),o=n(13),i=n(354),a=n(69),u=n(355),s=n(88),l=n(148),c=n(8),f=[],p=0,d=i.getPooled(),h=!1,v=null;function m(){E.ReactReconcileTransaction&&v||r("123")}var g=[{initialize:function(){this.dirtyComponentsLength=f.length},close:function(){this.dirtyComponentsLength!==f.length?(f.splice(0,this.dirtyComponentsLength),w()):f.length=0}},{initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}}];function y(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=i.getPooled(),this.reconcileTransaction=E.ReactReconcileTransaction.getPooled(!0)}function b(e,t){return e._mountOrder-t._mountOrder}function _(e){var t=e.dirtyComponentsLength;t!==f.length&&r("124",t,f.length),f.sort(b),p++;for(var n=0;n + * @license MIT + */ +var r=n(529),o=n(530),i=n(262);function a(){return s.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function u(e,t){if(a()=a())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a().toString(16)+" bytes");return 0|e}function h(e,t){if(s.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return F(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return z(e).length;default:if(r)return F(e).length;t=(""+t).toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function m(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=s.from(t,r)),s.isBuffer(t))return 0===t.length?-1:g(e,t,n,r,o);if("number"==typeof t)return t&=255,s.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):g(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function g(e,t,n,r,o){var i,a=1,u=e.length,s=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;a=2,u/=2,s/=2,n/=2}function l(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(o){var c=-1;for(i=n;iu&&(n=u-s),i=n;i>=0;i--){for(var f=!0,p=0;po&&(r=o):r=o;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var a=0;a>8,o=n%256,i.push(o),i.push(r);return i}(t,e.length-n),e,n,r)}function S(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function C(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o239?4:l>223?3:l>191?2:1;if(o+f<=n)switch(f){case 1:l<128&&(c=l);break;case 2:128==(192&(i=e[o+1]))&&(s=(31&l)<<6|63&i)>127&&(c=s);break;case 3:i=e[o+1],a=e[o+2],128==(192&i)&&128==(192&a)&&(s=(15&l)<<12|(63&i)<<6|63&a)>2047&&(s<55296||s>57343)&&(c=s);break;case 4:i=e[o+1],a=e[o+2],u=e[o+3],128==(192&i)&&128==(192&a)&&128==(192&u)&&(s=(15&l)<<18|(63&i)<<12|(63&a)<<6|63&u)>65535&&s<1114112&&(c=s)}null===c?(c=65533,f=1):c>65535&&(c-=65536,r.push(c>>>10&1023|55296),c=56320|1023&c),r.push(c),o+=f}return function(e){var t=e.length;if(t<=k)return String.fromCharCode.apply(String,e);var n="",r=0;for(;rthis.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return P(this,t,n);case"utf8":case"utf-8":return C(this,t,n);case"ascii":return A(this,t,n);case"latin1":case"binary":return O(this,t,n);case"base64":return S(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return T(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}.apply(this,arguments)},s.prototype.equals=function(e){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===s.compare(this,e)},s.prototype.inspect=function(){var e="",n=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},s.prototype.compare=function(e,t,n,r,o){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(t>>>=0,n>>>=0,r>>>=0,o>>>=0,this===e)return 0;for(var i=o-r,a=n-t,u=Math.min(i,a),l=this.slice(r,o),c=e.slice(t,n),f=0;fo)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return y(this,e,t,n);case"utf8":case"utf-8":return b(this,e,t,n);case"ascii":return _(this,e,t,n);case"latin1":case"binary":return w(this,e,t,n);case"base64":return E(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return x(this,e,t,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var k=4096;function A(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;or)&&(n=r);for(var o="",i=t;in)throw new RangeError("Trying to access beyond buffer length")}function I(e,t,n,r,o,i){if(!s.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function j(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-n,2);o>>8*(r?o:1-o)}function N(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-n,4);o>>8*(r?o:3-o)&255}function R(e,t,n,r,o,i){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function D(e,t,n,r,i){return i||R(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function L(e,t,n,r,i){return i||R(e,0,n,8),o.write(e,t,n,r,52,8),n+8}s.prototype.slice=function(e,t){var n,r=this.length;if(e=~~e,t=void 0===t?r:~~t,e<0?(e+=r)<0&&(e=0):e>r&&(e=r),t<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(o*=256);)r+=this[e+--t]*o;return r},s.prototype.readUInt8=function(e,t){return t||M(e,1,this.length),this[e]},s.prototype.readUInt16LE=function(e,t){return t||M(e,2,this.length),this[e]|this[e+1]<<8},s.prototype.readUInt16BE=function(e,t){return t||M(e,2,this.length),this[e]<<8|this[e+1]},s.prototype.readUInt32LE=function(e,t){return t||M(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},s.prototype.readUInt32BE=function(e,t){return t||M(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},s.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||M(e,t,this.length);for(var r=this[e],o=1,i=0;++i=(o*=128)&&(r-=Math.pow(2,8*t)),r},s.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||M(e,t,this.length);for(var r=t,o=1,i=this[e+--r];r>0&&(o*=256);)i+=this[e+--r]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*t)),i},s.prototype.readInt8=function(e,t){return t||M(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},s.prototype.readInt16LE=function(e,t){t||M(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},s.prototype.readInt16BE=function(e,t){t||M(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},s.prototype.readInt32LE=function(e,t){return t||M(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},s.prototype.readInt32BE=function(e,t){return t||M(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},s.prototype.readFloatLE=function(e,t){return t||M(e,4,this.length),o.read(this,e,!0,23,4)},s.prototype.readFloatBE=function(e,t){return t||M(e,4,this.length),o.read(this,e,!1,23,4)},s.prototype.readDoubleLE=function(e,t){return t||M(e,8,this.length),o.read(this,e,!0,52,8)},s.prototype.readDoubleBE=function(e,t){return t||M(e,8,this.length),o.read(this,e,!1,52,8)},s.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||I(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,i=0;for(this[t]=255&e;++i=0&&(i*=256);)this[t+o]=e/i&255;return t+n},s.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||I(this,e,t,1,255,0),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},s.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||I(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):j(this,e,t,!0),t+2},s.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||I(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):j(this,e,t,!1),t+2},s.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||I(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):N(this,e,t,!0),t+4},s.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||I(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):N(this,e,t,!1),t+4},s.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);I(this,e,t,n,o-1,-o)}var i=0,a=1,u=0;for(this[t]=255&e;++i>0)-u&255;return t+n},s.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);I(this,e,t,n,o-1,-o)}var i=n-1,a=1,u=0;for(this[t+i]=255&e;--i>=0&&(a*=256);)e<0&&0===u&&0!==this[t+i+1]&&(u=1),this[t+i]=(e/a>>0)-u&255;return t+n},s.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||I(this,e,t,1,127,-128),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},s.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||I(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):j(this,e,t,!0),t+2},s.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||I(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):j(this,e,t,!1),t+2},s.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||I(this,e,t,4,2147483647,-2147483648),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):N(this,e,t,!0),t+4},s.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||I(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):N(this,e,t,!1),t+4},s.prototype.writeFloatLE=function(e,t,n){return D(this,e,t,!0,n)},s.prototype.writeFloatBE=function(e,t,n){return D(this,e,t,!1,n)},s.prototype.writeDoubleLE=function(e,t,n){return L(this,e,t,!0,n)},s.prototype.writeDoubleBE=function(e,t,n){return L(this,e,t,!1,n)},s.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(i<1e3||!s.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(i=t;i55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(a+1===r){(t-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;i.push(n)}else if(n<2048){if((t-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(U,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function B(e,t,n,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(t,n(31))},function(e,t,n){var r=n(278);e.exports=function(e){return null==e?"":r(e)}},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var s,l=[],c=!1,f=-1;function p(){c&&s&&(c=!1,s.length?l=s.concat(l):f=-1,l.length&&d())}function d(){if(!c){var e=u(p);c=!0;for(var t=l.length;t;){for(s=l,l=[];++f1)for(var n=1;n1?t-1:0),r=1;r2?n-2:0),o=2;o1){for(var h=Array(d),v=0;v1){for(var g=Array(m),y=0;y=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}},function(e,t,n){"use strict";function r(e){return void 0===e||null===e}e.exports.isNothing=r,e.exports.isObject=function(e){return"object"==typeof e&&null!==e},e.exports.toArray=function(e){return Array.isArray(e)?e:r(e)?[]:[e]},e.exports.repeat=function(e,t){var n,r="";for(n=0;n=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){e.exports=!n(101)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports={}},function(e,t,n){var r=n(119),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){"use strict";e.exports=function(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,r=0;r0?o(r(e),9007199254740991):0}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t,n){var r=n(60),o=n(460),i=n(461),a=Object.defineProperty;t.f=n(100)?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(121);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){var r=n(466),o=n(53);e.exports=function(e){return r(o(e))}},function(e,t,n){"use strict";var r=n(59),o=n(73),i=n(101),a=n(53),u=n(18);e.exports=function(e,t,n){var s=u(e),l=n(a,s,""[e]),c=l[0],f=l[1];i(function(){var t={};return t[s]=function(){return 7},7!=""[e](t)})&&(o(String.prototype,e,c),r(RegExp.prototype,s,2==t?function(e,t){return f.call(e,this,t)}:function(e){return f.call(e,this)}))}},function(e,t,n){var r=n(116)("meta"),o=n(28),i=n(52),a=n(40).f,u=0,s=Object.isExtensible||function(){return!0},l=!n(51)(function(){return s(Object.preventExtensions({}))}),c=function(e){a(e,r,{value:{i:"O"+ ++u,w:{}}})},f=e.exports={KEY:r,NEED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,r)){if(!s(e))return"F";if(!t)return"E";c(e)}return e[r].i},getWeak:function(e,t){if(!i(e,r)){if(!s(e))return!0;if(!t)return!1;c(e)}return e[r].w},onFreeze:function(e){return l&&f.NEED&&s(e)&&!i(e,r)&&c(e),e}}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){"use strict";var r={};e.exports=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CLEAR_BY=t.CLEAR=t.NEW_AUTH_ERR=t.NEW_SPEC_ERR_BATCH=t.NEW_SPEC_ERR=t.NEW_THROWN_ERR_BATCH=t.NEW_THROWN_ERR=void 0,t.newThrownErr=function(e){return{type:a,payload:(0,i.default)(e)}},t.newThrownErrBatch=function(e){return{type:u,payload:e}},t.newSpecErr=function(e){return{type:s,payload:e}},t.newSpecErrBatch=function(e){return{type:l,payload:e}},t.newAuthErr=function(e){return{type:c,payload:e}},t.clear=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:f,payload:e}},t.clearBy=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:p,payload:e}};var r,o=n(180),i=(r=o)&&r.__esModule?r:{default:r};var a=t.NEW_THROWN_ERR="err_new_thrown_err",u=t.NEW_THROWN_ERR_BATCH="err_new_thrown_err_batch",s=t.NEW_SPEC_ERR="err_new_spec_err",l=t.NEW_SPEC_ERR_BATCH="err_new_spec_err_batch",c=t.NEW_AUTH_ERR="err_new_auth_err",f=t.CLEAR="err_clear",p=t.CLEAR_BY="err_clear_by"},function(e,t,n){var r=n(62),o=n(47),i="[object Symbol]";e.exports=function(e){return"symbol"==typeof e||o(e)&&r(e)==i}},function(e,t,n){var r=n(63)(Object,"create");e.exports=r},function(e,t,n){var r=n(601),o=n(602),i=n(603),a=n(604),u=n(605);function s(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e1&&void 0!==arguments[1]?arguments[1]:"";if(u.List.isList(e))return e.some(function(e){return u.Map.isMap(e)&&e.get("in")===t})},t.parametersIncludeType=T,t.contentTypeValues=function(e,t){t=t||[];var n=d(e).getIn(["paths"].concat((0,o.default)(t)),(0,u.fromJS)({})),r=e.getIn(["meta","paths"].concat((0,o.default)(t)),(0,u.fromJS)({})),i=M(e,t),a=n.get("parameters")||new u.List,s=r.get("consumes_value")?r.get("consumes_value"):T(a,"file")?"multipart/form-data":T(a,"formData")?"application/x-www-form-urlencoded":void 0;return(0,u.fromJS)({requestContentType:s,responseContentType:i})},t.currentProducesFor=M,t.producesOptionsFor=function(e,t){t=t||[];var n=d(e),i=n.getIn(["paths"].concat((0,o.default)(t)),null);if(null===i)return;var a=t,u=(0,r.default)(a,1)[0],s=i.get("produces",null),l=n.getIn(["paths",u,"produces"],null),c=n.getIn(["produces"],null);return s||l||c},t.consumesOptionsFor=function(e,t){t=t||[];var n=d(e),i=n.getIn(["paths"].concat((0,o.default)(t)),null);if(null===i)return;var a=t,u=(0,r.default)(a,1)[0],s=i.get("consumes",null),l=n.getIn(["paths",u,"consumes"],null),c=n.getIn(["consumes"],null);return s||l||c};var i=n(58),a=n(9),u=n(7);function s(e){return e&&e.__esModule?e:{default:e}}var l=["get","put","post","delete","options","head","patch","trace"],c=function(e){return e||(0,u.Map)()},f=(t.lastError=(0,i.createSelector)(c,function(e){return e.get("lastError")}),t.url=(0,i.createSelector)(c,function(e){return e.get("url")}),t.specStr=(0,i.createSelector)(c,function(e){return e.get("spec")||""}),t.specSource=(0,i.createSelector)(c,function(e){return e.get("specSource")||"not-editor"}),t.specJson=(0,i.createSelector)(c,function(e){return e.get("json",(0,u.Map)())})),p=(t.specResolved=(0,i.createSelector)(c,function(e){return e.get("resolved",(0,u.Map)())}),t.specResolvedSubtree=function(e,t){return e.getIn(["resolvedSubtrees"].concat((0,o.default)(t)),void 0)},function e(t,n){return u.Map.isMap(t)&&u.Map.isMap(n)?n.get("$$ref")?n:(0,u.OrderedMap)().mergeWith(e,t,n):n}),d=t.specJsonWithResolvedSubtrees=(0,i.createSelector)(c,function(e){return(0,u.OrderedMap)().mergeWith(p,e.get("json"),e.get("resolvedSubtrees"))}),h=t.spec=function(e){return f(e)},v=(t.isOAS3=(0,i.createSelector)(h,function(){return!1}),t.info=(0,i.createSelector)(h,function(e){return j(e&&e.get("info"))})),m=(t.externalDocs=(0,i.createSelector)(h,function(e){return j(e&&e.get("externalDocs"))}),t.version=(0,i.createSelector)(v,function(e){return e&&e.get("version")})),g=(t.semver=(0,i.createSelector)(m,function(e){return/v?([0-9]*)\.([0-9]*)\.([0-9]*)/i.exec(e).slice(1)}),t.paths=(0,i.createSelector)(d,function(e){return e.get("paths")})),y=t.operations=(0,i.createSelector)(g,function(e){if(!e||e.size<1)return(0,u.List)();var t=(0,u.List)();return e&&e.forEach?(e.forEach(function(e,n){if(!e||!e.forEach)return{};e.forEach(function(e,r){l.indexOf(r)<0||(t=t.push((0,u.fromJS)({path:n,method:r,operation:e,id:r+"-"+n})))})}),t):(0,u.List)()}),b=t.consumes=(0,i.createSelector)(h,function(e){return(0,u.Set)(e.get("consumes"))}),_=t.produces=(0,i.createSelector)(h,function(e){return(0,u.Set)(e.get("produces"))}),w=(t.security=(0,i.createSelector)(h,function(e){return e.get("security",(0,u.List)())}),t.securityDefinitions=(0,i.createSelector)(h,function(e){return e.get("securityDefinitions")}),t.findDefinition=function(e,t){var n=e.getIn(["resolvedSubtrees","definitions",t],null),r=e.getIn(["json","definitions",t],null);return n||r||null},t.definitions=(0,i.createSelector)(h,function(e){var t=e.get("definitions");return u.Map.isMap(t)?t:(0,u.Map)()}),t.basePath=(0,i.createSelector)(h,function(e){return e.get("basePath")}),t.host=(0,i.createSelector)(h,function(e){return e.get("host")}),t.schemes=(0,i.createSelector)(h,function(e){return e.get("schemes",(0,u.Map)())}),t.operationsWithRootInherited=(0,i.createSelector)(y,b,_,function(e,t,n){return e.map(function(e){return e.update("operation",function(e){if(e){if(!u.Map.isMap(e))return;return e.withMutations(function(e){return e.get("consumes")||e.update("consumes",function(e){return(0,u.Set)(e).merge(t)}),e.get("produces")||e.update("produces",function(e){return(0,u.Set)(e).merge(n)}),e})}return(0,u.Map)()})})})),E=t.tags=(0,i.createSelector)(h,function(e){var t=e.get("tags",(0,u.List)());return u.List.isList(t)?t.filter(function(e){return u.Map.isMap(e)}):(0,u.List)()}),x=t.tagDetails=function(e,t){return(E(e)||(0,u.List)()).filter(u.Map.isMap).find(function(e){return e.get("name")===t},(0,u.Map)())},S=t.operationsWithTags=(0,i.createSelector)(w,E,function(e,t){return e.reduce(function(e,t){var n=(0,u.Set)(t.getIn(["operation","tags"]));return n.count()<1?e.update("default",(0,u.List)(),function(e){return e.push(t)}):n.reduce(function(e,n){return e.update(n,(0,u.List)(),function(e){return e.push(t)})},e)},t.reduce(function(e,t){return e.set(t.get("name"),(0,u.List)())},(0,u.OrderedMap)()))}),C=(t.taggedOperations=function(e){return function(t){var n=(0,t.getConfigs)(),r=n.tagsSorter,o=n.operationsSorter;return S(e).sortBy(function(e,t){return t},function(e,t){var n="function"==typeof r?r:a.sorters.tagsSorter[r];return n?n(e,t):null}).map(function(t,n){var r="function"==typeof o?o:a.sorters.operationsSorter[o],i=r?t.sort(r):t;return(0,u.Map)({tagDetails:x(e,n),operations:i})})}},t.responses=(0,i.createSelector)(c,function(e){return e.get("responses",(0,u.Map)())})),k=t.requests=(0,i.createSelector)(c,function(e){return e.get("requests",(0,u.Map)())}),A=t.mutatedRequests=(0,i.createSelector)(c,function(e){return e.get("mutatedRequests",(0,u.Map)())}),O=(t.responseFor=function(e,t,n){return C(e).getIn([t,n],null)},t.requestFor=function(e,t,n){return k(e).getIn([t,n],null)},t.mutatedRequestFor=function(e,t,n){return A(e).getIn([t,n],null)},t.allowTryItOutFor=function(){return!0},t.parameterWithMetaByIdentity=function(e,t,n){var r=d(e).getIn(["paths"].concat((0,o.default)(t),["parameters"]),(0,u.OrderedMap)()),i=e.getIn(["meta","paths"].concat((0,o.default)(t),["parameters"]),(0,u.OrderedMap)());return r.map(function(e){var t=i.get(n.get("in")+"."+n.get("name")),r=i.get(n.get("in")+"."+n.get("name")+".hash-"+n.hashCode());return(0,u.OrderedMap)().merge(e,t,r)}).find(function(e){return e.get("in")===n.get("in")&&e.get("name")===n.get("name")},(0,u.OrderedMap)())}),P=(t.parameterInclusionSettingFor=function(e,t,n,r){var i=r+"."+n;return e.getIn(["meta","paths"].concat((0,o.default)(t),["parameter_inclusions",i]),!1)},t.parameterWithMeta=function(e,t,n,r){var i=d(e).getIn(["paths"].concat((0,o.default)(t),["parameters"]),(0,u.OrderedMap)()).find(function(e){return e.get("in")===r&&e.get("name")===n},(0,u.OrderedMap)());return O(e,t,i)},t.operationWithMeta=function(e,t,n){var r=d(e).getIn(["paths",t,n],(0,u.OrderedMap)()),o=e.getIn(["meta","paths",t,n],(0,u.OrderedMap)()),i=r.get("parameters",(0,u.List)()).map(function(r){return O(e,[t,n],r)});return(0,u.OrderedMap)().merge(r,o).set("parameters",i)});t.hasHost=(0,i.createSelector)(h,function(e){var t=e.get("host");return"string"==typeof t&&t.length>0&&"/"!==t[0]});function T(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(u.List.isList(e))return e.some(function(e){return u.Map.isMap(e)&&e.get("type")===t})}function M(e,t){t=t||[];var n=d(e).getIn(["paths"].concat((0,o.default)(t)),null);if(null!==n){var r=e.getIn(["meta","paths"].concat((0,o.default)(t),["produces_value"]),null),i=n.getIn(["produces",0],null);return r||i||"application/json"}}var I=t.operationScheme=function(e,t,n){var r=e.get("url").match(/^([a-z][a-z0-9+\-.]*):/),o=Array.isArray(r)?r[1]:null;return e.getIn(["scheme",t,n])||e.getIn(["scheme","_defaultScheme"])||o||""};t.canExecuteScheme=function(e,t,n){return["http","https"].indexOf(I(e,t,n))>-1},t.validateBeforeExecute=function(e,t){t=t||[];var n=!0;return e.getIn(["meta","paths"].concat((0,o.default)(t),["parameters"]),(0,u.fromJS)([])).forEach(function(e){var t=e.get("errors");t&&t.count()&&(n=!1)}),n};function j(e){return u.Map.isMap(e)?e:new u.Map}},function(e,t,n){var r=n(49),o=n(329),i=n(330),a=n(36),u=n(115),s=n(165),l={},c={};(t=e.exports=function(e,t,n,f,p){var d,h,v,m,g=p?function(){return e}:s(e),y=r(n,f,t?2:1),b=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(i(g)){for(d=u(e.length);d>b;b++)if((m=t?y(a(h=e[b])[0],h[1]):y(e[b]))===l||m===c)return m}else for(v=g.call(e);!(h=v.next()).done;)if((m=o(v,y,h.value,t))===l||m===c)return m}).BREAK=l,t.RETURN=c},function(e,t,n){"use strict";var r=n(86);e.exports=r.DEFAULT=new r({include:[n(108)],explicit:[n(758),n(759),n(760)]})},function(e,t,n){var r=n(344),o=n(105),i=Object.prototype.hasOwnProperty;e.exports=function(e,t,n){var a=e[t];i.call(e,t)&&o(a,n)&&(void 0!==n||t in e)||r(e,t,n)}},function(e,t,n){"use strict";var r=n(11),o=(n(8),{}),i={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(e,t,n,o,i,a,u,s){var l,c;this.isInTransaction()&&r("27");try{this._isInTransaction=!0,l=!0,this.initializeAll(0),c=e.call(t,n,o,i,a,u,s),l=!1}finally{try{if(l)try{this.closeAll(0)}catch(e){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return c},initializeAll:function(e){for(var t=this.transactionWrappers,n=e;n]/,s=n(219)(function(e,t){if(e.namespaceURI!==i.svg||"innerHTML"in e)e.innerHTML=t;else{(r=r||document.createElement("div")).innerHTML=""+t+"";for(var n=r.firstChild;n.firstChild;)e.appendChild(n.firstChild)}});if(o.canUseDOM){var l=document.createElement("div");l.innerHTML=" ",""===l.innerHTML&&(s=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),a.test(t)||"<"===t[0]&&u.test(t)){e.innerHTML=String.fromCharCode(65279)+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t}),l=null}e.exports=s},function(e,t,n){"use strict";var r=/["'&<>]/;e.exports=function(e){return"boolean"==typeof e||"number"==typeof e?""+e:function(e){var t,n=""+e,o=r.exec(n);if(!o)return n;var i="",a=0,u=0;for(a=o.index;adocument.F=Object<\/script>"),e.close(),s=e.F;r--;)delete s.prototype[i[r]];return s()};e.exports=Object.create||function(e,t){var n;return null!==e?(u.prototype=r(e),n=new u,u.prototype=null,n[a]=e):n=s(),void 0===t?n:o(n,t)}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(163)("keys"),o=n(116);e.exports=function(e){return r[e]||(r[e]=o(e))}},function(e,t,n){var r=n(21),o=r["__core-js_shared__"]||(r["__core-js_shared__"]={});e.exports=function(e){return o[e]||(o[e]={})}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var r=n(166),o=n(19)("iterator"),i=n(70);e.exports=n(15).getIteratorMethod=function(e){if(void 0!=e)return e[o]||e["@@iterator"]||i[r(e)]}},function(e,t,n){var r=n(93),o=n(19)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:i?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},function(e,t,n){var r=n(99),o=n(18)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:i?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t,n){var r=n(74),o=n(33).document,i=r(o)&&r(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t,n){var r=n(243)("keys"),o=n(168);e.exports=function(e){return r[e]||(r[e]=o(e))}},function(e,t,n){var r=n(117).f,o=n(118),i=n(18)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){"use strict";var r=n(121);e.exports.f=function(e){return new function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r}),this.resolve=r(t),this.reject=r(n)}(e)}},function(e,t,n){var r=n(257),o=n(53);e.exports=function(e,t,n){if(r(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(o(e))}},function(e,t,n){var r=n(18)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[r]=!1,!"/./"[e](t)}catch(e){}}return!0}},function(e,t,n){t.f=n(19)},function(e,t,n){var r=n(21),o=n(15),i=n(114),a=n(175),u=n(40).f;e.exports=function(e){var t=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==e.charAt(0)||e in t||u(t,e,{value:a.f(e)})}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t){},function(e,t,n){"use strict";(function(t){ +/*! + * @description Recursive object extending + * @author Viacheslav Lotsmanov + * @license MIT + * + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Viacheslav Lotsmanov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +function n(e){return e instanceof t||e instanceof Date||e instanceof RegExp}function r(e){if(e instanceof t){var n=t.alloc?t.alloc(e.length):new t(e.length);return e.copy(n),n}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e);throw new Error("Unexpected situation")}function o(e,t){return"__proto__"===t?void 0:e[t]}var i=e.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var e,t,a=arguments[0];return Array.prototype.slice.call(arguments,1).forEach(function(u){"object"!=typeof u||null===u||Array.isArray(u)||Object.keys(u).forEach(function(s){return t=o(a,s),(e=o(u,s))===a?void 0:"object"!=typeof e||null===e?void(a[s]=e):Array.isArray(e)?void(a[s]=function e(t){var o=[];return t.forEach(function(t,a){"object"==typeof t&&null!==t?Array.isArray(t)?o[a]=e(t):n(t)?o[a]=r(t):o[a]=i({},t):o[a]=t}),o}(e)):n(e)?void(a[s]=r(e)):"object"!=typeof t||null===t||Array.isArray(t)?void(a[s]=i({},e)):void(a[s]=i(t,e))})}),a}}).call(t,n(54).Buffer)},function(e,t,n){"use strict";e.exports=function(e){return"object"==typeof e?function e(t,n){var r;r=Array.isArray(t)?[]:{};n.push(t);Object.keys(t).forEach(function(o){var i=t[o];"function"!=typeof i&&(i&&"object"==typeof i?-1!==n.indexOf(t[o])?r[o]="[Circular]":r[o]=e(t[o],n.slice(0)):r[o]=i)});"string"==typeof t.name&&(r.name=t.name);"string"==typeof t.message&&(r.message=t.message);"string"==typeof t.stack&&(r.stack=t.stack);return r}(e,[]):"function"==typeof e?"[Function: "+(e.name||"anonymous")+"]":e}},function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function o(e){return null===e?"null":void 0===e?"undefined":"object"===(void 0===e?"undefined":r(e))?Array.isArray(e)?"array":"object":void 0===e?"undefined":r(e)}function i(e){return"object"===o(e)?u(e):"array"===o(e)?a(e):e}function a(e){return e.map(i)}function u(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=i(e[n]));return t}function s(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n={arrayBehaviour:(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).arrayBehaviour||"replace"},r=t.map(function(e){return e||{}}),i=e||{},l=0;l1?t-1:0),r=1;r-1&&e%1==0&&e<=n}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,n){(function(e){var r=n(279),o="object"==typeof t&&t&&!t.nodeType&&t,i=o&&"object"==typeof e&&e&&!e.nodeType&&e,a=i&&i.exports===o&&r.process,u=function(){try{var e=i&&i.require&&i.require("util").types;return e||a&&a.binding&&a.binding("util")}catch(e){}}();e.exports=u}).call(t,n(134)(e))},function(e,t,n){var r=n(24),o=n(128),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!o(e))||a.test(e)||!i.test(e)||null!=t&&e in Object(t)}},function(e,t){e.exports=function(e){return e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.memoizedSampleFromSchema=t.memoizedCreateXMLExample=t.sampleXmlFromSchema=t.inferSchema=t.sampleFromSchema=void 0,t.createXMLExample=p;var r=n(9),o=u(n(657)),i=u(n(670)),a=u(n(181));function u(e){return e&&e.__esModule?e:{default:e}}var s={string:function(){return"string"},string_email:function(){return"user@example.com"},"string_date-time":function(){return(new Date).toISOString()},string_date:function(){return(new Date).toISOString().substring(0,10)},string_uuid:function(){return"3fa85f64-5717-4562-b3fc-2c963f66afa6"},string_hostname:function(){return"example.com"},string_ipv4:function(){return"198.51.100.42"},string_ipv6:function(){return"2001:0db8:5b96:0000:0000:426f:8e17:642a"},number:function(){return 0},number_float:function(){return 0},integer:function(){return 0},boolean:function(e){return"boolean"!=typeof e.default||e.default}},l=function(e){var t=e=(0,r.objectify)(e),n=t.type,o=t.format,i=s[n+"_"+o]||s[n];return(0,r.isFunc)(i)?i(e):"Unknown Type: "+e.type},c=t.sampleFromSchema=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=(0,r.objectify)(t),i=o.type,a=o.example,u=o.properties,s=o.additionalProperties,c=o.items,f=n.includeReadOnly,p=n.includeWriteOnly;if(void 0!==a)return(0,r.deeplyStripKey)(a,"$$ref",function(e){return"string"==typeof e&&e.indexOf("#")>-1});if(!i)if(u)i="object";else{if(!c)return;i="array"}if("object"===i){var d=(0,r.objectify)(u),h={};for(var v in d)d[v]&&d[v].deprecated||d[v]&&d[v].readOnly&&!f||d[v]&&d[v].writeOnly&&!p||(h[v]=e(d[v],n));if(!0===s)h.additionalProp1={};else if(s)for(var m=(0,r.objectify)(s),g=e(m,n),y=1;y<4;y++)h["additionalProp"+y]=g;return h}return"array"===i?Array.isArray(c.anyOf)?c.anyOf.map(function(t){return e(t,n)}):Array.isArray(c.oneOf)?c.oneOf.map(function(t){return e(t,n)}):[e(c,n)]:t.enum?t.default?t.default:(0,r.normalizeArray)(t.enum)[0]:"file"!==i?l(t):void 0},f=(t.inferSchema=function(e){return e.schema&&(e=e.schema),e.properties&&(e.type="object"),e},t.sampleXmlFromSchema=function e(t){var n,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=(0,a.default)({},(0,r.objectify)(t)),u=i.type,s=i.properties,c=i.additionalProperties,f=i.items,p=i.example,d=o.includeReadOnly,h=o.includeWriteOnly,v=i.default,m={},g={},y=t.xml,b=y.name,_=y.prefix,w=y.namespace,E=i.enum,x=void 0;if(!u)if(s||c)u="object";else{if(!f)return;u="array"}(b=b||"notagname",n=(_?_+":":"")+b,w)&&(g[_?"xmlns:"+_:"xmlns"]=w);if("array"===u&&f){if(f.xml=f.xml||y||{},f.xml.name=f.xml.name||y.name,y.wrapped)return m[n]=[],Array.isArray(p)?p.forEach(function(t){f.example=t,m[n].push(e(f,o))}):Array.isArray(v)?v.forEach(function(t){f.default=t,m[n].push(e(f,o))}):m[n]=[e(f,o)],g&&m[n].push({_attr:g}),m;var S=[];return Array.isArray(p)?(p.forEach(function(t){f.example=t,S.push(e(f,o))}),S):Array.isArray(v)?(v.forEach(function(t){f.default=t,S.push(e(f,o))}),S):e(f,o)}if("object"===u){var C=(0,r.objectify)(s);for(var k in m[n]=[],p=p||{},C)if(C.hasOwnProperty(k)&&(!C[k].readOnly||d)&&(!C[k].writeOnly||h))if(C[k].xml=C[k].xml||{},C[k].xml.attribute){var A=Array.isArray(C[k].enum)&&C[k].enum[0],O=C[k].example,P=C[k].default;g[C[k].xml.name||k]=void 0!==O&&O||void 0!==p[k]&&p[k]||void 0!==P&&P||A||l(C[k])}else{C[k].xml.name=C[k].xml.name||k,void 0===C[k].example&&void 0!==p[k]&&(C[k].example=p[k]);var T=e(C[k]);Array.isArray(T)?m[n]=m[n].concat(T):m[n].push(T)}return!0===c?m[n].push({additionalProp:"Anything can be here"}):c&&m[n].push({additionalProp:l(c)}),g&&m[n].push({_attr:g}),m}return x=void 0!==p?p:void 0!==v?v:Array.isArray(E)?E[0]:l(t),m[n]=g?[{_attr:g},x]:x,m});function p(e,t){var n=f(e,t);if(n)return(0,o.default)(n,{declaration:!0,indent:"\t"})}t.memoizedCreateXMLExample=(0,i.default)(p),t.memoizedSampleFromSchema=(0,i.default)(c)},function(e,t){function n(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function o(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=n,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},n.prototype.emit=function(e){var t,n,a,u,s,l;if(this._events||(this._events={}),"error"===e&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var c=new Error('Uncaught, unspecified "error" event. ('+t+")");throw c.context=t,c}if(i(n=this._events[e]))return!1;if(r(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:u=Array.prototype.slice.call(arguments,1),n.apply(this,u)}else if(o(n))for(u=Array.prototype.slice.call(arguments,1),a=(l=n.slice()).length,s=0;s0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function o(){this.removeListener(e,o),n||(n=!0,t.apply(this,arguments))}return o.listener=t,this.on(e,o),this},n.prototype.removeListener=function(e,t){var n,i,a,u;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(n=this._events[e]).length,i=-1,n===t||r(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(n)){for(u=a;u-- >0;)if(n[u]===t||n[u].listener&&n[u].listener===t){i=u;break}if(i<0)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},n.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},n.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},n.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},n.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t,n){(t=e.exports=n(306)).Stream=t,t.Readable=t,t.Writable=n(197),t.Duplex=n(65),t.Transform=n(311),t.PassThrough=n(665)},function(e,t,n){"use strict";(function(t,r,o){var i=n(140);function a(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,n){var r=e.entry;e.entry=null;for(;r;){var o=r.callback;t.pendingcb--,o(n),r=r.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}(t,e)}}e.exports=y;var u,s=!t.browser&&["v0.10","v0.9."].indexOf(t.version.slice(0,5))>-1?r:i.nextTick;y.WritableState=g;var l=n(106);l.inherits=n(81);var c={deprecate:n(664)},f=n(307),p=n(141).Buffer,d=o.Uint8Array||function(){};var h,v=n(308);function m(){}function g(e,t){u=u||n(65),e=e||{};var r=t instanceof u;this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var o=e.highWaterMark,l=e.writableHighWaterMark,c=this.objectMode?16:16384;this.highWaterMark=o||0===o?o:r&&(l||0===l)?l:c,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var f=!1===e.decodeStrings;this.decodeStrings=!f,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var n=e._writableState,r=n.sync,o=n.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(n),t)!function(e,t,n,r,o){--t.pendingcb,n?(i.nextTick(o,r),i.nextTick(S,e,t),e._writableState.errorEmitted=!0,e.emit("error",r)):(o(r),e._writableState.errorEmitted=!0,e.emit("error",r),S(e,t))}(e,n,r,t,o);else{var a=E(n);a||n.corked||n.bufferProcessing||!n.bufferedRequest||w(e,n),r?s(_,e,n,a,o):_(e,n,a,o)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new a(this)}function y(e){if(u=u||n(65),!(h.call(y,this)||this instanceof u))return new y(e);this._writableState=new g(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev),"function"==typeof e.destroy&&(this._destroy=e.destroy),"function"==typeof e.final&&(this._final=e.final)),f.call(this)}function b(e,t,n,r,o,i,a){t.writelen=r,t.writecb=a,t.writing=!0,t.sync=!0,n?e._writev(o,t.onwrite):e._write(o,i,t.onwrite),t.sync=!1}function _(e,t,n,r){n||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,r(),S(e,t)}function w(e,t){t.bufferProcessing=!0;var n=t.bufferedRequest;if(e._writev&&n&&n.next){var r=t.bufferedRequestCount,o=new Array(r),i=t.corkedRequestsFree;i.entry=n;for(var u=0,s=!0;n;)o[u]=n,n.isBuf||(s=!1),n=n.next,u+=1;o.allBuffers=s,b(e,t,!0,t.length,o,"",i.finish),t.pendingcb++,t.lastBufferedRequest=null,i.next?(t.corkedRequestsFree=i.next,i.next=null):t.corkedRequestsFree=new a(t),t.bufferedRequestCount=0}else{for(;n;){var l=n.chunk,c=n.encoding,f=n.callback;if(b(e,t,!1,t.objectMode?1:l.length,l,c,f),n=n.next,t.bufferedRequestCount--,t.writing)break}null===n&&(t.lastBufferedRequest=null)}t.bufferedRequest=n,t.bufferProcessing=!1}function E(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function x(e,t){e._final(function(n){t.pendingcb--,n&&e.emit("error",n),t.prefinished=!0,e.emit("prefinish"),S(e,t)})}function S(e,t){var n=E(t);return n&&(!function(e,t){t.prefinished||t.finalCalled||("function"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,i.nextTick(x,e,t)):(t.prefinished=!0,e.emit("prefinish")))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit("finish"))),n}l.inherits(y,f),g.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(g.prototype,"buffer",{get:c.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(h=Function.prototype[Symbol.hasInstance],Object.defineProperty(y,Symbol.hasInstance,{value:function(e){return!!h.call(this,e)||this===y&&(e&&e._writableState instanceof g)}})):h=function(e){return e instanceof this},y.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},y.prototype.write=function(e,t,n){var r,o=this._writableState,a=!1,u=!o.objectMode&&(r=e,p.isBuffer(r)||r instanceof d);return u&&!p.isBuffer(e)&&(e=function(e){return p.from(e)}(e)),"function"==typeof t&&(n=t,t=null),u?t="buffer":t||(t=o.defaultEncoding),"function"!=typeof n&&(n=m),o.ended?function(e,t){var n=new Error("write after end");e.emit("error",n),i.nextTick(t,n)}(this,n):(u||function(e,t,n,r){var o=!0,a=!1;return null===n?a=new TypeError("May not write null values to stream"):"string"==typeof n||void 0===n||t.objectMode||(a=new TypeError("Invalid non-string/buffer chunk")),a&&(e.emit("error",a),i.nextTick(r,a),o=!1),o}(this,o,e,n))&&(o.pendingcb++,a=function(e,t,n,r,o,i){if(!n){var a=function(e,t,n){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=p.from(t,n));return t}(t,r,o);r!==a&&(n=!0,o="buffer",r=a)}var u=t.objectMode?1:r.length;t.length+=u;var s=t.length-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(y.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),y.prototype._write=function(e,t,n){n(new Error("_write() is not implemented"))},y.prototype._writev=null,y.prototype.end=function(e,t,n){var r=this._writableState;"function"==typeof e?(n=e,e=null,t=null):"function"==typeof t&&(n=t,t=null),null!==e&&void 0!==e&&this.write(e,t),r.corked&&(r.corked=1,this.uncork()),r.ending||r.finished||function(e,t,n){t.ending=!0,S(e,t),n&&(t.finished?i.nextTick(n):e.once("finish",n));t.ended=!0,e.writable=!1}(this,r,n)},Object.defineProperty(y.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),y.prototype.destroy=v.destroy,y.prototype._undestroy=v.undestroy,y.prototype._destroy=function(e,t){this.end(),t(e)}}).call(t,n(56),n(309).setImmediate,n(31))},function(e,t,n){"use strict";e.exports=function(e){return"function"==typeof e}},function(e,t,n){"use strict";e.exports=n(691)()?Array.from:n(692)},function(e,t,n){"use strict";var r=n(705),o=n(67),i=n(82),a=Array.prototype.indexOf,u=Object.prototype.hasOwnProperty,s=Math.abs,l=Math.floor;e.exports=function(e){var t,n,c,f;if(!r(e))return a.apply(this,arguments);for(n=o(i(this).length),c=arguments[1],t=c=isNaN(c)?0:c>=0?l(c):o(this.length)-l(s(c));t1&&void 0!==arguments[1])||arguments[1];return e=(0,r.normalizeArray)(e),{type:u,payload:{thing:e,shown:t}}},t.changeMode=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=(0,r.normalizeArray)(e),{type:a,payload:{thing:e,mode:t}}};var r=n(9),o=t.UPDATE_LAYOUT="layout_update_layout",i=t.UPDATE_FILTER="layout_update_filter",a=t.UPDATE_MODE="layout_update_mode",u=t.SHOW="layout_show"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.execute=t.executeRequest=t.logRequest=t.setMutatedRequest=t.setRequest=t.setResponse=t.updateEmptyParamInclusion=t.validateParams=t.invalidateResolvedSubtreeCache=t.updateResolvedSubtree=t.requestResolvedSubtree=t.resolveSpec=t.parseToJson=t.SET_SCHEME=t.UPDATE_RESOLVED_SUBTREE=t.UPDATE_RESOLVED=t.UPDATE_OPERATION_META_VALUE=t.CLEAR_VALIDATE_PARAMS=t.CLEAR_REQUEST=t.CLEAR_RESPONSE=t.LOG_REQUEST=t.SET_MUTATED_REQUEST=t.SET_REQUEST=t.SET_RESPONSE=t.VALIDATE_PARAMS=t.UPDATE_EMPTY_PARAM_INCLUSION=t.UPDATE_PARAM=t.UPDATE_JSON=t.UPDATE_URL=t.UPDATE_SPEC=void 0;var r=b(n(25)),o=b(n(84)),i=b(n(23)),a=b(n(42)),u=b(n(204)),s=b(n(338)),l=b(n(339)),c=b(n(45));t.updateSpec=function(e){var t=L(e).replace(/\t/g," ");if("string"==typeof e)return{type:_,payload:t}},t.updateResolved=function(e){return{type:N,payload:e}},t.updateUrl=function(e){return{type:w,payload:e}},t.updateJsonSpec=function(e){return{type:E,payload:e}},t.changeParam=function(e,t,n,r,o){return{type:x,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:o}}},t.changeParamByIdentity=function(e,t,n,r){return{type:x,payload:{path:e,param:t,value:n,isXml:r}}},t.clearValidateParams=function(e){return{type:I,payload:{pathMethod:e}}},t.changeConsumesValue=function(e,t){return{type:j,payload:{path:e,value:t,key:"consumes_value"}}},t.changeProducesValue=function(e,t){return{type:j,payload:{path:e,value:t,key:"produces_value"}}},t.clearResponse=function(e,t){return{type:T,payload:{path:e,method:t}}},t.clearRequest=function(e,t){return{type:M,payload:{path:e,method:t}}},t.setScheme=function(e,t,n){return{type:D,payload:{scheme:e,path:t,method:n}}};var f=b(n(208)),p=n(7),d=b(n(210)),h=b(n(180)),v=b(n(342)),m=b(n(764)),g=b(n(766)),y=n(9);function b(e){return e&&e.__esModule?e:{default:e}}var _=t.UPDATE_SPEC="spec_update_spec",w=t.UPDATE_URL="spec_update_url",E=t.UPDATE_JSON="spec_update_json",x=t.UPDATE_PARAM="spec_update_param",S=t.UPDATE_EMPTY_PARAM_INCLUSION="spec_update_empty_param_inclusion",C=t.VALIDATE_PARAMS="spec_validate_param",k=t.SET_RESPONSE="spec_set_response",A=t.SET_REQUEST="spec_set_request",O=t.SET_MUTATED_REQUEST="spec_set_mutated_request",P=t.LOG_REQUEST="spec_log_request",T=t.CLEAR_RESPONSE="spec_clear_response",M=t.CLEAR_REQUEST="spec_clear_request",I=t.CLEAR_VALIDATE_PARAMS="spec_clear_validate_param",j=t.UPDATE_OPERATION_META_VALUE="spec_update_operation_meta_value",N=t.UPDATE_RESOLVED="spec_update_resolved",R=t.UPDATE_RESOLVED_SUBTREE="spec_update_resolved_subtree",D=t.SET_SCHEME="set_scheme",L=function(e){return(0,v.default)(e)?e:""};t.parseToJson=function(e){return function(t){var n=t.specActions,r=t.specSelectors,o=t.errActions,i=r.specStr,a=null;try{e=e||i(),o.clear({source:"parser"}),a=f.default.safeLoad(e)}catch(e){return console.error(e),o.newSpecErr({source:"parser",level:"error",message:e.reason,line:e.mark&&e.mark.line?e.mark.line+1:void 0})}return a&&"object"===(void 0===a?"undefined":(0,c.default)(a))?n.updateJsonSpec(a):{}}};var U=!1,q=(t.resolveSpec=function(e,t){return function(n){var r=n.specActions,o=n.specSelectors,i=n.errActions,a=n.fn,u=a.fetch,s=a.resolve,l=a.AST,c=void 0===l?{}:l,f=n.getConfigs;U||(console.warn("specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!"),U=!0);var p=f(),d=p.modelPropertyMacro,h=p.parameterMacro,v=p.requestInterceptor,m=p.responseInterceptor;void 0===e&&(e=o.specJson()),void 0===t&&(t=o.url());var g=c.getLineNumberForPath?c.getLineNumberForPath:function(){},y=o.specStr();return s({fetch:u,spec:e,baseDoc:t,modelPropertyMacro:d,parameterMacro:h,requestInterceptor:v,responseInterceptor:m}).then(function(e){var t=e.spec,n=e.errors;if(i.clear({type:"thrown"}),Array.isArray(n)&&n.length>0){var o=n.map(function(e){return console.error(e),e.line=e.fullPath?g(y,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",Object.defineProperty(e,"message",{enumerable:!0,value:e.message}),e});i.newThrownErrBatch(o)}return r.updateResolved(t)})}},[]),F=(0,m.default)((0,l.default)(s.default.mark(function e(){var t,n,r,o,i,a,c,f,d,h,v,m,y,b,_,w,E;return s.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=q.system){e.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),e.abrupt("return");case 4:if(n=t.errActions,r=t.errSelectors,o=t.fn,i=o.resolveSubtree,a=o.AST,c=void 0===a?{}:a,f=t.specSelectors,d=t.specActions,i){e.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),e.abrupt("return");case 8:return h=c.getLineNumberForPath?c.getLineNumberForPath:function(){},v=f.specStr(),m=t.getConfigs(),y=m.modelPropertyMacro,b=m.parameterMacro,_=m.requestInterceptor,w=m.responseInterceptor,e.prev=11,e.next=14,q.reduce(function(){var e=(0,l.default)(s.default.mark(function e(t,o){var a,u,l,c,p,d,m;return s.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return a=e.sent,u=a.resultMap,l=a.specWithCurrentSubtrees,e.next=7,i(l,o,{baseDoc:f.url(),modelPropertyMacro:y,parameterMacro:b,requestInterceptor:_,responseInterceptor:w});case 7:return c=e.sent,p=c.errors,d=c.spec,r.allErrors().size&&n.clearBy(function(e){return"thrown"!==e.get("type")||"resolver"!==e.get("source")||!e.get("fullPath").every(function(e,t){return e===o[t]||void 0===o[t]})}),Array.isArray(p)&&p.length>0&&(m=p.map(function(e){return e.line=e.fullPath?h(v,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",Object.defineProperty(e,"message",{enumerable:!0,value:e.message}),e}),n.newThrownErrBatch(m)),(0,g.default)(u,o,d),(0,g.default)(l,o,d),e.abrupt("return",{resultMap:u,specWithCurrentSubtrees:l});case 15:case"end":return e.stop()}},e,void 0)}));return function(t,n){return e.apply(this,arguments)}}(),u.default.resolve({resultMap:(f.specResolvedSubtree([])||(0,p.Map)()).toJS(),specWithCurrentSubtrees:f.specJson().toJS()}));case 14:E=e.sent,delete q.system,q=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:d.updateResolvedSubtree([],E.resultMap);case 23:case"end":return e.stop()}},e,void 0,[[11,19]])})),35);t.requestResolvedSubtree=function(e){return function(t){q.map(function(e){return e.join("@@")}).indexOf(e.join("@@"))>-1||(q.push(e),q.system=t,F())}};t.updateResolvedSubtree=function(e,t){return{type:R,payload:{path:e,value:t}}},t.invalidateResolvedSubtreeCache=function(){return{type:R,payload:{path:[],value:(0,p.Map)()}}},t.validateParams=function(e,t){return{type:C,payload:{pathMethod:e,isOAS3:t}}},t.updateEmptyParamInclusion=function(e,t,n,r){return{type:S,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};t.setResponse=function(e,t,n){return{payload:{path:e,method:t,res:n},type:k}},t.setRequest=function(e,t,n){return{payload:{path:e,method:t,req:n},type:A}},t.setMutatedRequest=function(e,t,n){return{payload:{path:e,method:t,req:n},type:O}},t.logRequest=function(e){return{payload:e,type:P}},t.executeRequest=function(e){return function(t){var n=t.fn,r=t.specActions,o=t.specSelectors,u=t.getConfigs,s=t.oas3Selectors,l=e.pathName,c=e.method,f=e.operation,p=u(),v=p.requestInterceptor,m=p.responseInterceptor,g=f.toJS();if(f&&f.get("parameters")&&f.get("parameters").filter(function(e){return e&&!0===e.get("allowEmptyValue")}).forEach(function(t){if(o.parameterInclusionSettingFor([l,c],t.get("name"),t.get("in"))){e.parameters=e.parameters||{};var n=(0,y.paramToValue)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get("name")]="")}}),e.contextUrl=(0,d.default)(o.url()).toString(),g&&g.operationId?e.operationId=g.operationId:g&&l&&c&&(e.operationId=n.opId(g,l,c)),o.isOAS3()){var b=l+":"+c;e.server=s.selectedServer(b)||s.selectedServer();var _=s.serverVariables({server:e.server,namespace:b}).toJS(),w=s.serverVariables({server:e.server}).toJS();e.serverVariables=(0,a.default)(_).length?_:w,e.requestContentType=s.requestContentType(l,c),e.responseContentType=s.responseContentType(l,c)||"*/*";var E=s.requestBodyValue(l,c);(0,y.isJSONObject)(E)?e.requestBody=JSON.parse(E):E&&E.toJS?e.requestBody=E.toJS():e.requestBody=E}var x=(0,i.default)({},e);x=n.buildRequest(x),r.setRequest(e.pathName,e.method,x);e.requestInterceptor=function(t){var n=v.apply(this,[t]),o=(0,i.default)({},n);return r.setMutatedRequest(e.pathName,e.method,o),n},e.responseInterceptor=m;var S=Date.now();return n.execute(e).then(function(t){t.duration=Date.now()-S,r.setResponse(e.pathName,e.method,t)}).catch(function(t){return r.setResponse(e.pathName,e.method,{error:!0,err:(0,h.default)(t)})})}};t.execute=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,i=(0,o.default)(e,["path","method"]);return function(e){var o=e.fn.fetch,a=e.specSelectors,u=e.specActions,s=a.specJsonWithResolvedSubtrees().toJS(),l=a.operationScheme(t,n),c=a.contentTypeValues([t,n]).toJS(),f=c.requestContentType,p=c.responseContentType,d=/xml/i.test(f),h=a.parameterValues([t,n],d).toJS();return u.executeRequest((0,r.default)({},i,{fetch:o,spec:s,pathName:t,method:n,parameters:h,requestContentType:f,scheme:l,responseContentType:p}))}}},function(e,t,n){e.exports={default:n(733),__esModule:!0}},function(e,t){e.exports=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e}},function(e,t,n){"use strict";var r=n(94);e.exports.f=function(e){return new function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r}),this.resolve=r(t),this.reject=r(n)}(e)}},function(e,t,n){var r=n(50);e.exports=function(e,t,n){for(var o in t)n&&e[o]?e[o]=t[o]:r(e,o,t[o]);return e}},function(e,t,n){"use strict";var r=n(742);e.exports=r},function(e,t,n){"use strict";var r=n(86);e.exports=new r({explicit:[n(745),n(746),n(747)]})},function(e,t,n){"use strict";(function(t){var r=n(762),o=n(763),i=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\S\s]*)/i,a=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,u=[["#","hash"],["?","query"],function(e){return e.replace("\\","/")},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d+)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],s={hash:1,query:1};function l(e){var n,r=t&&t.location||{},o={},i=typeof(e=e||r);if("blob:"===e.protocol)o=new f(unescape(e.pathname),{});else if("string"===i)for(n in o=new f(e,{}),s)delete o[n];else if("object"===i){for(n in e)n in s||(o[n]=e[n]);void 0===o.slashes&&(o.slashes=a.test(e.href))}return o}function c(e){var t=i.exec(e);return{protocol:t[1]?t[1].toLowerCase():"",slashes:!!t[2],rest:t[3]}}function f(e,t,n){if(!(this instanceof f))return new f(e,t,n);var i,a,s,p,d,h,v=u.slice(),m=typeof t,g=this,y=0;for("object"!==m&&"string"!==m&&(n=t,t=null),n&&"function"!=typeof n&&(n=o.parse),t=l(t),i=!(a=c(e||"")).protocol&&!a.slashes,g.slashes=a.slashes||i&&t.slashes,g.protocol=a.protocol||t.protocol||"",e=a.rest,a.slashes||(v[3]=[/(.*)/,"pathname"]);y-1||r("96",e),!l.plugins[n]){t.extractEvents||r("97",e),l.plugins[n]=t;var a=t.eventTypes;for(var s in a)u(a[s],t,s)||r("98",s,e)}}}function u(e,t,n){l.eventNameDispatchConfigs.hasOwnProperty(n)&&r("99",n),l.eventNameDispatchConfigs[n]=e;var o=e.phasedRegistrationNames;if(o){for(var i in o){if(o.hasOwnProperty(i))s(o[i],t,n)}return!0}return!!e.registrationName&&(s(e.registrationName,t,n),!0)}function s(e,t,n){l.registrationNameModules[e]&&r("100",e),l.registrationNameModules[e]=t,l.registrationNameDependencies[e]=t.eventTypes[n].dependencies}var l={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:null,injectEventPluginOrder:function(e){o&&r("101"),o=Array.prototype.slice.call(e),a()},injectEventPluginsByName:function(e){var t=!1;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];i.hasOwnProperty(n)&&i[n]===o||(i[n]&&r("102",n),i[n]=o,t=!0)}t&&a()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return l.registrationNameModules[t.registrationName]||null;if(void 0!==t.phasedRegistrationNames){var n=t.phasedRegistrationNames;for(var r in n)if(n.hasOwnProperty(r)){var o=l.registrationNameModules[n[r]];if(o)return o}}return null},_resetEventPlugins:function(){for(var e in o=null,i)i.hasOwnProperty(e)&&delete i[e];l.plugins.length=0;var t=l.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=l.registrationNameModules;for(var a in r)r.hasOwnProperty(a)&&delete r[a]}};e.exports=l},function(e,t,n){"use strict";var r,o,i=n(11),a=n(213);n(8),n(10);function u(e,t,n,r){var o=e.type||"unknown-event";e.currentTarget=s.getNodeFromInstance(r),t?a.invokeGuardedCallbackWithCatch(o,n,e):a.invokeGuardedCallback(o,n,e),e.currentTarget=null}var s={isEndish:function(e){return"topMouseUp"===e||"topTouchEnd"===e||"topTouchCancel"===e},isMoveish:function(e){return"topMouseMove"===e||"topTouchMove"===e},isStartish:function(e){return"topMouseDown"===e||"topTouchStart"===e},executeDirectDispatch:function(e){var t=e._dispatchListeners,n=e._dispatchInstances;Array.isArray(t)&&i("103"),e.currentTarget=t?s.getNodeFromInstance(n):null;var r=t?t(e):null;return e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,r},executeDispatchesInOrder:function(e,t){var n=e._dispatchListeners,r=e._dispatchInstances;if(Array.isArray(n))for(var o=0;o0&&r.length<20?n+" (keys: "+r.join(", ")+")":n}function s(e,t){var n=o.get(e);return n||null}var l={isMounted:function(e){var t=o.get(e);return!!t&&!!t._renderedComponent},enqueueCallback:function(e,t,n){l.validateCallback(t,n);var r=s(e);if(!r)return null;r._pendingCallbacks?r._pendingCallbacks.push(t):r._pendingCallbacks=[t],a(r)},enqueueCallbackInternal:function(e,t){e._pendingCallbacks?e._pendingCallbacks.push(t):e._pendingCallbacks=[t],a(e)},enqueueForceUpdate:function(e){var t=s(e);t&&(t._pendingForceUpdate=!0,a(t))},enqueueReplaceState:function(e,t,n){var r=s(e);r&&(r._pendingStateQueue=[t],r._pendingReplaceState=!0,void 0!==n&&null!==n&&(l.validateCallback(n,"replaceState"),r._pendingCallbacks?r._pendingCallbacks.push(n):r._pendingCallbacks=[n]),a(r))},enqueueSetState:function(e,t){var n=s(e);n&&((n._pendingStateQueue||(n._pendingStateQueue=[])).push(t),a(n))},enqueueElementInternal:function(e,t,n){e._pendingElement=t,e._context=n,a(e)},validateCallback:function(e,t){e&&"function"!=typeof e&&r("122",t,u(e))}};e.exports=l},function(e,t,n){"use strict";n(13);var r=n(34),o=(n(10),r);e.exports=o},function(e,t,n){"use strict";e.exports=function(e){var t,n=e.keyCode;return"charCode"in e?0===(t=e.charCode)&&13===n&&(t=13):t=n,t>=32||13===t?t:0}},function(e,t,n){var r=n(62),o=n(229),i=n(47),a="[object Object]",u=Function.prototype,s=Object.prototype,l=u.toString,c=s.hasOwnProperty,f=l.call(Object);e.exports=function(e){if(!i(e)||r(e)!=a)return!1;var t=o(e);if(null===t)return!0;var n=c.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&l.call(n)==f}},function(e,t,n){var r=n(298)(Object.getPrototypeOf,Object);e.exports=r},function(e,t,n){var r=n(292);e.exports=function(e){var t=new e.constructor(e.byteLength);return new r(t).set(new r(e)),t}},function(e,t){var n=this&&this.__extends||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);function r(){this.constructor=e}e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},r=Object.prototype.hasOwnProperty; +/*! + * https://github.com/Starcounter-Jack/JSON-Patch + * (c) 2017 Joachim Wester + * MIT license + */function o(e,t){return r.call(e,t)}function i(e){if(Array.isArray(e)){for(var t=new Array(e.length),n=0;n=48&&t<=57))return!1;n++}return!0},t.escapePathComponent=a,t.unescapePathComponent=function(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")},t._getPathRecursive=u,t.getPath=function(e,t){if(e===t)return"/";var n=u(e,t);if(""===n)throw new Error("Object not found in root");return"/"+n},t.hasUndefined=function e(t){if(void 0===t)return!0;if(t)if(Array.isArray(t)){for(var n=0,r=t.length;nw;w++)if((p||w in y)&&(m=b(v=y[w],w,g),e))if(n)E[w]=m;else if(m)switch(e){case 3:return!0;case 5:return v;case 6:return w;case 2:E.push(v)}else if(c)return!1;return f?-1:l||c?c:E}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.authorizeRequest=t.authorizeAccessCodeWithBasicAuthentication=t.authorizeAccessCodeWithFormParams=t.authorizeApplication=t.authorizePassword=t.preAuthorizeImplicit=t.CONFIGURE_AUTH=t.VALIDATE=t.AUTHORIZE_OAUTH2=t.PRE_AUTHORIZE_OAUTH2=t.LOGOUT=t.AUTHORIZE=t.SHOW_AUTH_POPUP=void 0;var r=l(n(45)),o=l(n(23)),i=l(n(41));t.showDefinitions=function(e){return{type:c,payload:e}},t.authorize=function(e){return{type:f,payload:e}},t.logout=function(e){return{type:p,payload:e}},t.authorizeOauth2=function(e){return{type:d,payload:e}},t.configureAuth=function(e){return{type:h,payload:e}};var a=l(n(210)),u=l(n(32)),s=n(9);function l(e){return e&&e.__esModule?e:{default:e}}var c=t.SHOW_AUTH_POPUP="show_popup",f=t.AUTHORIZE="authorize",p=t.LOGOUT="logout",d=(t.PRE_AUTHORIZE_OAUTH2="pre_authorize_oauth2",t.AUTHORIZE_OAUTH2="authorize_oauth2"),h=(t.VALIDATE="validate",t.CONFIGURE_AUTH="configure_auth");t.preAuthorizeImplicit=function(e){return function(t){var n=t.authActions,r=t.errActions,o=e.auth,a=e.token,s=e.isValid,l=o.schema,c=o.name,f=l.get("flow");delete u.default.swaggerUIRedirectOauth2,"accessCode"===f||s||r.newAuthErr({authId:c,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),a.error?r.newAuthErr({authId:c,source:"auth",level:"error",message:(0,i.default)(a)}):n.authorizeOauth2({auth:o,token:a})}};t.authorizePassword=function(e){return function(t){var n=t.authActions,r=e.schema,i=e.name,a=e.username,u=e.password,l=e.passwordType,c=e.clientId,f=e.clientSecret,p={grant_type:"password",scope:e.scopes.join(" "),username:a,password:u},d={};switch(l){case"request-body":!function(e,t,n){t&&(0,o.default)(e,{client_id:t});n&&(0,o.default)(e,{client_secret:n})}(p,c,f);break;case"basic":d.Authorization="Basic "+(0,s.btoa)(c+":"+f);break;default:console.warn("Warning: invalid passwordType "+l+" was passed, not including client id and secret")}return n.authorizeRequest({body:(0,s.buildFormData)(p),url:r.get("tokenUrl"),name:i,headers:d,query:{},auth:e})}};t.authorizeApplication=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.scopes,i=e.name,a=e.clientId,u=e.clientSecret,l={Authorization:"Basic "+(0,s.btoa)(a+":"+u)},c={grant_type:"client_credentials",scope:o.join(" ")};return n.authorizeRequest({body:(0,s.buildFormData)(c),name:i,url:r.get("tokenUrl"),auth:e,headers:l})}},t.authorizeAccessCodeWithFormParams=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,i=t.name,a=t.clientId,u=t.clientSecret,l={grant_type:"authorization_code",code:t.code,client_id:a,client_secret:u,redirect_uri:n};return r.authorizeRequest({body:(0,s.buildFormData)(l),name:i,url:o.get("tokenUrl"),auth:t})}},t.authorizeAccessCodeWithBasicAuthentication=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,i=t.name,a=t.clientId,u=t.clientSecret,l={Authorization:"Basic "+(0,s.btoa)(a+":"+u)},c={grant_type:"authorization_code",code:t.code,client_id:a,redirect_uri:n};return r.authorizeRequest({body:(0,s.buildFormData)(c),name:i,url:o.get("tokenUrl"),auth:t,headers:l})}},t.authorizeRequest=function(e){return function(t){var n=t.fn,u=t.getConfigs,s=t.authActions,l=t.errActions,c=t.oas3Selectors,f=t.specSelectors,p=t.authSelectors,d=e.body,h=e.query,v=void 0===h?{}:h,m=e.headers,g=void 0===m?{}:m,y=e.name,b=e.url,_=e.auth,w=(p.getConfigs()||{}).additionalQueryStringParams,E=void 0;E=f.isOAS3()?(0,a.default)(b,c.selectedServer(),!0):(0,a.default)(b,f.url(),!0),"object"===(void 0===w?"undefined":(0,r.default)(w))&&(E.query=(0,o.default)({},E.query,w));var x=E.toString(),S=(0,o.default)({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},g);n.fetch({url:x,method:"post",headers:S,query:v,body:d,requestInterceptor:u().requestInterceptor,responseInterceptor:u().responseInterceptor}).then(function(e){var t=JSON.parse(e.data),n=t&&(t.error||""),r=t&&(t.parseError||"");e.ok?n||r?l.newAuthErr({authId:y,level:"error",source:"auth",message:(0,i.default)(t)}):s.authorizeOauth2({auth:_,token:t}):l.newAuthErr({authId:y,level:"error",source:"auth",message:e.statusText})}).catch(function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r="string"==typeof n?JSON.parse(n):n;r.error&&(t+=", error: "+r.error),r.error_description&&(t+=", description: "+r.error_description)}catch(e){}}l.newAuthErr({authId:y,level:"error",source:"auth",message:t})})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.parseYamlConfig=void 0;var r,o=n(208),i=(r=o)&&r.__esModule?r:{default:r};t.parseYamlConfig=function(e,t){try{return i.default.safeLoad(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.loaded=t.TOGGLE_CONFIGS=t.UPDATE_CONFIGS=void 0;var r,o=n(22),i=(r=o)&&r.__esModule?r:{default:r};t.update=function(e,t){return{type:a,payload:(0,i.default)({},e,t)}},t.toggle=function(e){return{type:u,payload:e}};var a=t.UPDATE_CONFIGS="configs_update",u=t.TOGGLE_CONFIGS="configs_toggle";t.loaded=function(){return function(){}}},function(e,t,n){"use strict";function r(e,t,n,r,o){this.src=e,this.env=r,this.options=n,this.parser=t,this.tokens=o,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending="",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent="",this.labelUnmatchedScopes=0}r.prototype.pushPending=function(){this.tokens.push({type:"text",content:this.pending,level:this.pendingLevel}),this.pending=""},r.prototype.push=function(e){this.pending&&this.pushPending(),this.tokens.push(e),this.pendingLevel=this.level},r.prototype.cacheSet=function(e,t){for(var n=this.cache.length;n<=e;n++)this.cache.push(0);this.cache[e]=t},r.prototype.cacheGet=function(e){return es;)r(u,n=t[s++])&&(~i(l,n)||l.push(n));return l}},function(e,t,n){var r=n(21).document;e.exports=r&&r.documentElement},function(e,t,n){var r=n(52),o=n(72),i=n(162)("IE_PROTO"),a=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=o(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?a:null}},function(e,t,n){var r=n(33),o=r["__core-js_shared__"]||(r["__core-js_shared__"]={});e.exports=function(e){return o[e]||(o[e]={})}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";var r=n(246)(!0);n(247)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var r=n(119),o=n(53);e.exports=function(e){return function(t,n){var i,a,u=String(o(t)),s=r(n),l=u.length;return s<0||s>=l?e?"":void 0:(i=u.charCodeAt(s))<55296||i>56319||s+1===l||(a=u.charCodeAt(s+1))<56320||a>57343?e?u.charAt(s):i:e?u.slice(s,s+2):a-56320+(i-55296<<10)+65536}}},function(e,t,n){"use strict";var r=n(248),o=n(29),i=n(73),a=n(59),u=n(102),s=n(462),l=n(171),c=n(468),f=n(18)("iterator"),p=!([].keys&&"next"in[].keys()),d=function(){return this};e.exports=function(e,t,n,h,v,m,g){s(n,t,h);var y,b,_,w=function(e){if(!p&&e in C)return C[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},E=t+" Iterator",x="values"==v,S=!1,C=e.prototype,k=C[f]||C["@@iterator"]||v&&C[v],A=k||w(v),O=v?x?w("entries"):A:void 0,P="Array"==t&&C.entries||k;if(P&&(_=c(P.call(new e)))!==Object.prototype&&_.next&&(l(_,E,!0),r||"function"==typeof _[f]||a(_,f,d)),x&&k&&"values"!==k.name&&(S=!0,A=function(){return k.call(this)}),r&&!g||!p&&!S&&C[f]||a(C,f,A),u[t]=A,u[E]=d,v)if(y={values:x?A:w("values"),keys:m?A:w("keys"),entries:O},g)for(b in y)b in C||i(C,b,y[b]);else o(o.P+o.F*(p||S),t,y);return y}},function(e,t){e.exports=!1},function(e,t,n){var r=n(465),o=n(251);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t,n){var r=n(119),o=Math.max,i=Math.min;e.exports=function(e,t){return(e=r(e))<0?o(e+t,0):i(e,t)}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var r=n(33).document;e.exports=r&&r.documentElement},function(e,t,n){var r=n(60),o=n(121),i=n(18)("species");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||void 0==(n=r(a)[i])?t:o(n)}},function(e,t,n){var r,o,i,a=n(120),u=n(480),s=n(252),l=n(169),c=n(33),f=c.process,p=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,v=c.Dispatch,m=0,g={},y=function(){var e=+this;if(g.hasOwnProperty(e)){var t=g[e];delete g[e],t()}},b=function(e){y.call(e.data)};p&&d||(p=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return g[++m]=function(){u("function"==typeof e?e:Function(e),t)},r(m),m},d=function(e){delete g[e]},"process"==n(99)(f)?r=function(e){f.nextTick(a(y,e,1))}:v&&v.now?r=function(e){v.now(a(y,e,1))}:h?(i=(o=new h).port2,o.port1.onmessage=b,r=a(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(r=function(e){c.postMessage(e+"","*")},c.addEventListener("message",b,!1)):r="onreadystatechange"in l("script")?function(e){s.appendChild(l("script")).onreadystatechange=function(){s.removeChild(this),y.call(e)}}:function(e){setTimeout(a(y,e,1),0)}),e.exports={set:p,clear:d}},function(e,t){e.exports=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}}},function(e,t,n){var r=n(60),o=n(74),i=n(172);e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=i.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){var r=n(74),o=n(99),i=n(18)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[i])?!!t:"RegExp"==o(e))}},function(e,t,n){var r=n(20),o=n(15),i=n(51);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],a={};a[e]=t(n),r(r.S+r.F*i(function(){n(1)}),"Object",a)}},function(e,t,n){var r=n(93);e.exports=Array.isArray||function(e){return"Array"==r(e)}},function(e,t,n){var r=n(240),o=n(164).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},function(e,t,n){var r=n(125),o=n(95),i=n(71),a=n(158),u=n(52),s=n(239),l=Object.getOwnPropertyDescriptor;t.f=n(44)?l:function(e,t){if(e=i(e),t=a(t,!0),s)try{return l(e,t)}catch(e){}if(u(e,t))return o(!r.f.call(e,t),e[t])}},function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==n.call(e)}},function(e,t,n){e.exports={default:n(532),__esModule:!0}},function(e,t,n){"use strict";var r=n(96),o=n(177),i=n(125),a=n(72),u=n(155),s=Object.assign;e.exports=!s||n(51)(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=s({},e)[n]||Object.keys(s({},t)).join("")!=r})?function(e,t){for(var n=a(e),s=arguments.length,l=1,c=o.f,f=i.f;s>l;)for(var p,d=u(arguments[l++]),h=c?r(d).concat(c(d)):r(d),v=h.length,m=0;v>m;)f.call(d,p=h[m++])&&(n[p]=d[p]);return n}:s},function(e,t,n){"use strict";var r=n(104),o=n(13),i=n(266),a=(n(267),n(126));n(8),n(536);function u(e,t,n){this.props=e,this.context=t,this.refs=a,this.updater=n||i}function s(e,t,n){this.props=e,this.context=t,this.refs=a,this.updater=n||i}function l(){}u.prototype.isReactComponent={},u.prototype.setState=function(e,t){"object"!=typeof e&&"function"!=typeof e&&null!=e&&r("85"),this.updater.enqueueSetState(this,e),t&&this.updater.enqueueCallback(this,t,"setState")},u.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e,"forceUpdate")},l.prototype=u.prototype,s.prototype=new l,s.prototype.constructor=s,o(s.prototype,u.prototype),s.prototype.isPureReactComponent=!0,e.exports={Component:u,PureComponent:s}},function(e,t,n){"use strict";n(10);var r={isMounted:function(e){return!1},enqueueCallback:function(e,t){},enqueueForceUpdate:function(e){},enqueueReplaceState:function(e,t){},enqueueSetState:function(e,t){}};e.exports=r},function(e,t,n){"use strict";var r=!1;e.exports=r},function(e,t,n){"use strict";var r="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103;e.exports=r},function(e,t,n){"use strict";var r=n(544);e.exports=function(e){return r(e,!1)}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(272),o=n(561),i=n(562),a=n(563),u=n(276);n(275);n.d(t,"createStore",function(){return r.b}),n.d(t,"combineReducers",function(){return o.a}),n.d(t,"bindActionCreators",function(){return i.a}),n.d(t,"applyMiddleware",function(){return a.a}),n.d(t,"compose",function(){return u.a})},function(e,t,n){"use strict";n.d(t,"a",function(){return i}),t.b=function e(t,n,a){var u;"function"==typeof n&&void 0===a&&(a=n,n=void 0);if(void 0!==a){if("function"!=typeof a)throw new Error("Expected the enhancer to be a function.");return a(e)(t,n)}if("function"!=typeof t)throw new Error("Expected the reducer to be a function.");var s=t;var l=n;var c=[];var f=c;var p=!1;function d(){f===c&&(f=c.slice())}function h(){return l}function v(e){if("function"!=typeof e)throw new Error("Expected listener to be a function.");var t=!0;return d(),f.push(e),function(){if(t){t=!1,d();var n=f.indexOf(e);f.splice(n,1)}}}function m(e){if(!r.a(e))throw new Error("Actions must be plain objects. Use custom middleware for async actions.");if(void 0===e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?');if(p)throw new Error("Reducers may not dispatch actions.");try{p=!0,l=s(l,e)}finally{p=!1}for(var t=c=f,n=0;no?0:o+t),(n=n>o?o:n)<0&&(n+=o),o=t>n?0:n-t>>>0,t>>>=0;for(var i=Array(o);++rp))return!1;var h=c.get(e);if(h&&c.get(t))return h==t;var v=-1,m=!0,g=n&u?new r:void 0;for(c.set(e,t),c.set(t,e);++v0?("string"==typeof t||a.objectMode||Object.getPrototypeOf(t)===l.prototype||(t=function(e){return l.from(e)}(t)),r?a.endEmitted?e.emit("error",new Error("stream.unshift() after end event")):w(e,a,t,!0):a.ended?e.emit("error",new Error("stream.push() after EOF")):(a.reading=!1,a.decoder&&!n?(t=a.decoder.write(t),a.objectMode||0!==t.length?w(e,a,t,!1):k(e,a)):w(e,a,t,!1))):r||(a.reading=!1));return function(e){return!e.ended&&(e.needReadable||e.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=E?e=E:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function S(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(d("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?o.nextTick(C,e):C(e))}function C(e){d("emit readable"),e.emit("readable"),T(e)}function k(e,t){t.readingMore||(t.readingMore=!0,o.nextTick(A,e,t))}function A(e,t){for(var n=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=t.length?(n=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):n=function(e,t,n){var r;ei.length?i.length:e;if(a===i.length?o+=i:o+=i.slice(0,e),0===(e-=a)){a===i.length?(++r,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=i.slice(a));break}++r}return t.length-=r,o}(e,t):function(e,t){var n=l.allocUnsafe(e),r=t.head,o=1;r.data.copy(n),e-=r.data.length;for(;r=r.next;){var i=r.data,a=e>i.length?i.length:e;if(i.copy(n,n.length-e,0,a),0===(e-=a)){a===i.length?(++o,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=i.slice(a));break}++o}return t.length-=o,n}(e,t);return r}(e,t.buffer,t.decoder),n);var n}function I(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,o.nextTick(j,t,e))}function j(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function N(e,t){for(var n=0,r=e.length;n=t.highWaterMark||t.ended))return d("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?I(this):S(this),null;if(0===(e=x(e,t))&&t.ended)return 0===t.length&&I(this),null;var r,o=t.needReadable;return d("need readable",o),(0===t.length||t.length-e0?M(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),n!==e&&t.ended&&I(this)),null!==r&&this.emit("data",r),r},b.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},b.prototype.pipe=function(e,t){var n=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=e;break;case 1:i.pipes=[i.pipes,e];break;default:i.pipes.push(e)}i.pipesCount+=1,d("pipe count=%d opts=%j",i.pipesCount,t);var s=(!t||!1!==t.end)&&e!==r.stdout&&e!==r.stderr?c:b;function l(t,r){d("onunpipe"),t===n&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,d("cleanup"),e.removeListener("close",g),e.removeListener("finish",y),e.removeListener("drain",f),e.removeListener("error",m),e.removeListener("unpipe",l),n.removeListener("end",c),n.removeListener("end",b),n.removeListener("data",v),p=!0,!i.awaitDrain||e._writableState&&!e._writableState.needDrain||f())}function c(){d("onend"),e.end()}i.endEmitted?o.nextTick(s):n.once("end",s),e.on("unpipe",l);var f=function(e){return function(){var t=e._readableState;d("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&u(e,"data")&&(t.flowing=!0,T(e))}}(n);e.on("drain",f);var p=!1;var h=!1;function v(t){d("ondata"),h=!1,!1!==e.write(t)||h||((1===i.pipesCount&&i.pipes===e||i.pipesCount>1&&-1!==N(i.pipes,e))&&!p&&(d("false write response, pause",n._readableState.awaitDrain),n._readableState.awaitDrain++,h=!0),n.pause())}function m(t){d("onerror",t),b(),e.removeListener("error",m),0===u(e,"error")&&e.emit("error",t)}function g(){e.removeListener("finish",y),b()}function y(){d("onfinish"),e.removeListener("close",g),b()}function b(){d("unpipe"),n.unpipe(e)}return n.on("data",v),function(e,t,n){if("function"==typeof e.prependListener)return e.prependListener(t,n);e._events&&e._events[t]?a(e._events[t])?e._events[t].unshift(n):e._events[t]=[n,e._events[t]]:e.on(t,n)}(e,"error",m),e.once("close",g),e.once("finish",y),e.emit("pipe",n),i.flowing||(d("pipe resume"),n.resume()),e},b.prototype.unpipe=function(e){var t=this._readableState,n={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,n),this);if(!e){var r=t.pipes,o=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var i=0;i=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(663),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(t,n(31))},function(e,t,n){"use strict";var r=n(141).Buffer,o=r.isEncoding||function(e){switch((e=""+e)&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function i(e){var t;switch(this.encoding=function(e){var t=function(e){if(!e)return"utf8";for(var t;;)switch(e){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return e;default:if(t)return;e=(""+e).toLowerCase(),t=!0}}(e);if("string"!=typeof t&&(r.isEncoding===o||!o(e)))throw new Error("Unknown encoding: "+e);return t||e}(e),this.encoding){case"utf16le":this.text=s,this.end=l,t=4;break;case"utf8":this.fillLast=u,t=4;break;case"base64":this.text=c,this.end=f,t=3;break;default:return this.write=p,void(this.end=d)}this.lastNeed=0,this.lastTotal=0,this.lastChar=r.allocUnsafe(t)}function a(e){return e<=127?0:e>>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function u(e){var t=this.lastTotal-this.lastNeed,n=function(e,t,n){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==n?n:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function s(e,t){if((e.length-t)%2==0){var n=e.toString("utf16le",t);if(n){var r=n.charCodeAt(n.length-1);if(r>=55296&&r<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],n.slice(0,-1)}return n}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function l(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var n=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,n)}return t}function c(e,t){var n=(e.length-t)%3;return 0===n?e.toString("base64",t):(this.lastNeed=3-n,this.lastTotal=3,1===n?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-n))}function f(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function p(e){return e.toString(this.encoding)}function d(e){return e&&e.length?this.write(e):""}t.StringDecoder=i,i.prototype.write=function(e){if(0===e.length)return"";var t,n;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";n=this.lastNeed,this.lastNeed=0}else n=0;return n=0)return o>0&&(e.lastNeed=o-1),o;if(--r=0)return o>0&&(e.lastNeed=o-2),o;if(--r=0)return o>0&&(2===o?o=0:e.lastNeed=o-3),o;return 0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=n;var r=e.length-(n-this.lastNeed);return e.copy(this.lastChar,0,r),e.toString("utf8",t,r)},i.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},function(e,t,n){"use strict";e.exports=i;var r=n(65),o=n(106);function i(e){if(!(this instanceof i))return new i(e);r.call(this,e),this._transformState={afterTransform:function(e,t){var n=this._transformState;n.transforming=!1;var r=n.writecb;if(!r)return this.emit("error",new Error("write callback called multiple times"));n.writechunk=null,n.writecb=null,null!=t&&this.push(t),r(e);var o=this._readableState;o.reading=!1,(o.needReadable||o.length=0?n&&o?o-1:o:1:!1!==e&&r(e)}},function(e,t,n){"use strict";e.exports=n(679)()?Object.assign:n(680)},function(e,t,n){"use strict";var r,o,i,a,u,s=n(67),l=function(e,t){return t};try{Object.defineProperty(l,"length",{configurable:!0,writable:!1,enumerable:!1,value:1})}catch(e){}1===l.length?(r={configurable:!0,writable:!1,enumerable:!1},o=Object.defineProperty,e.exports=function(e,t){return t=s(t),e.length===t?e:(r.value=t,o(e,"length",r))}):(a=n(317),u=[],i=function(e){var t,n=0;if(u[e])return u[e];for(t=[];e--;)t.push("a"+(++n).toString(36));return new Function("fn","return function ("+t.join(", ")+") { return fn.apply(this, arguments); };")},e.exports=function(e,t){var n;if(t=s(t),e.length===t)return e;n=i(t)(e);try{a(n,e)}catch(e){}return n})},function(e,t,n){"use strict";var r=n(82),o=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols;e.exports=function(e,t){var n,s=Object(r(t));if(e=Object(r(e)),a(s).forEach(function(r){try{o(e,r,i(t,r))}catch(e){n=e}}),"function"==typeof u&&u(s).forEach(function(r){try{o(e,r,i(t,r))}catch(e){n=e}}),void 0!==n)throw n;return e}},function(e,t,n){"use strict";var r=n(57),o=n(142),i=Function.prototype.call;e.exports=function(e,t){var n={},a=arguments[2];return r(t),o(e,function(e,r,o,u){n[r]=i.call(t,a,e,r,o,u)}),n}},function(e,t){e.exports=function(e){return!!e&&("object"==typeof e||"function"==typeof e)&&"function"==typeof e.then}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return{statePlugins:{err:{reducers:(0,i.default)(e),actions:a,selectors:u}}}};var r,o=n(321),i=(r=o)&&r.__esModule?r:{default:r},a=s(n(127)),u=s(n(325));function s(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=s(n(22)),o=s(n(23));t.default=function(e){var t;return t={},(0,r.default)(t,i.NEW_THROWN_ERR,function(t,n){var r=n.payload,i=(0,o.default)(l,r,{type:"thrown"});return t.update("errors",function(e){return(e||(0,a.List)()).push((0,a.fromJS)(i))}).update("errors",function(t){return(0,u.default)(t,e.getSystem())})}),(0,r.default)(t,i.NEW_THROWN_ERR_BATCH,function(t,n){var r=n.payload;return r=r.map(function(e){return(0,a.fromJS)((0,o.default)(l,e,{type:"thrown"}))}),t.update("errors",function(e){return(e||(0,a.List)()).concat((0,a.fromJS)(r))}).update("errors",function(t){return(0,u.default)(t,e.getSystem())})}),(0,r.default)(t,i.NEW_SPEC_ERR,function(t,n){var r=n.payload,o=(0,a.fromJS)(r);return o=o.set("type","spec"),t.update("errors",function(e){return(e||(0,a.List)()).push((0,a.fromJS)(o)).sortBy(function(e){return e.get("line")})}).update("errors",function(t){return(0,u.default)(t,e.getSystem())})}),(0,r.default)(t,i.NEW_SPEC_ERR_BATCH,function(t,n){var r=n.payload;return r=r.map(function(e){return(0,a.fromJS)((0,o.default)(l,e,{type:"spec"}))}),t.update("errors",function(e){return(e||(0,a.List)()).concat((0,a.fromJS)(r))}).update("errors",function(t){return(0,u.default)(t,e.getSystem())})}),(0,r.default)(t,i.NEW_AUTH_ERR,function(t,n){var r=n.payload,i=(0,a.fromJS)((0,o.default)({},r));return i=i.set("type","auth"),t.update("errors",function(e){return(e||(0,a.List)()).push((0,a.fromJS)(i))}).update("errors",function(t){return(0,u.default)(t,e.getSystem())})}),(0,r.default)(t,i.CLEAR,function(e,t){var n=t.payload;if(!n||!e.get("errors"))return e;var r=e.get("errors").filter(function(e){return e.keySeq().every(function(t){var r=e.get(t),o=n[t];return!o||r!==o})});return e.merge({errors:r})}),(0,r.default)(t,i.CLEAR_BY,function(e,t){var n=t.payload;if(!n||"function"!=typeof n)return e;var r=e.get("errors").filter(function(e){return n(e)});return e.merge({errors:r})}),t};var i=n(127),a=n(7),u=s(n(322));function s(e){return e&&e.__esModule?e:{default:e}}var l={line:0,level:"error",message:"Unknown error"}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n={jsSpec:t.specSelectors.specJson().toJS()};return(0,i.default)(u,function(e,t){try{var r=t.transform(e,n);return r.filter(function(e){return!!e})}catch(t){return console.error("Transformer error:",t),e}},e).filter(function(e){return!!e}).map(function(e){return!e.get("line")&&e.get("path"),e})};var r,o=n(727),i=(r=o)&&r.__esModule?r:{default:r};function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}var u=[a(n(323)),a(n(324))]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.transform=function(e){return e.map(function(e){var t=e.get("message").indexOf("is not of a type(s)");if(t>-1){var n=e.get("message").slice(t+"is not of a type(s)".length).split(",");return e.set("message",e.get("message").slice(0,t)+function(e){return e.reduce(function(e,t,n,r){return n===r.length-1&&r.length>1?e+"or "+t:r[n+1]&&r.length>2?e+t+", ":r[n+1]?e+t+" ":e+t},"should be a")}(n))}return e})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.transform=function(e,t){t.jsSpec;return e};var r,o=n(138);(r=o)&&r.__esModule,n(7)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.lastError=t.allErrors=void 0;var r=n(7),o=n(58),i=t.allErrors=(0,o.createSelector)(function(e){return e},function(e){return e.get("errors",(0,r.List)())});t.lastError=(0,o.createSelector)(i,function(e){return e.last()})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return{statePlugins:{layout:{reducers:i.default,actions:a,selectors:u}}}};var r,o=n(327),i=(r=o)&&r.__esModule?r:{default:r},a=s(n(202)),u=s(n(328));function s(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,o,i=n(22),a=(r=i)&&r.__esModule?r:{default:r},u=n(7),s=n(202);t.default=(o={},(0,a.default)(o,s.UPDATE_LAYOUT,function(e,t){return e.set("layout",t.payload)}),(0,a.default)(o,s.UPDATE_FILTER,function(e,t){return e.set("filter",t.payload)}),(0,a.default)(o,s.SHOW,function(e,t){var n=t.payload.shown,r=(0,u.fromJS)(t.payload.thing);return e.update("shown",(0,u.fromJS)({}),function(e){return e.set(r,n)})}),(0,a.default)(o,s.UPDATE_MODE,function(e,t){var n=t.payload.thing,r=t.payload.mode;return e.setIn(["modes"].concat(n),(r||"")+"")}),o)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.showSummary=t.whatMode=t.isShown=t.currentFilter=t.current=void 0;var r,o=n(83),i=(r=o)&&r.__esModule?r:{default:r},a=n(58),u=n(9),s=n(7);t.current=function(e){return e.get("layout")},t.currentFilter=function(e){return e.get("filter")};var l=t.isShown=function(e,t,n){return t=(0,u.normalizeArray)(t),e.get("shown",(0,s.fromJS)({})).get((0,s.fromJS)(t),n)};t.whatMode=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return t=(0,u.normalizeArray)(t),e.getIn(["modes"].concat((0,i.default)(t)),n)},t.showSummary=(0,a.createSelector)(function(e){return e},function(e){return!l(e,"editor")})},function(e,t,n){var r=n(36);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&r(i.call(e)),t}}},function(e,t,n){var r=n(70),o=n(19)("iterator"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||i[o]===e)}},function(e,t,n){var r=n(19)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},e(i)}catch(e){}return n}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return{statePlugins:{spec:{wrapActions:s,reducers:i.default,actions:a,selectors:u}}}};var r,o=n(333),i=(r=o)&&r.__esModule?r:{default:r},a=l(n(203)),u=l(n(144)),s=l(n(346));function l(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,o=p(n(22)),i=p(n(23)),a=p(n(83)),u=n(7),s=n(9),l=p(n(32)),c=n(144),f=n(203);function p(e){return e&&e.__esModule?e:{default:e}}t.default=(r={},(0,o.default)(r,f.UPDATE_SPEC,function(e,t){return"string"==typeof t.payload?e.set("spec",t.payload):e}),(0,o.default)(r,f.UPDATE_URL,function(e,t){return e.set("url",t.payload+"")}),(0,o.default)(r,f.UPDATE_JSON,function(e,t){return e.set("json",(0,s.fromJSOrdered)(t.payload))}),(0,o.default)(r,f.UPDATE_RESOLVED,function(e,t){return e.setIn(["resolved"],(0,s.fromJSOrdered)(t.payload))}),(0,o.default)(r,f.UPDATE_RESOLVED_SUBTREE,function(e,t){var n=t.payload,r=n.value,o=n.path;return e.setIn(["resolvedSubtrees"].concat((0,a.default)(o)),(0,s.fromJSOrdered)(r))}),(0,o.default)(r,f.UPDATE_PARAM,function(e,t){var n=t.payload,r=n.path,o=n.paramName,i=n.paramIn,u=n.param,l=n.value,c=n.isXml,f=u?(0,s.paramToIdentifier)(u):i+"."+o,p=c?"value_xml":"value";return e.setIn(["meta","paths"].concat((0,a.default)(r),["parameters",f,p]),l)}),(0,o.default)(r,f.UPDATE_EMPTY_PARAM_INCLUSION,function(e,t){var n=t.payload,r=n.pathMethod,o=n.paramName,i=n.paramIn,u=n.includeEmptyValue;if(!o||!i)return console.warn("Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey."),e;var s=i+"."+o;return e.setIn(["meta","paths"].concat((0,a.default)(r),["parameter_inclusions",s]),u)}),(0,o.default)(r,f.VALIDATE_PARAMS,function(e,t){var n=t.payload,r=n.pathMethod,o=n.isOAS3,i=(0,c.specJsonWithResolvedSubtrees)(e).getIn(["paths"].concat((0,a.default)(r))),l=(0,c.parameterValues)(e,r).toJS();return e.updateIn(["meta","paths"].concat((0,a.default)(r),["parameters"]),(0,u.fromJS)({}),function(t){return i.get("parameters",(0,u.List)()).reduce(function(t,n){var i=(0,s.paramToValue)(n,l),a=(0,c.parameterInclusionSettingFor)(e,r,n.get("name"),n.get("in")),f=(0,s.validateParam)(n,i,{bypassRequiredCheck:a,isOAS3:o});return t.setIn([(0,s.paramToIdentifier)(n),"errors"],(0,u.fromJS)(f))},t)})}),(0,o.default)(r,f.CLEAR_VALIDATE_PARAMS,function(e,t){var n=t.payload.pathMethod;return e.updateIn(["meta","paths"].concat((0,a.default)(n),["parameters"]),(0,u.fromJS)([]),function(e){return e.map(function(e){return e.set("errors",(0,u.fromJS)([]))})})}),(0,o.default)(r,f.SET_RESPONSE,function(e,t){var n=t.payload,r=n.res,o=n.path,a=n.method,u=void 0;(u=r.error?(0,i.default)({error:!0,name:r.err.name,message:r.err.message,statusCode:r.err.statusCode},r.err.response):r).headers=u.headers||{};var c=e.setIn(["responses",o,a],(0,s.fromJSOrdered)(u));return l.default.Blob&&r.data instanceof l.default.Blob&&(c=c.setIn(["responses",o,a,"text"],r.data)),c}),(0,o.default)(r,f.SET_REQUEST,function(e,t){var n=t.payload,r=n.req,o=n.path,i=n.method;return e.setIn(["requests",o,i],(0,s.fromJSOrdered)(r))}),(0,o.default)(r,f.SET_MUTATED_REQUEST,function(e,t){var n=t.payload,r=n.req,o=n.path,i=n.method;return e.setIn(["mutatedRequests",o,i],(0,s.fromJSOrdered)(r))}),(0,o.default)(r,f.UPDATE_OPERATION_META_VALUE,function(e,t){var n=t.payload,r=n.path,o=n.value,i=n.key,s=["paths"].concat((0,a.default)(r)),l=["meta","paths"].concat((0,a.default)(r));return e.getIn(["json"].concat((0,a.default)(s)))||e.getIn(["resolved"].concat((0,a.default)(s)))||e.getIn(["resolvedSubtrees"].concat((0,a.default)(s)))?e.setIn([].concat((0,a.default)(l),[i]),(0,u.fromJS)(o)):e}),(0,o.default)(r,f.CLEAR_RESPONSE,function(e,t){var n=t.payload,r=n.path,o=n.method;return e.deleteIn(["responses",r,o])}),(0,o.default)(r,f.CLEAR_REQUEST,function(e,t){var n=t.payload,r=n.path,o=n.method;return e.deleteIn(["requests",r,o])}),(0,o.default)(r,f.SET_SCHEME,function(e,t){var n=t.payload,r=n.scheme,o=n.path,i=n.method;return o&&i?e.setIn(["scheme",o,i],r):o||i?void 0:e.setIn(["scheme","_defaultScheme"],r)}),r)},function(e,t,n){var r=n(36),o=n(94),i=n(19)("species");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||void 0==(n=r(a)[i])?t:o(n)}},function(e,t,n){var r,o,i,a=n(49),u=n(735),s=n(241),l=n(157),c=n(21),f=c.process,p=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,v=c.Dispatch,m=0,g={},y=function(){var e=+this;if(g.hasOwnProperty(e)){var t=g[e];delete g[e],t()}},b=function(e){y.call(e.data)};p&&d||(p=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return g[++m]=function(){u("function"==typeof e?e:Function(e),t)},r(m),m},d=function(e){delete g[e]},"process"==n(93)(f)?r=function(e){f.nextTick(a(y,e,1))}:v&&v.now?r=function(e){v.now(a(y,e,1))}:h?(i=(o=new h).port2,o.port1.onmessage=b,r=a(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(r=function(e){c.postMessage(e+"","*")},c.addEventListener("message",b,!1)):r="onreadystatechange"in l("script")?function(e){s.appendChild(l("script")).onreadystatechange=function(){s.removeChild(this),y.call(e)}}:function(e){setTimeout(a(y,e,1),0)}),e.exports={set:p,clear:d}},function(e,t){e.exports=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}}},function(e,t,n){var r=n(36),o=n(28),i=n(206);e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=i.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){e.exports=n(740)},function(e,t,n){"use strict";t.__esModule=!0;var r,o=n(204),i=(r=o)&&r.__esModule?r:{default:r};t.default=function(e){return function(){var t=e.apply(this,arguments);return new i.default(function(e,n){return function r(o,a){try{var u=t[o](a),s=u.value}catch(e){return void n(e)}if(!u.done)return i.default.resolve(s).then(function(e){r("next",e)},function(e){r("throw",e)});e(s)}("next")})}}},function(e,t,n){"use strict";var r=n(86);e.exports=new r({include:[n(341)]})},function(e,t,n){"use strict";var r=n(86);e.exports=new r({include:[n(209)],implicit:[n(748),n(749),n(750),n(751)]})},function(e,t,n){var r=n(62),o=n(24),i=n(47),a="[object String]";e.exports=function(e){return"string"==typeof e||!o(e)&&i(e)&&r(e)==a}},function(e,t,n){var r=n(147),o=n(79),i=n(135),a=n(38),u=n(80);e.exports=function(e,t,n,s){if(!a(e))return e;for(var l=-1,c=(t=o(t,e)).length,f=c-1,p=e;null!=p&&++l.":"function"==typeof t?" Instead of passing a class like Foo, pass React.createElement(Foo) or .":null!=t&&void 0!==t.props?" This may be caused by unintentionally loading two independent copies of React.":"");var i,u=a.createElement(D,{child:t});if(e){var s=p.get(e);i=s._processChildContext(s._context)}else i=g;var l=N(n);if(l){var c=l._currentElement.props.child;if(_(c,t)){var f=l._renderedComponent.getPublicInstance(),d=o&&function(){o.call(f)};return L._updateRootComponent(l,u,i,n,d),f}L.unmountComponentAtNode(n)}var h=A(n),m=h&&!!O(h),y=I(n),b=m&&!l&&!y,w=L._renderNewRootComponent(u,n,b,i)._renderedComponent.getPublicInstance();return o&&o.call(w),w},render:function(e,t,n){return L._renderSubtreeIntoContainer(null,e,t,n)},unmountComponentAtNode:function(e){j(e)||r("40");var t=N(e);if(!t){I(e),1===e.nodeType&&e.hasAttribute(E);return!1}return delete k[t._instance.rootID],m.batchedUpdates(M,t,e,!1),!0},_mountImageIntoNode:function(e,t,n,i,a){if(j(t)||r("41"),i){var u=A(t);if(d.canReuseMarkup(e,u))return void s.precacheNode(n,u);var l=u.getAttribute(d.CHECKSUM_ATTR_NAME);u.removeAttribute(d.CHECKSUM_ATTR_NAME);var c=u.outerHTML;u.setAttribute(d.CHECKSUM_ATTR_NAME,l);var f=e,p=function(e,t){for(var n=Math.min(e.length,t.length),r=0;r1?r-1:0),a=1;a=o&&(t=console)[e].apply(t,i)}return i.warn=i.bind(null,"warn"),i.error=i.bind(null,"error"),i.info=i.bind(null,"info"),i.debug=i.bind(null,"debug"),{rootInjects:{log:i}}}},function(e,t,n){"use strict";var r,o=n(387),i=(r=o)&&r.__esModule?r:{default:r},a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(393));e.exports=function(e){var t=e.configs,n=e.getConfigs;return{fn:{fetch:i.default.makeHttp(t.preFetch,t.postFetch),buildRequest:i.default.buildRequest,execute:i.default.execute,resolve:i.default.resolve,resolveSubtree:function(e,t,r){for(var o=arguments.length,a=Array(o>3?o-3:0),u=3;u2&&void 0!==arguments[2]?arguments[2]:"",r=(arguments.length>3&&void 0!==arguments[3]?arguments[3]:{}).v2OperationIdCompatibilityMode;return e&&"object"===(void 0===e?"undefined":(0,c.default)(e))?(e.operationId||"").replace(/\s/g,"").length?h(e.operationId):i(t,n,{v2OperationIdCompatibilityMode:r}):null}function i(e,t){if((arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).v2OperationIdCompatibilityMode){var n=(t.toLowerCase()+"_"+e).replace(/[\s!@#$%^&*()_+=[{\]};:<>|.\/?,\\'""-]/g,"_");return(n=n||e.substring(1)+"_"+t).replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return""+d(t)+h(e)}function a(e,t){return d(t)+"-"+e}function u(e,t){return s(e,t,!0)||null}function s(e,t,n){if(!e||"object"!==(void 0===e?"undefined":(0,c.default)(e))||!e.paths||"object"!==(0,c.default)(e.paths))return null;var r=e.paths;for(var o in r)for(var i in r[o])if("PARAMETERS"!==i.toUpperCase()){var a=r[o][i];if(a&&"object"===(void 0===a?"undefined":(0,c.default)(a))){var u={spec:e,pathName:o,method:i.toUpperCase(),operation:a},s=t(u);if(n&&s)return u}}}Object.defineProperty(t,"__esModule",{value:!0});var l=r(n(18)),c=r(n(1));t.isOAS3=function(e){var t=e.openapi;return!!t&&(0,p.default)(t,"3")},t.isSwagger2=function(e){var t=e.swagger;return!!t&&(0,p.default)(t,"2")},t.opId=o,t.idFromPathMethod=i,t.legacyIdFromPathMethod=a,t.getOperationRaw=function(e,t){return e&&e.paths?u(e,function(e){var n=e.pathName,r=e.method,i=e.operation;if(!i||"object"!==(void 0===i?"undefined":(0,c.default)(i)))return!1;var u=i.operationId;return[o(i,n,r),a(n,r),u].some(function(e){return e&&e===t})}):null},t.findOperation=u,t.eachOperation=s,t.normalizeSwagger=function(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var i in n){var a=n[i];if((0,f.default)(a)){var u=a.parameters;for(var s in a)!function(e){var n=a[e];if(!(0,f.default)(n))return"continue";var s=o(n,i,e);if(s){r[s]?r[s].push(n):r[s]=[n];var c=r[s];if(c.length>1)c.forEach(function(e,t){e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId=""+s+(t+1)});else if(void 0!==n.operationId){var p=c[0];p.__originalOperationId=p.__originalOperationId||n.operationId,p.operationId=s}}if("parameters"!==e){var d=[],h={};for(var v in t)"produces"!==v&&"consumes"!==v&&"security"!==v||(h[v]=t[v],d.push(h));if(u&&(h.parameters=u,d.push(h)),d.length){var m=!0,g=!1,y=void 0;try{for(var b,_=(0,l.default)(d);!(m=(b=_.next()).done);m=!0){var w=b.value;for(var E in w)if(n[E]){if("parameters"===E){var x=!0,S=!1,C=void 0;try{for(var k,A=(0,l.default)(w[E]);!(x=(k=A.next()).done);x=!0)!function(){var e=k.value;n[E].some(function(t){return t.name&&t.name===e.name||t.$ref&&t.$ref===e.$ref||t.$$ref&&t.$$ref===e.$$ref||t===e})||n[E].push(e)}()}catch(e){S=!0,C=e}finally{try{!x&&A.return&&A.return()}finally{if(S)throw C}}}}else n[E]=w[E]}}catch(e){g=!0,y=e}finally{try{!m&&_.return&&_.return()}finally{if(g)throw y}}}}}(s)}}return t.$$normalized=!0,e};var f=r(n(47)),p=r(n(14)),d=function(e){return String.prototype.toLowerCase.call(e)},h=function(e){return e.replace(/[^\w]/gi,"_")}},function(e,t){e.exports=n(893)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).loadSpec,r=void 0!==n&&n,o={ok:e.ok,url:e.url||t,status:e.status,statusText:e.statusText,headers:i(e.headers)},a=o.headers["content-type"],u=r||_(a);return(u?e.text:e.blob||e.buffer).call(e).then(function(e){if(o.text=e,o.data=e,u)try{var t=function(e,t){return t&&(0===t.indexOf("application/json")||t.indexOf("+json")>0)?JSON.parse(e):g.default.safeLoad(e)}(e,a);o.body=t,o.obj=t}catch(e){o.parseError=e}return o})}function i(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={};return"function"==typeof e.forEach?(e.forEach(function(e,n){void 0!==t[n]?(t[n]=Array.isArray(t[n])?t[n]:[t[n]],t[n].push(e)):t[n]=e}),t):t}function a(e,t){return t||"undefined"==typeof navigator||(t=navigator),t&&"ReactNative"===t.product?!(!e||"object"!==(void 0===e?"undefined":(0,h.default)(e))||"string"!=typeof e.uri):"undefined"!=typeof File?e instanceof File:null!==e&&"object"===(void 0===e?"undefined":(0,h.default)(e))&&"function"==typeof e.pipe}function u(e,t){var n=e.collectionFormat,r=e.allowEmptyValue,o="object"===(void 0===e?"undefined":(0,h.default)(e))?e.value:e;if(void 0===o&&r)return"";if(a(o)||"boolean"==typeof o)return o;var i=encodeURIComponent;return t&&(i=(0,y.default)(o)?function(e){return e}:function(e){return(0,p.default)(e)}),"object"!==(void 0===o?"undefined":(0,h.default)(o))||Array.isArray(o)?Array.isArray(o)?Array.isArray(o)&&!n?o.map(i).join(","):"multi"===n?o.map(i):o.map(i).join({csv:",",ssv:"%20",tsv:"%09",pipes:"|"}[n]):i(o):""}function s(e){var t=(0,f.default)(e).reduce(function(t,n){var r=e[n],o=!!r.skipEncoding,i=o?n:encodeURIComponent(n),a=function(e){return e&&"object"===(void 0===e?"undefined":(0,h.default)(e))}(r)&&!Array.isArray(r);return t[i]=u(a?r:{value:r},o),t},{});return m.default.stringify(t,{encode:!1,indices:!1})||""}function l(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,r=void 0===t?"":t,o=e.query,i=e.form;if(i){var l=(0,f.default)(i).some(function(e){return a(i[e].value)}),p=e.headers["content-type"]||e.headers["Content-Type"];if(l||/multipart\/form-data/i.test(p)){var d=n(30);e.body=new d,(0,f.default)(i).forEach(function(t){e.body.append(t,u(i[t],!0))})}else e.body=s(i);delete e.form}if(o){var h=r.split("?"),v=(0,c.default)(h,2),g=v[0],y=v[1],b="";if(y){var _=m.default.parse(y);(0,f.default)(o).forEach(function(e){return delete _[e]}),b=m.default.stringify(_,{encode:!0})}var w=function(){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return d.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if("object"===(void 0===t?"undefined":(0,h.default)(t))&&(t=(a=t).url),a.headers=a.headers||{},b.mergeInQueryOrForm(a),!a.requestInterceptor){e.next=10;break}return e.next=6,a.requestInterceptor(a);case 6:if(e.t0=e.sent,e.t0){e.next=9;break}e.t0=a;case 9:a=e.t0;case 10:return n=a.headers["content-type"]||a.headers["Content-Type"],/multipart\/form-data/i.test(n)&&(delete a.headers["content-type"],delete a.headers["Content-Type"]),r=void 0,e.prev=13,e.next=16,(a.userFetch||fetch)(a.url,a);case 16:return r=e.sent,e.next=19,b.serializeRes(r,t,a);case 19:if(r=e.sent,!a.responseInterceptor){e.next=27;break}return e.next=23,a.responseInterceptor(r);case 23:if(e.t1=e.sent,e.t1){e.next=26;break}e.t1=r;case 26:r=e.t1;case 27:e.next=37;break;case 29:if(e.prev=29,e.t2=e.catch(13),r){e.next=33;break}throw e.t2;case 33:throw(o=new Error(r.statusText)).statusCode=o.status=r.status,o.responseError=e.t2,o;case 37:if(r.ok){e.next=42;break}throw(i=new Error(r.statusText)).statusCode=i.status=r.status,i.response=r,i;case 42:return e.abrupt("return",r);case 43:case"end":return e.stop()}},e,this,[[13,29]])}));return function(t){return e.apply(this,arguments)}}();var _=t.shouldDownloadAsText=function(){return/(json|xml|yaml|text)\b/.test(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"")}},function(e,t){e.exports=n(41)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return Array.isArray(e)?e.length<1?"":"/"+e.map(function(e){return(e+"").replace(/~/g,"~0").replace(/\//g,"~1")}).join("/"):e}function i(e,t,n){return{op:"replace",path:e,value:t,meta:n}}function a(e,t,n){return f(c(e.filter(m).map(function(e){return t(e.value,n,e.path)})||[]))}function u(e,t,n){return n=n||[],Array.isArray(e)?e.map(function(e,r){return u(e,t,n.concat(r))}):p(e)?(0,w.default)(e).map(function(r){return u(e[r],t,n.concat(r))}):t(e,n[n.length-1],n)}function s(e,t,n){var r=[];if((n=n||[]).length>0){var o=t(e,n[n.length-1],n);o&&(r=r.concat(o))}if(Array.isArray(e)){var i=e.map(function(e,r){return s(e,t,n.concat(r))});i&&(r=r.concat(i))}else if(p(e)){var a=(0,w.default)(e).map(function(r){return s(e[r],t,n.concat(r))});a&&(r=r.concat(a))}return c(r)}function l(e){return Array.isArray(e)?e:[e]}function c(e){var t;return(t=[]).concat.apply(t,(0,_.default)(e.map(function(e){return Array.isArray(e)?c(e):e})))}function f(e){return e.filter(function(e){return void 0!==e})}function p(e){return e&&"object"===(void 0===e?"undefined":(0,b.default)(e))}function d(e){return e&&"function"==typeof e}function h(e){if(g(e)){var t=e.op;return"add"===t||"remove"===t||"replace"===t}return!1}function v(e){return h(e)||g(e)&&"mutation"===e.type}function m(e){return v(e)&&("add"===e.op||"replace"===e.op||"merge"===e.op||"mergeDeep"===e.op)}function g(e){return e&&"object"===(void 0===e?"undefined":(0,b.default)(e))}function y(e,t){try{return S.default.getValueByPointer(e,t)}catch(e){return console.error(e),{}}}Object.defineProperty(t,"__esModule",{value:!0});var b=r(n(1)),_=r(n(34)),w=r(n(0)),E=r(n(35)),x=r(n(2)),S=r(n(36)),C=r(n(4)),k=r(n(37)),A=r(n(38));t.default={add:function(e,t){return{op:"add",path:e,value:t}},replace:i,remove:function(e,t){return{op:"remove",path:e}},merge:function(e,t){return{type:"mutation",op:"merge",path:e,value:t}},mergeDeep:function(e,t){return{type:"mutation",op:"mergeDeep",path:e,value:t}},context:function(e,t){return{type:"context",path:e,value:t}},getIn:function(e,t){return t.reduce(function(e,t){return void 0!==t&&e?e[t]:e},e)},applyPatch:function(e,t,n){if(n=n||{},"merge"===(t=(0,x.default)({},t,{path:t.path&&o(t.path)})).op){var r=y(e,t.path);(0,x.default)(r,t.value),S.default.applyPatch(e,[i(t.path,r)])}else if("mergeDeep"===t.op){var a=y(e,t.path);for(var u in t.value){var s=t.value[u],l=Array.isArray(s);if(l){var c=a[u]||[];a[u]=c.concat(s)}else if(p(s)&&!l){var f=(0,x.default)({},a[u]);for(var d in s){if(Object.prototype.hasOwnProperty.call(f,d)){f=(0,k.default)((0,A.default)({},f),s);break}(0,x.default)(f,(0,E.default)({},d,s[d]))}a[u]=f}else a[u]=s}}else if("add"===t.op&&""===t.path&&p(t.value)){var h=(0,w.default)(t.value).reduce(function(e,n){return e.push({op:"add",path:"/"+o(n),value:t.value[n]}),e},[]);S.default.applyPatch(e,h)}else if("replace"===t.op&&""===t.path){var v=t.value;n.allowMetaPatches&&t.meta&&m(t)&&(Array.isArray(t.value)||p(t.value))&&(v=(0,x.default)({},v,t.meta)),e=v}else if(S.default.applyPatch(e,[t]),n.allowMetaPatches&&t.meta&&m(t)&&(Array.isArray(t.value)||p(t.value))){var g=y(e,t.path),b=(0,x.default)({},g,t.meta);S.default.applyPatch(e,[i(t.path,b)])}return e},parentPathMatch:function(e,t){if(!Array.isArray(t))return!1;for(var n=0,r=t.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.requestInterceptor,r=t.responseInterceptor,o=e.withCredentials?"include":"same-origin";return function(t){return e({url:t,loadSpec:!0,requestInterceptor:n,responseInterceptor:r,headers:{Accept:"application/json"},credentials:o}).then(function(e){return e.body})}}Object.defineProperty(t,"__esModule",{value:!0});var i=r(n(4)),a=r(n(11));t.makeFetchJSON=o,t.clearCache=function(){s.plugins.refs.clearCache()},t.default=function(e){function t(e){var t=this;E&&(s.plugins.refs.docCache[E]=e),s.plugins.refs.fetchJSON=o(w,{requestInterceptor:y,responseInterceptor:b});var n=[s.plugins.refs];return"function"==typeof g&&n.push(s.plugins.parameters),"function"==typeof m&&n.push(s.plugins.properties),"strict"!==p&&n.push(s.plugins.allOf),(0,l.default)({spec:e,context:{baseDoc:E},plugins:n,allowMetaPatches:h,pathDiscriminator:v,parameterMacro:g,modelPropertyMacro:m}).then(_?function(){var e=(0,a.default)(i.default.mark(function e(n){return i.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",n);case 1:case"end":return e.stop()}},e,t)}));return function(t){return e.apply(this,arguments)}}():c.normalizeSwagger)}var n=e.fetch,r=e.spec,f=e.url,p=e.mode,d=e.allowMetaPatches,h=void 0===d||d,v=e.pathDiscriminator,m=e.modelPropertyMacro,g=e.parameterMacro,y=e.requestInterceptor,b=e.responseInterceptor,_=e.skipNormalization,w=e.http,E=e.baseDoc;return E=E||f,w=n||w||u.default,r?t(r):o(w,{requestInterceptor:y,responseInterceptor:b})(E).then(t)};var u=r(n(7)),s=n(31),l=r(s),c=n(5)},function(e,t){e.exports=n(204)},function(e,t){e.exports=n(91)},function(e,t){e.exports=n(2)},function(e,t){e.exports=n(3)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){function n(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var e=arguments.length,n=Array(e),r=0;r-1&&-1===o.indexOf(n)||i.indexOf(u)>-1||a.some(function(e){return u.indexOf(e)>-1})};var r=["properties"],o=["properties"],i=["definitions","parameters","responses","securityDefinitions","components/schemas","components/responses","components/parameters","components/securitySchemes"],a=["schema/example","items/example"]},function(e,t,n){e.exports=n(24)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("string"==typeof e?n.url=e:n=e,!(this instanceof o))return new o(n);(0,a.default)(this,n);var r=this.resolve().then(function(){return t.disableInterfaces||(0,a.default)(t,o.makeApisTagOperation(t)),t});return r.client=this,r}Object.defineProperty(t,"__esModule",{value:!0});var i=r(n(3)),a=r((r(n(25)),n(6))),u=r(n(14)),s=r(n(10)),l=n(7),c=r(l),f=n(16),p=r(f),d=r(n(48)),h=n(49),v=n(51),m=n(5);o.http=c.default,o.makeHttp=l.makeHttp.bind(null,o.http),o.resolve=p.default,o.resolveSubtree=d.default,o.execute=v.execute,o.serializeRes=l.serializeRes,o.serializeHeaders=l.serializeHeaders,o.clearCache=f.clearCache,o.parameterBuilders=v.PARAMETER_BUILDERS,o.makeApisTagOperation=h.makeApisTagOperation,o.buildRequest=v.buildRequest,o.helpers={opId:m.opId},o.prototype={http:c.default,execute:function(e){return this.applyDefaults(),o.execute((0,i.default)({spec:this.spec,http:this.http,securities:{authorized:this.authorizations},contextUrl:"string"==typeof this.url?this.url:void 0},e))},resolve:function(){var e=this;return o.resolve({spec:this.spec,url:this.url,allowMetaPatches:this.allowMetaPatches,requestInterceptor:this.requestInterceptor||null,responseInterceptor:this.responseInterceptor||null}).then(function(t){return e.originalSpec=e.spec,e.spec=t.spec,e.errors=t.errors,e})}},o.prototype.applyDefaults=function(){var e=this.spec,t=this.url;if(t&&(0,u.default)(t,"http")){var n=s.default.parse(t);e.host||(e.host=n.host),e.schemes||(e.schemes=[n.protocol.replace(":","")]),e.basePath||(e.basePath="/")}},t.default=o,e.exports=t.default},function(e,t){e.exports=n(905)},function(e,t){e.exports=n(17)},function(e,t){e.exports=n(906)},function(e,t){e.exports=n(907)},function(e,t){e.exports=n(342)},function(e,t){e.exports=n(910)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.plugins=t.SpecMap=void 0;var o=r(n(8)),i=r(n(1)),a=r(n(17)),u=r(n(4)),s=r(n(0)),l=r(n(18)),c=r(n(32)),f=r(n(2)),p=r(n(19)),d=r(n(20));t.default=function(e){return new w(e).dispatch()};var h=r(n(33)),v=r(n(9)),m=r(n(39)),g=r(n(43)),y=r(n(44)),b=r(n(45)),_=r(n(46)),w=function(){function e(t){(0,p.default)(this,e),(0,f.default)(this,{spec:"",debugLevel:"info",plugins:[],pluginHistory:{},errors:[],mutations:[],promisedPatches:[],state:{},patches:[],context:{},contextTree:new _.default,showDebug:!1,allPatches:[],pluginProp:"specMap",libMethods:(0,f.default)((0,c.default)(this),v.default),allowMetaPatches:!1},t),this.get=this._get.bind(this),this.getContext=this._getContext.bind(this),this.hasRun=this._hasRun.bind(this),this.wrappedPlugins=this.plugins.map(this.wrapPlugin.bind(this)).filter(v.default.isFunction),this.patches.push(v.default.add([],this.spec)),this.patches.push(v.default.context([],this.context)),this.updatePatches(this.patches)}return(0,d.default)(e,[{key:"debug",value:function(e){if(this.debugLevel===e){for(var t,n=arguments.length,r=Array(n>1?n-1:0),o=1;o1?n-1:0),o=1;o0})}},{key:"nextPromisedPatch",value:function(){if(this.promisedPatches.length>0)return a.default.race(this.promisedPatches.map(function(e){return e.value}))}},{key:"getPluginHistory",value:function(e){var t=this.getPluginName(e);return this.pluginHistory[t]||[]}},{key:"getPluginRunCount",value:function(e){return this.getPluginHistory(e).length}},{key:"getPluginHistoryTip",value:function(e){var t=this.getPluginHistory(e);return t&&t[t.length-1]||{}}},{key:"getPluginMutationIndex",value:function(e){var t=this.getPluginHistoryTip(e).mutationIndex;return"number"!=typeof t?-1:t}},{key:"getPluginName",value:function(e){return e.pluginName}},{key:"updatePluginHistory",value:function(e,t){var n=this.getPluginName(e);(this.pluginHistory[n]=this.pluginHistory[n]||[]).push(t)}},{key:"updatePatches",value:function(e,t){var n=this;v.default.normalizeArray(e).forEach(function(e){if(e instanceof Error)n.errors.push(e);else try{if(!v.default.isObject(e))return void n.debug("updatePatches","Got a non-object patch",e);if(n.showDebug&&n.allPatches.push(e),v.default.isPromise(e.value))return n.promisedPatches.push(e),void n.promisedPatchThen(e);if(v.default.isContextPatch(e))return void n.setContext(e.path,e.value);if(v.default.isMutation(e))return void n.updateMutations(e)}catch(e){console.error(e),n.errors.push(e)}})}},{key:"updateMutations",value:function(e){"object"===(0,i.default)(e.value)&&!Array.isArray(e.value)&&this.allowMetaPatches&&(e.value=(0,f.default)({},e.value));var t=v.default.applyPatch(this.state,e,{allowMetaPatches:this.allowMetaPatches});t&&(this.mutations.push(e),this.state=t)}},{key:"removePromisedPatch",value:function(e){var t=this.promisedPatches.indexOf(e);t<0?this.debug("Tried to remove a promisedPatch that isn't there!"):this.promisedPatches.splice(t,1)}},{key:"promisedPatchThen",value:function(e){var t=this;return e.value=e.value.then(function(n){var r=(0,f.default)({},e,{value:n});t.removePromisedPatch(e),t.updatePatches(r)}).catch(function(n){t.removePromisedPatch(e),t.updatePatches(n)})}},{key:"getMutations",value:function(e,t){return e=e||0,"number"!=typeof t&&(t=this.mutations.length),this.mutations.slice(e,t)}},{key:"getCurrentMutations",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:"getMutationsForPlugin",value:function(e){var t=this.getPluginMutationIndex(e);return this.getMutations(t+1)}},{key:"getCurrentPlugin",value:function(){return this.currentPlugin}},{key:"getPatchesOfType",value:function(e,t){return e.filter(t)}},{key:"getLib",value:function(){return this.libMethods}},{key:"_get",value:function(e){return v.default.getIn(this.state,e)}},{key:"_getContext",value:function(e){return this.contextTree.get(e)}},{key:"setContext",value:function(e,t){return this.contextTree.set(e,t)}},{key:"_hasRun",value:function(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}},{key:"_clone",value:function(e){return JSON.parse((0,o.default)(e))}},{key:"dispatch",value:function(){function e(e){e&&(e=v.default.fullyNormalizeArray(e),n.updatePatches(e,r))}var t=this,n=this,r=this.nextPlugin();if(!r){var o=this.nextPromisedPatch();if(o)return o.then(function(){return t.dispatch()}).catch(function(){return t.dispatch()});var i={spec:this.state,errors:this.errors};return this.showDebug&&(i.patches=this.allPatches),a.default.resolve(i)}if(n.pluginCount=n.pluginCount||{},n.pluginCount[r]=(n.pluginCount[r]||0)+1,n.pluginCount[r]>100)return a.default.resolve({spec:n.state,errors:n.errors.concat(new Error("We've reached a hard limit of 100 plugin runs"))});if(r!==this.currentPlugin&&this.promisedPatches.length){var u=this.promisedPatches.map(function(e){return e.value});return a.default.all(u.map(function(e){return e.then(Function,Function)})).then(function(){return t.dispatch()})}return function(){n.currentPlugin=r;var t=n.getCurrentMutations(),o=n.mutations.length-1;try{if(r.isGenerator){var i=!0,a=!1,u=void 0;try{for(var s,p=(0,l.default)(r(t,n.getLib()));!(i=(s=p.next()).done);i=!0)e(s.value)}catch(e){a=!0,u=e}finally{try{!i&&p.return&&p.return()}finally{if(a)throw u}}}else e(r(t,n.getLib()))}catch(t){console.error(t),e([(0,f.default)((0,c.default)(t),{plugin:r})])}finally{n.updatePluginHistory(r,{mutationIndex:o})}return n.dispatch()}()}}]),e}(),E={refs:m.default,allOf:g.default,parameters:y.default,properties:b.default};t.SpecMap=w,t.plugins=E},function(e,t){e.exports=n(349)},function(e,t){e.exports=n(288)},function(e,t){e.exports=n(83)},function(e,t){e.exports=n(22)},function(e,t){e.exports=n(911)},function(e,t){e.exports=n(179)},function(e,t){e.exports=n(181)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!A.test(e)){if(!t)throw new O("Tried to resolve a relative URL, without having a basePath. path: '"+e+"' basePath: '"+t+"'");return x.default.resolve(t,e)}return e}function i(e,t){var n;return n=e&&e.response&&e.response.body?e.response.body.code+" "+e.response.body.message:e.message,new O("Could not resolve reference: "+n,t,e)}function a(e){return(e+"").split("#")}function u(e,t){var n=P[e];if(n&&!S.default.isPromise(n))try{var r=l(t,n);return(0,b.default)(g.default.resolve(r),{__value:r})}catch(e){return g.default.reject(e)}return s(e).then(function(e){return l(t,e)})}function s(e){var t=P[e];return t?S.default.isPromise(t)?t:g.default.resolve(t):(P[e]=I.fetchJSON(e).then(function(t){return P[e]=t,t}),P[e])}function l(e,t){var n=c(e);if(n.length<1)return t;var r=S.default.getIn(t,n);if(void 0===r)throw new O("Could not resolve pointer: "+e+" does not exist in document",{pointer:e});return r}function c(e){if("string"!=typeof e)throw new TypeError("Expected a string, got a "+(void 0===e?"undefined":(0,v.default)(e)));return"/"===e[0]&&(e=e.substr(1)),""===e?[]:e.split("/").map(f)}function f(e){return"string"!=typeof e?e:E.default.unescape(e.replace(/~1/g,"/").replace(/~0/g,"~"))}function p(e){return E.default.escape(e.replace(/~/g,"~0").replace(/\//g,"~1"))}function d(e,t){if(j(t))return!0;var n=e.charAt(t.length),r=t.slice(-1);return 0===e.indexOf(t)&&(!n||"/"===n||"#"===n)&&"#"!==r}function h(e,t,n,r){var o=T.get(r);o||(o={},T.set(r,o));var i=function(e){return 0===e.length?"":"/"+e.map(p).join("/")}(n),a=(t||"")+"#"+e;if(t==r.contextTree.get([]).baseDoc&&d(i,e))return!0;var u="";if(n.some(function(e){return u=u+"/"+p(e),o[u]&&o[u].some(function(e){return d(e,a)||d(a,e)})}))return!0;o[i]=(o[i]||[]).concat(a)}Object.defineProperty(t,"__esModule",{value:!0});var v=r(n(1)),m=r(n(0)),g=r(n(17)),y=r(n(40)),b=r(n(2)),_=n(41),w=r(n(15)),E=r(n(42)),x=r(n(10)),S=r(n(9)),C=r(n(21)),k=n(22),A=new RegExp("^([a-z]+://|//)","i"),O=(0,C.default)("JSONRefError",function(e,t,n){this.originalError=n,(0,b.default)(this,t||{})}),P={},T=new y.default,M={key:"$ref",plugin:function(e,t,n,r){var s=n.slice(0,-1);if(!(0,k.isFreelyNamed)(s)){var l=r.getContext(n).baseDoc;if("string"!=typeof e)return new O("$ref: must be a string (JSON-Ref)",{$ref:e,baseDoc:l,fullPath:n});var f=a(e),p=f[0],d=f[1]||"",v=void 0;try{v=l||p?o(p,l):null}catch(t){return i(t,{pointer:d,$ref:e,basePath:v,fullPath:n})}var g=void 0,y=void 0;if(!h(d,v,s,r)){if(null==v?(y=c(d),void 0===(g=r.get(y))&&(g=new O("Could not resolve reference: "+e,{pointer:d,$ref:e,baseDoc:l,fullPath:n}))):g=null!=(g=u(v,d)).__value?g.__value:g.catch(function(t){throw i(t,{pointer:d,$ref:e,baseDoc:l,fullPath:n})}),g instanceof Error)return[S.default.remove(n),g];var b=S.default.replace(s,g,{$$ref:e});if(v&&v!==l)return[b,S.default.context(s,{baseDoc:v})];try{if(!function(e,t){var n=[e];return t.path.reduce(function(e,t){return n.push(e[t]),e[t]},e),function e(t){return S.default.isObject(t)&&(n.indexOf(t)>=0||(0,m.default)(t).some(function(n){return e(t[n])}))}(t.value)}(r.state,b))return b}catch(e){return null}}}}},I=(0,b.default)(M,{docCache:P,absoluteify:o,clearCache:function(e){void 0!==e?delete P[e]:(0,m.default)(P).forEach(function(e){delete P[e]})},JSONRefError:O,wrapError:i,getDoc:s,split:a,extractFromDoc:u,fetchJSON:function(e){return(0,_.fetch)(e,{headers:{Accept:"application/json, application/yaml"},loadSpec:!0}).then(function(e){return e.text()}).then(function(e){return w.default.safeLoad(e)})},extract:l,jsonPointerToArray:c,unescapeJsonPointerToken:f});t.default=I;var j=function(e){return!e||"/"===e||"#"===e};e.exports=t.default},function(e,t){e.exports=n(914)},function(e,t){e.exports=n(925)},function(e,t){e.exports=n(926)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(2)),o=n(22);t.default={key:"allOf",plugin:function(e,t,n,i,a){if(!a.meta||!a.meta.$$ref){var u=n.slice(0,-1);if(!(0,o.isFreelyNamed)(u)){if(!Array.isArray(e)){var s=new TypeError("allOf must be an array");return s.fullPath=n,s}var l=!1,c=a.value;u.forEach(function(e){c&&(c=c[e])}),delete(c=(0,r.default)({},c)).allOf;var f=[i.replace(u,{})].concat(e.map(function(e,t){if(!i.isObject(e)){if(l)return null;l=!0;var r=new TypeError("Elements in allOf must be objects");return r.fullPath=n,r}return i.mergeDeep(u,e)}));return f.push(i.mergeDeep(u,c)),c.$$ref||f.push(i.remove([].concat(u,"$$ref"))),f}}}},e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(2)),i=r(n(9));t.default={key:"parameters",plugin:function(e,t,n,r,a){if(Array.isArray(e)&&e.length){var u=(0,o.default)([],e),s=n.slice(0,-1),l=(0,o.default)({},i.default.getIn(r.spec,s));return e.forEach(function(e,t){try{u[t].default=r.parameterMacro(l,e)}catch(e){var o=new Error(e);return o.fullPath=n,o}}),i.default.replace(n,u)}return i.default.replace(n,e)}},e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(2)),i=r(n(9));t.default={key:"properties",plugin:function(e,t,n,r){var a=(0,o.default)({},e);for(var u in e)try{a[u].default=r.modelPropertyMacro(a[u])}catch(e){var s=new Error(e);return s.fullPath=n,s}return i.default.replace(n,a)}},e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){return i({children:{}},e,t)}function i(e,t,n){return e.value=t||{},e.protoValue=n?(0,u.default)({},n.protoValue,e.value):e.value,(0,a.default)(e.children).forEach(function(t){var n=e.children[t];e.children[t]=i(n,n.value,e)}),e}Object.defineProperty(t,"__esModule",{value:!0});var a=r(n(0)),u=r(n(3)),s=r(n(19)),l=r(n(20)),c=function(){function e(t){(0,s.default)(this,e),this.root=o(t||{})}return(0,l.default)(e,[{key:"set",value:function(e,t){var n=this.getParent(e,!0);if(n){var r=e[e.length-1],a=n.children;a[r]?i(a[r],t,n):a[r]=o(t,n)}else i(this.root,t,null)}},{key:"get",value:function(e){if((e=e||[]).length<1)return this.root.value;for(var t=this.root,n=void 0,r=void 0,o=0;o2&&void 0!==arguments[2]?arguments[2]:{};return o.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r=y.returnEntireTree,a=y.baseDoc,c=y.requestInterceptor,f=y.responseInterceptor,p=y.parameterMacro,d=y.modelPropertyMacro,h={pathDiscriminator:n,baseDoc:a,requestInterceptor:c,responseInterceptor:f,parameterMacro:p,modelPropertyMacro:d},v=(0,l.normalizeSwagger)({spec:t}),m=v.spec,e.next=5,(0,s.default)((0,i.default)({},h,{spec:m,allowMetaPatches:!0,skipNormalization:!0}));case 5:return g=e.sent,!r&&Array.isArray(n)&&n.length&&(g.spec=(0,u.default)(g.spec,n)||null),e.abrupt("return",g);case 8:case"end":return e.stop()}},e,this)}));return function(t,n){return e.apply(this,arguments)}}(),e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return function(t){var n=t.pathName,r=t.method,o=t.operationId;return function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.execute((0,a.default)({spec:e.spec},(0,u.default)(e,"requestInterceptor","responseInterceptor","userFetch"),{pathName:n,method:r,parameters:t,operationId:o},i))}}}function i(e){var t=e.spec,n=e.cb,r=void 0===n?l:n,o=e.defaultTag,i=void 0===o?"default":o,a=e.v2OperationIdCompatibilityMode,u={},f={};return(0,s.eachOperation)(t,function(e){var n=e.pathName,o=e.method,l=e.operation;(l.tags?c(l.tags):[i]).forEach(function(e){if("string"==typeof e){var i=f[e]=f[e]||{},c=(0,s.opId)(l,n,o,{v2OperationIdCompatibilityMode:a}),p=r({spec:t,pathName:n,method:o,operation:l,operationId:c});if(u[c])u[c]++,i[""+c+u[c]]=p;else if(void 0!==i[c]){var d=u[c]||1;u[c]=d+1,i[""+c+u[c]]=p;var h=i[c];delete i[c],i[""+c+d]=h}else i[c]=p}})}),f}Object.defineProperty(t,"__esModule",{value:!0}),t.self=void 0;var a=r(n(3));t.makeExecute=o,t.makeApisTagOperationsOperationExecute=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=f.makeExecute(e),n=f.mapTagOperations({v2OperationIdCompatibilityMode:e.v2OperationIdCompatibilityMode,spec:e.spec,cb:t}),r={};for(var o in n)for(var i in r[o]={operations:{}},n[o])r[o].operations[i]={execute:n[o][i]};return{apis:r}},t.makeApisTagOperation=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=f.makeExecute(e);return{apis:f.mapTagOperations({v2OperationIdCompatibilityMode:e.v2OperationIdCompatibilityMode,spec:e.spec,cb:t})}},t.mapTagOperations=i;var u=r(n(50)),s=n(5),l=function(){return null},c=function(e){return Array.isArray(e)?e:[e]},f=t.self={mapTagOperations:i,makeExecute:o}},function(e,t){e.exports=n(927)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.spec,n=e.operationId,r=(e.securities,e.requestContentType,e.responseContentType),o=e.scheme,a=e.requestInterceptor,s=e.responseInterceptor,c=e.contextUrl,f=e.userFetch,p=(e.requestBody,e.server),d=e.serverVariables,h=e.http,g=e.parameters,y=e.parameterBuilders,O=(0,x.isOAS3)(t);y||(y=O?_.default:b.default);var P={url:"",credentials:h&&h.withCredentials?"include":"same-origin",headers:{},cookies:{}};a&&(P.requestInterceptor=a),s&&(P.responseInterceptor=s),f&&(P.userFetch=f);var T=(0,x.getOperationRaw)(t,n);if(!T)throw new C("Operation "+n+" not found");var M=T.operation,I=void 0===M?{}:M,j=T.method,N=T.pathName;if(P.url+=i({spec:t,scheme:o,contextUrl:c,server:p,serverVariables:d,pathName:N,method:j}),!n)return delete P.cookies,P;P.url+=N,P.method=(""+j).toUpperCase(),g=g||{};var R=t.paths[N]||{};r&&(P.headers.accept=r);var D=A([].concat(S(I.parameters)).concat(S(R.parameters)));D.forEach(function(e){var n=y[e.in],r=void 0;if("body"===e.in&&e.schema&&e.schema.properties&&(r=g),void 0===(r=e&&e.name&&g[e.name])?r=e&&e.name&&g[e.in+"."+e.name]:k(e.name,D).length>1&&console.warn("Parameter '"+e.name+"' is ambiguous because the defined spec has more than one parameter with the name: '"+e.name+"' and the passed-in parameter values did not define an 'in' value."),null!==r){if(void 0!==e.default&&void 0===r&&(r=e.default),void 0===r&&e.required&&!e.allowEmptyValue)throw new Error("Required parameter "+e.name+" is not provided");if(O&&e.schema&&"object"===e.schema.type&&"string"==typeof r)try{r=JSON.parse(r)}catch(e){throw new Error("Could not parse object parameter value string as JSON")}n&&n({req:P,parameter:e,value:r,operation:I,spec:t})}});var L=(0,u.default)({},e,{operation:I});if((P=O?(0,w.default)(L,P):(0,E.default)(L,P)).cookies&&(0,l.default)(P.cookies).length){var U=(0,l.default)(P.cookies).reduce(function(e,t){var n=P.cookies[t];return e+(e?"&":"")+v.default.serialize(t,n)},"");P.headers.Cookie=U}return P.cookies&&delete P.cookies,(0,m.mergeInQueryOrForm)(P),P}function i(e){return(0,x.isOAS3)(e.spec)?function(e){var t=e.spec,n=e.pathName,r=e.method,o=e.server,i=e.contextUrl,a=e.serverVariables,u=void 0===a?{}:a,s=(0,f.default)(t,["paths",n,(r||"").toLowerCase(),"servers"])||(0,f.default)(t,["paths",n,"servers"])||(0,f.default)(t,["servers"]),l="",c=null;if(o&&s&&s.length){var p=s.map(function(e){return e.url});p.indexOf(o)>-1&&(l=o,c=s[p.indexOf(o)])}!l&&s&&s.length&&(l=s[0].url,c=s[0]),l.indexOf("{")>-1&&function(e){for(var t=[],n=/{([^}]+)}/g,r=void 0;r=n.exec(e);)t.push(r[1]);return t}(l).forEach(function(e){if(c.variables&&c.variables[e]){var t=c.variables[e],n=u[e]||t.default,r=new RegExp("{"+e+"}","g");l=l.replace(r,n)}});return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=h.default.parse(e),r=h.default.parse(t),o=P(n.protocol)||P(r.protocol)||"",i=n.host||r.host,a=n.pathname||"",u=void 0;return"/"===(u=o&&i?o+"://"+(i+a):a)[u.length-1]?u.slice(0,-1):u}(l,i)}(e):function(e){var t=e.spec,n=e.scheme,r=e.contextUrl,o=void 0===r?"":r,i=h.default.parse(o),a=Array.isArray(t.schemes)?t.schemes[0]:null,u=n||a||P(i.protocol)||"http",s=t.host||i.host||"",l=t.basePath||"",c=void 0;return"/"===(c=u&&s?u+"://"+(s+l):l)[c.length-1]?c.slice(0,-1):c}(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.self=void 0;var a=r(n(8)),u=r(n(3)),s=r(n(52)),l=r(n(0)),c=r(n(2));t.execute=function(e){var t=e.http,n=e.fetch,r=e.spec,o=e.operationId,i=e.pathName,l=e.method,c=e.parameters,f=e.securities,h=(0,s.default)(e,["http","fetch","spec","operationId","pathName","method","parameters","securities"]),v=t||n||g.default;i&&l&&!o&&(o=(0,x.legacyIdFromPathMethod)(i,l));var m=O.buildRequest((0,u.default)({spec:r,operationId:o,parameters:c,securities:f,http:v},h));return m.body&&((0,p.default)(m.body)||(0,d.default)(m.body))&&(m.body=(0,a.default)(m.body)),v(m)},t.buildRequest=o,t.baseUrl=i;var f=r((r(n(6)),n(12))),p=r(n(53)),d=r(n(54)),h=r((r(n(13)),n(10))),v=r(n(55)),m=n(7),g=r(m),y=r(n(21)),b=r(n(56)),_=r(n(57)),w=r(n(62)),E=r(n(64)),x=n(5),S=function(e){return Array.isArray(e)?e:[]},C=(0,y.default)("OperationNotFoundError",function(e,t,n){this.originalError=n,(0,c.default)(this,t||{})}),k=function(e,t){return t.filter(function(t){return t.name===e})},A=function(e){var t={};e.forEach(function(e){t[e.in]||(t[e.in]={}),t[e.in][e.name]=e});var n=[];return(0,l.default)(t).forEach(function(e){(0,l.default)(t[e]).forEach(function(r){n.push(t[e][r])})}),n},O=t.self={buildRequest:o},P=function(e){return e?e.replace(/\W/g,""):null}},function(e,t){e.exports=n(84)},function(e,t){e.exports=n(228)},function(e,t){e.exports=n(24)},function(e,t){e.exports=n(930)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={body:function(e){var t=e.req,n=e.value;t.body=n},header:function(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{},void 0!==r&&(t.headers[n.name]=r)},query:function(e){var t=e.req,n=e.value,r=e.parameter;if(t.query=t.query||{},!1===n&&"boolean"===r.type&&(n="false"),0===n&&["number","integer"].indexOf(r.type)>-1&&(n="0"),n)t.query[r.name]={collectionFormat:r.collectionFormat,value:n};else if(r.allowEmptyValue&&void 0!==n){var o=r.name;t.query[o]=t.query[o]||{},t.query[o].allowEmptyValue=!0}},path:function(e){var t=e.req,n=e.value,r=e.parameter;t.url=t.url.split("{"+r.name+"}").join(encodeURIComponent(n))},formData:function(e){var t=e.req,n=e.value,r=e.parameter;(n||r.allowEmptyValue)&&(t.form=t.form||{},t.form[r.name]={value:n,allowEmptyValue:r.allowEmptyValue,collectionFormat:r.collectionFormat})}},e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(0)),i=r(n(1)),a=r(n(58));t.default={path:function(e){var t=e.req,n=e.value,r=e.parameter,o=r.name,i=r.style,u=r.explode,s=(0,a.default)({key:r.name,value:n,style:i||"simple",explode:u||!1,escape:!0});t.url=t.url.split("{"+o+"}").join(s)},query:function(e){var t=e.req,n=e.value,r=e.parameter;if(t.query=t.query||{},!1===n&&(n="false"),0===n&&(n="0"),n){var u=void 0===n?"undefined":(0,i.default)(n);"deepObject"===r.style?(0,o.default)(n).forEach(function(e){var o=n[e];t.query[r.name+"["+e+"]"]={value:(0,a.default)({key:e,value:o,style:"deepObject",escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}}):"object"!==u||Array.isArray(n)||"form"!==r.style&&r.style||!r.explode&&void 0!==r.explode?t.query[r.name]={value:(0,a.default)({key:r.name,value:n,style:r.style||"form",explode:void 0===r.explode||r.explode,escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}:(0,o.default)(n).forEach(function(e){var o=n[e];t.query[e]={value:(0,a.default)({key:e,value:o,style:r.style||"form",escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}})}else if(r.allowEmptyValue&&void 0!==n){var s=r.name;t.query[s]=t.query[s]||{},t.query[s].allowEmptyValue=!0}},header:function(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{},u.indexOf(n.name.toLowerCase())>-1||void 0!==r&&(t.headers[n.name]=(0,a.default)({key:n.name,value:r,style:n.style||"simple",explode:void 0!==n.explode&&n.explode,escape:!1}))},cookie:function(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{};var o=void 0===r?"undefined":(0,i.default)(r);if("undefined"!==o){var u="object"===o&&!Array.isArray(r)&&n.explode?"":n.name+"=";t.headers.Cookie=u+(0,a.default)({key:n.name,value:r,escape:!1,style:n.style||"form",explode:void 0!==n.explode&&n.explode})}}};var u=["accept","authorization","content-type"];e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).escape,n=arguments[2];return"number"==typeof e&&(e=e.toString()),"string"==typeof e&&e.length&&t?n?JSON.parse(e):(0,s.stringToCharArray)(e).map(function(e){return c(e)?e:l(e)&&"unsafe"===t?e:((0,u.default)(e)||[]).map(function(e){return("0"+e.toString(16).toUpperCase()).slice(-2)}).map(function(e){return"%"+e}).join("")}).join(""):e}Object.defineProperty(t,"__esModule",{value:!0});var i=r(n(0)),a=r(n(1));t.encodeDisallowedCharacters=o,t.default=function(e){var t=e.value;return Array.isArray(t)?function(e){var t=e.key,n=e.value,r=e.style,i=e.explode,a=e.escape,u=function(e){return o(e,{escape:a})};if("simple"===r)return n.map(function(e){return u(e)}).join(",");if("label"===r)return"."+n.map(function(e){return u(e)}).join(".");if("matrix"===r)return n.map(function(e){return u(e)}).reduce(function(e,n){return!e||i?(e||"")+";"+t+"="+n:e+","+n},"");if("form"===r){var s=i?"&"+t+"=":",";return n.map(function(e){return u(e)}).join(s)}if("spaceDelimited"===r){var l=i?t+"=":"";return n.map(function(e){return u(e)}).join(" "+l)}if("pipeDelimited"===r){var c=i?t+"=":"";return n.map(function(e){return u(e)}).join("|"+c)}}(e):"object"===(void 0===t?"undefined":(0,a.default)(t))?function(e){var t=e.key,n=e.value,r=e.style,a=e.explode,u=e.escape,s=function(e){return o(e,{escape:u})},l=(0,i.default)(n);return"simple"===r?l.reduce(function(e,t){var r=s(n[t]);return(e?e+",":"")+t+(a?"=":",")+r},""):"label"===r?l.reduce(function(e,t){var r=s(n[t]);return(e?e+".":".")+t+(a?"=":".")+r},""):"matrix"===r&&a?l.reduce(function(e,t){var r=s(n[t]);return(e?e+";":";")+t+"="+r},""):"matrix"===r?l.reduce(function(e,r){var o=s(n[r]);return(e?e+",":";"+t+"=")+r+","+o},""):"form"===r?l.reduce(function(e,t){var r=s(n[t]);return(e?e+(a?"&":","):"")+t+(a?"=":",")+r},""):void 0}(e):function(e){var t=e.key,n=e.value,r=e.style,i=e.escape,a=function(e){return o(e,{escape:i})};return"simple"===r?a(n):"label"===r?"."+a(n):"matrix"===r?";"+t+"="+a(n):"form"===r?a(n):"deepObject"===r?a(n):void 0}(e)};var u=r((r(n(59)),n(60))),s=n(61),l=function(e){return":/?#[]@!$&'()*+,;=".indexOf(e)>-1},c=function(e){return/^[a-z0-9\-._~]+$/i.test(e)}},function(e,t){e.exports=n(931)},function(e,t){e.exports=n(932)},function(e,t){e.exports=n(933)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,i=void 0===o?{}:o,a=e.spec,f=(0,s.default)({},t),p=r.authorized,d=void 0===p?{}:p,h=i.security||a.security||[],v=d&&!!(0,u.default)(d).length,m=(0,l.default)(a,["components","securitySchemes"])||{};return f.headers=f.headers||{},f.query=f.query||{},(0,u.default)(r).length&&v&&h&&(!Array.isArray(i.security)||i.security.length)?(h.forEach(function(e,t){for(var n in e){var r=d[n],o=m[n];if(r){var i=r.value||r,a=o.type;if(r)if("apiKey"===a)"query"===o.in&&(f.query[o.name]=i),"header"===o.in&&(f.headers[o.name]=i),"cookie"===o.in&&(f.cookies[o.name]=i);else if("http"===a){if("basic"===o.scheme){var u=i.username,s=i.password,l=(0,c.default)(u+":"+s);f.headers.Authorization="Basic "+l}"bearer"===o.scheme&&(f.headers.Authorization="Bearer "+i)}else if("oauth2"===a){var p=r.token||{},h=p.access_token,v=p.token_type;v&&"bearer"!==v.toLowerCase()||(v="Bearer"),f.headers.Authorization=v+" "+h}}}}),f):t}Object.defineProperty(t,"__esModule",{value:!0});var i=r(n(8)),a=r(n(1)),u=r(n(0));t.default=function(e,t){var n=e.operation,r=e.requestBody,s=e.securities,l=e.spec,c=e.attachContentTypeForEmptyPayload,p=e.requestContentType;t=o({request:t,securities:s,operation:n,spec:l});var d=n.requestBody||{},h=(0,u.default)(d.content||{}),v=p&&h.indexOf(p)>-1;if(r||c){if(p&&v)t.headers["Content-Type"]=p;else if(!p){var m=h[0];m&&(t.headers["Content-Type"]=m,p=m)}}else p&&v&&(t.headers["Content-Type"]=p);return r&&(p?h.indexOf(p)>-1&&("application/x-www-form-urlencoded"===p||0===p.indexOf("multipart/")?"object"===(void 0===r?"undefined":(0,a.default)(r))?(t.form={},(0,u.default)(r).forEach(function(e){var n,o=r[e],u=void 0;"undefined"!=typeof File&&(u=o instanceof File),"undefined"!=typeof Blob&&(u=u||o instanceof Blob),void 0!==f.Buffer&&(u=u||f.Buffer.isBuffer(o)),n="object"!==(void 0===o?"undefined":(0,a.default)(o))||u?o:Array.isArray(o)?o.toString():(0,i.default)(o),t.form[e]={value:n}})):t.form=r:t.body=r):t.body=r),t},t.applySecurities=o;var s=r(n(6)),l=r(n(12)),c=r(n(13)),f=n(63)},function(e,t){e.exports=n(54)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,s=void 0===o?{}:o,l=e.spec,c=(0,u.default)({},t),f=r.authorized,p=void 0===f?{}:f,d=r.specSecurity,h=void 0===d?[]:d,v=s.security||h,m=p&&!!(0,i.default)(p).length,g=l.securityDefinitions;return c.headers=c.headers||{},c.query=c.query||{},(0,i.default)(r).length&&m&&v&&(!Array.isArray(s.security)||s.security.length)?(v.forEach(function(e,t){for(var n in e){var r=p[n];if(r){var o=r.token,i=r.value||r,u=g[n],s=u.type,l=u["x-tokenName"]||"access_token",f=o&&o[l],d=o&&o.token_type;if(r)if("apiKey"===s){var h="query"===u.in?"query":"headers";c[h]=c[h]||{},c[h][u.name]=i}else"basic"===s?i.header?c.headers.authorization=i.header:(i.base64=(0,a.default)(i.username+":"+i.password),c.headers.authorization="Basic "+i.base64):"oauth2"===s&&f&&(d=d&&"bearer"!==d.toLowerCase()?d:"Bearer",c.headers.authorization=d+" "+f)}}}),c):t}Object.defineProperty(t,"__esModule",{value:!0});var i=r(n(0));t.default=function(e,t){var n=e.spec,r=e.operation,i=e.securities,a=e.requestContentType,u=e.attachContentTypeForEmptyPayload;if((t=o({request:t,securities:i,operation:r,spec:n})).body||t.form||u)a?t.headers["Content-Type"]=a:Array.isArray(r.consumes)?t.headers["Content-Type"]=r.consumes[0]:Array.isArray(n.consumes)?t.headers["Content-Type"]=n.consumes[0]:r.parameters&&r.parameters.filter(function(e){return"file"===e.type}).length?t.headers["Content-Type"]="multipart/form-data":r.parameters&&r.parameters.filter(function(e){return"formData"===e.in}).length&&(t.headers["Content-Type"]="application/x-www-form-urlencoded");else if(a){var s=r.parameters&&r.parameters.filter(function(e){return"body"===e.in}).length>0,l=r.parameters&&r.parameters.filter(function(e){return"formData"===e.in}).length>0;(s||l)&&(t.headers["Content-Type"]=a)}return t},t.applySecurities=o;var a=r(n(13)),u=r(n(6));r(n(7))}])},function(e,t,n){"use strict";var r=Object.prototype.hasOwnProperty,o=function(){for(var e=[],t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e}();t.arrayToObject=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},r=0;r=48&&i<=57||i>=65&&i<=90||i>=97&&i<=122?n+=t.charAt(r):i<128?n+=o[i]:i<2048?n+=o[192|i>>6]+o[128|63&i]:i<55296||i>=57344?n+=o[224|i>>12]+o[128|i>>6&63]+o[128|63&i]:(r+=1,i=65536+((1023&i)<<10|1023&t.charCodeAt(r)),n+=o[240|i>>18]+o[128|i>>12&63]+o[128|i>>6&63]+o[128|63&i])}return n},t.compact=function(e){for(var t=[{obj:{o:e},prop:"o"}],n=[],r=0;r=0;l--)if(f[l]!=p[l])return!1;for(l=f.length-1;l>=0;l--)if(c=f[l],!a(e[c],t[c],n))return!1;return typeof e==typeof t}(e,t,n))};function u(e){return null===e||void 0===e}function s(e){return!(!e||"object"!=typeof e||"number"!=typeof e.length)&&("function"==typeof e.copy&&"function"==typeof e.slice&&!(e.length>0&&"number"!=typeof e[0]))}},function(e,t,n){var r={strict:!0},o=n(390),i=function(e,t){return o(e,t,r)},a=n(231);t.JsonPatchError=a.PatchError,t.deepClone=a._deepClone;var u={add:function(e,t,n){return e[t]=this.value,{newDocument:n}},remove:function(e,t,n){var r=e[t];return delete e[t],{newDocument:n,removed:r}},replace:function(e,t,n){var r=e[t];return e[t]=this.value,{newDocument:n,removed:r}},move:function(e,t,n){var r=l(n,this.path);r&&(r=a._deepClone(r));var o=c(n,{op:"remove",path:this.from}).removed;return c(n,{op:"add",path:this.path,value:o}),{newDocument:n,removed:r}},copy:function(e,t,n){var r=l(n,this.from);return c(n,{op:"add",path:this.path,value:a._deepClone(r)}),{newDocument:n}},test:function(e,t,n){return{newDocument:n,test:i(e[t],this.value)}},_get:function(e,t,n){return this.value=e[t],{newDocument:n}}},s={add:function(e,t,n){return a.isInteger(t)?e.splice(t,0,this.value):e[t]=this.value,{newDocument:n,index:t}},remove:function(e,t,n){return{newDocument:n,removed:e.splice(t,1)[0]}},replace:function(e,t,n){var r=e[t];return e[t]=this.value,{newDocument:n,removed:r}},move:u.move,copy:u.copy,test:u.test,_get:u._get};function l(e,t){if(""==t)return e;var n={op:"_get",path:t};return c(e,n),n.value}function c(e,n,r,o){if(void 0===r&&(r=!1),void 0===o&&(o=!0),r&&("function"==typeof r?r(n,0,e,n.path):p(n,0)),""===n.path){var c={newDocument:e};if("add"===n.op)return c.newDocument=n.value,c;if("replace"===n.op)return c.newDocument=n.value,c.removed=e,c;if("move"===n.op||"copy"===n.op)return c.newDocument=l(e,n.from),"move"===n.op&&(c.removed=e),c;if("test"===n.op){if(c.test=i(e,n.value),!1===c.test)throw new t.JsonPatchError("Test operation failed","TEST_OPERATION_FAILED",0,n,e);return c.newDocument=e,c}if("remove"===n.op)return c.removed=e,c.newDocument=null,c;if("_get"===n.op)return n.value=e,c;if(r)throw new t.JsonPatchError("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",0,n,e);return c}o||(e=a._deepClone(e));var f=(n.path||"").split("/"),d=e,h=1,v=f.length,m=void 0,g=void 0,y=void 0;for(y="function"==typeof r?r:p;;){if(g=f[h],r&&void 0===m&&(void 0===d[g]?m=f.slice(0,h).join("/"):h==v-1&&(m=n.path),void 0!==m&&y(n,0,e,m)),h++,Array.isArray(d)){if("-"===g)g=d.length;else{if(r&&!a.isInteger(g))throw new t.JsonPatchError("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index","OPERATION_PATH_ILLEGAL_ARRAY_INDEX",0,n.path,n);a.isInteger(g)&&(g=~~g)}if(h>=v){if(r&&"add"===n.op&&g>d.length)throw new t.JsonPatchError("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",0,n.path,n);if(!1===(c=s[n.op].call(n,d,g,e)).test)throw new t.JsonPatchError("Test operation failed","TEST_OPERATION_FAILED",0,n,e);return c}}else if(g&&-1!=g.indexOf("~")&&(g=a.unescapePathComponent(g)),h>=v){if(!1===(c=u[n.op].call(n,d,g,e)).test)throw new t.JsonPatchError("Test operation failed","TEST_OPERATION_FAILED",0,n,e);return c}d=d[g]}}function f(e,n,r,o){if(void 0===o&&(o=!0),r&&!Array.isArray(n))throw new t.JsonPatchError("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");o||(e=a._deepClone(e));for(var i=new Array(n.length),u=0,s=n.length;u0)throw new t.JsonPatchError('Operation `path` property must start with "/"',"OPERATION_PATH_INVALID",n,e,r);if(("move"===e.op||"copy"===e.op)&&"string"!=typeof e.from)throw new t.JsonPatchError("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",n,e,r);if(("add"===e.op||"replace"===e.op||"test"===e.op)&&void 0===e.value)throw new t.JsonPatchError("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",n,e,r);if(("add"===e.op||"replace"===e.op||"test"===e.op)&&a.hasUndefined(e.value))throw new t.JsonPatchError("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",n,e,r);if(r)if("add"==e.op){var i=e.path.split("/").length,s=o.split("/").length;if(i!==s+1&&i!==s)throw new t.JsonPatchError("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",n,e,r)}else if("replace"===e.op||"remove"===e.op||"_get"===e.op){if(e.path!==o)throw new t.JsonPatchError("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",n,e,r)}else if("move"===e.op||"copy"===e.op){var l=d([{op:"_get",path:e.from,value:void 0}],r);if(l&&"OPERATION_PATH_UNRESOLVABLE"===l.name)throw new t.JsonPatchError("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",n,e,r)}}function d(e,n,r){try{if(!Array.isArray(e))throw new t.JsonPatchError("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(n)f(a._deepClone(n),a._deepClone(e),r||!0);else{r=r||p;for(var o=0;o1&&void 0!==arguments[1]?arguments[1]:(0,a.List)();return function(e){return(e.authSelectors.definitionsToAuthorize()||(0,a.List)()).filter(function(e){return t.some(function(t){return t.get(e.keySeq().first())})})}},t.authorized=(0,i.createSelector)(s,function(e){return e.get("authorized")||(0,a.Map)()}),t.isAuthorized=function(e,t){return function(e){var n=e.authSelectors.authorized();return a.List.isList(t)?!!t.toJS().filter(function(e){return-1===(0,r.default)(e).map(function(e){return!!n.get(e)}).indexOf(!1)}).length:null}},t.getConfigs=(0,i.createSelector)(s,function(e){return e.get("configs")})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.execute=void 0;var r,o=n(25),i=(r=o)&&r.__esModule?r:{default:r};t.execute=function(e,t){var n=t.authSelectors,r=t.specSelectors;return function(t){var o=t.path,a=t.method,u=t.operation,s=t.extras,l={authorized:n.authorized()&&n.authorized().toJS(),definitions:r.securityDefinitions()&&r.securityDefinitions().toJS(),specSecurity:r.security()&&r.security().toJS()};return e((0,i.default)({path:o,method:a,operation:u,securities:l},s))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return{fn:{shallowEqualKeys:r.shallowEqualKeys}}};var r=n(9)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=s(n(41)),o=s(n(23));t.default=function(e){var t=e.fn,n={download:function(e){return function(n){var r=n.errActions,i=n.specSelectors,a=n.specActions,s=n.getConfigs,l=t.fetch,c=s();function f(t){if(t instanceof Error||t.status>=400)return a.updateLoadingStatus("failed"),r.newThrownErr((0,o.default)(new Error((t.message||t.statusText)+" "+e),{source:"fetch"})),void(!t.status&&t instanceof Error&&function(){try{var t=void 0;if("URL"in u.default?t=new URL(e):(t=document.createElement("a")).href=e,"https:"!==t.protocol&&"https:"===u.default.location.protocol){var n=(0,o.default)(new Error("Possible mixed-content issue? The page was loaded over https:// but a "+t.protocol+"// URL was specified. Check that you are not attempting to load mixed content."),{source:"fetch"});return void r.newThrownErr(n)}if(t.origin!==u.default.location.origin){var i=(0,o.default)(new Error("Possible cross-origin (CORS) issue? The URL origin ("+t.origin+") does not match the page ("+u.default.location.origin+"). Check the server returns the correct 'Access-Control-Allow-*' headers."),{source:"fetch"});r.newThrownErr(i)}}catch(e){return}}());a.updateLoadingStatus("success"),a.updateSpec(t.text),i.url()!==e&&a.updateUrl(e)}e=e||i.url(),a.updateLoadingStatus("loading"),r.clear({source:"fetch"}),l({url:e,loadSpec:!0,requestInterceptor:c.requestInterceptor||function(e){return e},responseInterceptor:c.responseInterceptor||function(e){return e},credentials:"same-origin",headers:{Accept:"application/json,*/*"}}).then(f,f)}},updateLoadingStatus:function(e){var t=[null,"loading","failed","success","failedConfig"];return-1===t.indexOf(e)&&console.error("Error: "+e+" is not one of "+(0,r.default)(t)),{type:"spec_update_loading_status",payload:e}}},s={loadingStatus:(0,i.createSelector)(function(e){return e||(0,a.Map)()},function(e){return e.get("loadingStatus")||null})};return{statePlugins:{spec:{actions:n,reducers:{spec_update_loading_status:function(e,t){return"string"==typeof t.payload?e.set("loadingStatus",t.payload):e}},selectors:s}}}};var i=n(58),a=n(7),u=s(n(32));function s(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return{statePlugins:{spec:{actions:a,selectors:f},configs:{reducers:s.default,actions:i,selectors:u}}}};var r=c(n(934)),o=n(234),i=l(n(235)),a=l(n(401)),u=l(n(402)),s=c(n(403));function l(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function c(e){return e&&e.__esModule?e:{default:e}}var f={getLocalConfig:function(){return(0,o.parseYamlConfig)(r.default)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getConfigByUrl=t.downloadConfig=void 0;var r=n(234);t.downloadConfig=function(e){return function(t){return(0,t.fn.fetch)(e)}},t.getConfigByUrl=function(e,t){return function(n){var o=n.specActions;if(e)return o.downloadConfig(e).then(i,i);function i(n){n instanceof Error||n.status>=400?(o.updateLoadingStatus("failedConfig"),o.updateLoadingStatus("failedConfig"),o.updateUrl(""),console.error(n.statusText+" "+e.url),t(null)):t((0,r.parseYamlConfig)(n.text))}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.get=function(e,t){return e.getIn(Array.isArray(t)?t:[t])}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,o,i=n(22),a=(r=i)&&r.__esModule?r:{default:r},u=n(7),s=n(235);t.default=(o={},(0,a.default)(o,s.UPDATE_CONFIGS,function(e,t){return e.merge((0,u.fromJS)(t.payload))}),(0,a.default)(o,s.TOGGLE_CONFIGS,function(e,t){var n=t.payload,r=e.get(n);return e.set(n,!r)}),o)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return[r.default,{statePlugins:{configs:{wrapActions:{loaded:function(e,t){return function(){e.apply(void 0,arguments);var n=decodeURIComponent(window.location.hash);t.layoutActions.parseDeepLinkHash(n)}}}}},wrapComponents:{operation:o.default,OperationTag:i.default}}]};var r=a(n(405)),o=a(n(407)),i=a(n(408));function a(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.clearScrollTo=t.scrollToElement=t.readyToScroll=t.parseDeepLinkHash=t.scrollTo=t.show=void 0;var r,o=f(n(22)),i=f(n(17)),a=n(406),u=f(n(935)),s=n(9),l=n(7),c=f(l);function f(e){return e&&e.__esModule?e:{default:e}}var p=t.show=function(e,t){var n=t.getConfigs,r=t.layoutSelectors;return function(){for(var t=arguments.length,o=Array(t),u=0;u-1&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),n.show(h.map(function(e){return e.replace(/_/g," ")}),!0)),n.show(h,!0)}(f.indexOf("_")>-1||d.indexOf("_")>-1)&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),n.show(u.map(function(e){return e.replace(/_/g," ")}),!0)),n.show(u,!0),n.scrollTo(u)}}},v=t.readyToScroll=function(e,t){return function(n){var r=n.layoutSelectors.getScrollToKey();c.default.is(r,(0,l.fromJS)(e))&&(n.layoutActions.scrollToElement(t),n.layoutActions.clearScrollTo())}},m=t.scrollToElement=function(e,t){return function(n){try{t=t||n.fn.getScrollParent(e),u.default.createScroller(t).to(e)}catch(e){console.error(e)}}},g=t.clearScrollTo=function(){return{type:"layout_clear_scroll"}};t.default={fn:{getScrollParent:function(e,t){var n=document.documentElement,r=getComputedStyle(e),o="absolute"===r.position,i=t?/(auto|scroll|hidden)/:/(auto|scroll)/;if("fixed"===r.position)return n;for(var a=e;a=a.parentElement;)if(r=getComputedStyle(a),(!o||"static"!==r.position)&&i.test(r.overflow+r.overflowY+r.overflowX))return a;return n}},statePlugins:{layout:{actions:{scrollToElement:m,scrollTo:d,clearScrollTo:g,readyToScroll:v,parseDeepLinkHash:h},selectors:{getScrollToKey:function(e){return e.get("scrollToKey")},isShownKeyFromUrlHashArray:function(e,t){var n=(0,i.default)(t,2),r=n[0],o=n[1];return o?["operations",r,o]:r?["operations-tag",r]:[]},urlHashArrayFromIsShownKey:function(e,t){var n=(0,i.default)(t,3),r=n[0],o=n[1],a=n[2];return"operations"==r?[o,a]:"operations-tag"==r?[o]:[]}},reducers:(r={},(0,o.default)(r,"layout_scroll_to",function(e,t){return e.set("scrollToKey",c.default.fromJS(t.payload))}),(0,o.default)(r,"layout_clear_scroll",function(e){return e.delete("scrollToKey")}),r),wrapActions:{show:p}}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.setHash=function(e){return e?history.pushState(null,null,"#"+e):window.location.hash=""}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=l(n(4)),o=l(n(2)),i=l(n(3)),a=l(n(5)),u=l(n(6)),s=l(n(0));l(n(12));function l(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t){return function(n){function l(){var e,n,i,u;(0,o.default)(this,l);for(var s=arguments.length,c=Array(s),f=0;f",Gt:"≫",gt:">",gtcc:"⪧",gtcir:"⩺",gtdot:"⋗",gtlPar:"⦕",gtquest:"⩼",gtrapprox:"⪆",gtrarr:"⥸",gtrdot:"⋗",gtreqless:"⋛",gtreqqless:"⪌",gtrless:"≷",gtrsim:"≳",gvertneqq:"≩︀",gvnE:"≩︀",Hacek:"ˇ",hairsp:" ",half:"½",hamilt:"ℋ",HARDcy:"Ъ",hardcy:"ъ",hArr:"⇔",harr:"↔",harrcir:"⥈",harrw:"↭",Hat:"^",hbar:"ℏ",Hcirc:"Ĥ",hcirc:"ĥ",hearts:"♥",heartsuit:"♥",hellip:"…",hercon:"⊹",Hfr:"ℌ",hfr:"𝔥",HilbertSpace:"ℋ",hksearow:"⤥",hkswarow:"⤦",hoarr:"⇿",homtht:"∻",hookleftarrow:"↩",hookrightarrow:"↪",Hopf:"ℍ",hopf:"𝕙",horbar:"―",HorizontalLine:"─",Hscr:"ℋ",hscr:"𝒽",hslash:"ℏ",Hstrok:"Ħ",hstrok:"ħ",HumpDownHump:"≎",HumpEqual:"≏",hybull:"⁃",hyphen:"‐",Iacute:"Í",iacute:"í",ic:"⁣",Icirc:"Î",icirc:"î",Icy:"И",icy:"и",Idot:"İ",IEcy:"Е",iecy:"е",iexcl:"¡",iff:"⇔",Ifr:"ℑ",ifr:"𝔦",Igrave:"Ì",igrave:"ì",ii:"ⅈ",iiiint:"⨌",iiint:"∭",iinfin:"⧜",iiota:"℩",IJlig:"IJ",ijlig:"ij",Im:"ℑ",Imacr:"Ī",imacr:"ī",image:"ℑ",ImaginaryI:"ⅈ",imagline:"ℐ",imagpart:"ℑ",imath:"ı",imof:"⊷",imped:"Ƶ",Implies:"⇒",in:"∈",incare:"℅",infin:"∞",infintie:"⧝",inodot:"ı",Int:"∬",int:"∫",intcal:"⊺",integers:"ℤ",Integral:"∫",intercal:"⊺",Intersection:"⋂",intlarhk:"⨗",intprod:"⨼",InvisibleComma:"⁣",InvisibleTimes:"⁢",IOcy:"Ё",iocy:"ё",Iogon:"Į",iogon:"į",Iopf:"𝕀",iopf:"𝕚",Iota:"Ι",iota:"ι",iprod:"⨼",iquest:"¿",Iscr:"ℐ",iscr:"𝒾",isin:"∈",isindot:"⋵",isinE:"⋹",isins:"⋴",isinsv:"⋳",isinv:"∈",it:"⁢",Itilde:"Ĩ",itilde:"ĩ",Iukcy:"І",iukcy:"і",Iuml:"Ï",iuml:"ï",Jcirc:"Ĵ",jcirc:"ĵ",Jcy:"Й",jcy:"й",Jfr:"𝔍",jfr:"𝔧",jmath:"ȷ",Jopf:"𝕁",jopf:"𝕛",Jscr:"𝒥",jscr:"𝒿",Jsercy:"Ј",jsercy:"ј",Jukcy:"Є",jukcy:"є",Kappa:"Κ",kappa:"κ",kappav:"ϰ",Kcedil:"Ķ",kcedil:"ķ",Kcy:"К",kcy:"к",Kfr:"𝔎",kfr:"𝔨",kgreen:"ĸ",KHcy:"Х",khcy:"х",KJcy:"Ќ",kjcy:"ќ",Kopf:"𝕂",kopf:"𝕜",Kscr:"𝒦",kscr:"𝓀",lAarr:"⇚",Lacute:"Ĺ",lacute:"ĺ",laemptyv:"⦴",lagran:"ℒ",Lambda:"Λ",lambda:"λ",Lang:"⟪",lang:"⟨",langd:"⦑",langle:"⟨",lap:"⪅",Laplacetrf:"ℒ",laquo:"«",Larr:"↞",lArr:"⇐",larr:"←",larrb:"⇤",larrbfs:"⤟",larrfs:"⤝",larrhk:"↩",larrlp:"↫",larrpl:"⤹",larrsim:"⥳",larrtl:"↢",lat:"⪫",lAtail:"⤛",latail:"⤙",late:"⪭",lates:"⪭︀",lBarr:"⤎",lbarr:"⤌",lbbrk:"❲",lbrace:"{",lbrack:"[",lbrke:"⦋",lbrksld:"⦏",lbrkslu:"⦍",Lcaron:"Ľ",lcaron:"ľ",Lcedil:"Ļ",lcedil:"ļ",lceil:"⌈",lcub:"{",Lcy:"Л",lcy:"л",ldca:"⤶",ldquo:"“",ldquor:"„",ldrdhar:"⥧",ldrushar:"⥋",ldsh:"↲",lE:"≦",le:"≤",LeftAngleBracket:"⟨",LeftArrow:"←",Leftarrow:"⇐",leftarrow:"←",LeftArrowBar:"⇤",LeftArrowRightArrow:"⇆",leftarrowtail:"↢",LeftCeiling:"⌈",LeftDoubleBracket:"⟦",LeftDownTeeVector:"⥡",LeftDownVector:"⇃",LeftDownVectorBar:"⥙",LeftFloor:"⌊",leftharpoondown:"↽",leftharpoonup:"↼",leftleftarrows:"⇇",LeftRightArrow:"↔",Leftrightarrow:"⇔",leftrightarrow:"↔",leftrightarrows:"⇆",leftrightharpoons:"⇋",leftrightsquigarrow:"↭",LeftRightVector:"⥎",LeftTee:"⊣",LeftTeeArrow:"↤",LeftTeeVector:"⥚",leftthreetimes:"⋋",LeftTriangle:"⊲",LeftTriangleBar:"⧏",LeftTriangleEqual:"⊴",LeftUpDownVector:"⥑",LeftUpTeeVector:"⥠",LeftUpVector:"↿",LeftUpVectorBar:"⥘",LeftVector:"↼",LeftVectorBar:"⥒",lEg:"⪋",leg:"⋚",leq:"≤",leqq:"≦",leqslant:"⩽",les:"⩽",lescc:"⪨",lesdot:"⩿",lesdoto:"⪁",lesdotor:"⪃",lesg:"⋚︀",lesges:"⪓",lessapprox:"⪅",lessdot:"⋖",lesseqgtr:"⋚",lesseqqgtr:"⪋",LessEqualGreater:"⋚",LessFullEqual:"≦",LessGreater:"≶",lessgtr:"≶",LessLess:"⪡",lesssim:"≲",LessSlantEqual:"⩽",LessTilde:"≲",lfisht:"⥼",lfloor:"⌊",Lfr:"𝔏",lfr:"𝔩",lg:"≶",lgE:"⪑",lHar:"⥢",lhard:"↽",lharu:"↼",lharul:"⥪",lhblk:"▄",LJcy:"Љ",ljcy:"љ",Ll:"⋘",ll:"≪",llarr:"⇇",llcorner:"⌞",Lleftarrow:"⇚",llhard:"⥫",lltri:"◺",Lmidot:"Ŀ",lmidot:"ŀ",lmoust:"⎰",lmoustache:"⎰",lnap:"⪉",lnapprox:"⪉",lnE:"≨",lne:"⪇",lneq:"⪇",lneqq:"≨",lnsim:"⋦",loang:"⟬",loarr:"⇽",lobrk:"⟦",LongLeftArrow:"⟵",Longleftarrow:"⟸",longleftarrow:"⟵",LongLeftRightArrow:"⟷",Longleftrightarrow:"⟺",longleftrightarrow:"⟷",longmapsto:"⟼",LongRightArrow:"⟶",Longrightarrow:"⟹",longrightarrow:"⟶",looparrowleft:"↫",looparrowright:"↬",lopar:"⦅",Lopf:"𝕃",lopf:"𝕝",loplus:"⨭",lotimes:"⨴",lowast:"∗",lowbar:"_",LowerLeftArrow:"↙",LowerRightArrow:"↘",loz:"◊",lozenge:"◊",lozf:"⧫",lpar:"(",lparlt:"⦓",lrarr:"⇆",lrcorner:"⌟",lrhar:"⇋",lrhard:"⥭",lrm:"‎",lrtri:"⊿",lsaquo:"‹",Lscr:"ℒ",lscr:"𝓁",Lsh:"↰",lsh:"↰",lsim:"≲",lsime:"⪍",lsimg:"⪏",lsqb:"[",lsquo:"‘",lsquor:"‚",Lstrok:"Ł",lstrok:"ł",LT:"<",Lt:"≪",lt:"<",ltcc:"⪦",ltcir:"⩹",ltdot:"⋖",lthree:"⋋",ltimes:"⋉",ltlarr:"⥶",ltquest:"⩻",ltri:"◃",ltrie:"⊴",ltrif:"◂",ltrPar:"⦖",lurdshar:"⥊",luruhar:"⥦",lvertneqq:"≨︀",lvnE:"≨︀",macr:"¯",male:"♂",malt:"✠",maltese:"✠",Map:"⤅",map:"↦",mapsto:"↦",mapstodown:"↧",mapstoleft:"↤",mapstoup:"↥",marker:"▮",mcomma:"⨩",Mcy:"М",mcy:"м",mdash:"—",mDDot:"∺",measuredangle:"∡",MediumSpace:" ",Mellintrf:"ℳ",Mfr:"𝔐",mfr:"𝔪",mho:"℧",micro:"µ",mid:"∣",midast:"*",midcir:"⫰",middot:"·",minus:"−",minusb:"⊟",minusd:"∸",minusdu:"⨪",MinusPlus:"∓",mlcp:"⫛",mldr:"…",mnplus:"∓",models:"⊧",Mopf:"𝕄",mopf:"𝕞",mp:"∓",Mscr:"ℳ",mscr:"𝓂",mstpos:"∾",Mu:"Μ",mu:"μ",multimap:"⊸",mumap:"⊸",nabla:"∇",Nacute:"Ń",nacute:"ń",nang:"∠⃒",nap:"≉",napE:"⩰̸",napid:"≋̸",napos:"ʼn",napprox:"≉",natur:"♮",natural:"♮",naturals:"ℕ",nbsp:" ",nbump:"≎̸",nbumpe:"≏̸",ncap:"⩃",Ncaron:"Ň",ncaron:"ň",Ncedil:"Ņ",ncedil:"ņ",ncong:"≇",ncongdot:"⩭̸",ncup:"⩂",Ncy:"Н",ncy:"н",ndash:"–",ne:"≠",nearhk:"⤤",neArr:"⇗",nearr:"↗",nearrow:"↗",nedot:"≐̸",NegativeMediumSpace:"​",NegativeThickSpace:"​",NegativeThinSpace:"​",NegativeVeryThinSpace:"​",nequiv:"≢",nesear:"⤨",nesim:"≂̸",NestedGreaterGreater:"≫",NestedLessLess:"≪",NewLine:"\n",nexist:"∄",nexists:"∄",Nfr:"𝔑",nfr:"𝔫",ngE:"≧̸",nge:"≱",ngeq:"≱",ngeqq:"≧̸",ngeqslant:"⩾̸",nges:"⩾̸",nGg:"⋙̸",ngsim:"≵",nGt:"≫⃒",ngt:"≯",ngtr:"≯",nGtv:"≫̸",nhArr:"⇎",nharr:"↮",nhpar:"⫲",ni:"∋",nis:"⋼",nisd:"⋺",niv:"∋",NJcy:"Њ",njcy:"њ",nlArr:"⇍",nlarr:"↚",nldr:"‥",nlE:"≦̸",nle:"≰",nLeftarrow:"⇍",nleftarrow:"↚",nLeftrightarrow:"⇎",nleftrightarrow:"↮",nleq:"≰",nleqq:"≦̸",nleqslant:"⩽̸",nles:"⩽̸",nless:"≮",nLl:"⋘̸",nlsim:"≴",nLt:"≪⃒",nlt:"≮",nltri:"⋪",nltrie:"⋬",nLtv:"≪̸",nmid:"∤",NoBreak:"⁠",NonBreakingSpace:" ",Nopf:"ℕ",nopf:"𝕟",Not:"⫬",not:"¬",NotCongruent:"≢",NotCupCap:"≭",NotDoubleVerticalBar:"∦",NotElement:"∉",NotEqual:"≠",NotEqualTilde:"≂̸",NotExists:"∄",NotGreater:"≯",NotGreaterEqual:"≱",NotGreaterFullEqual:"≧̸",NotGreaterGreater:"≫̸",NotGreaterLess:"≹",NotGreaterSlantEqual:"⩾̸",NotGreaterTilde:"≵",NotHumpDownHump:"≎̸",NotHumpEqual:"≏̸",notin:"∉",notindot:"⋵̸",notinE:"⋹̸",notinva:"∉",notinvb:"⋷",notinvc:"⋶",NotLeftTriangle:"⋪",NotLeftTriangleBar:"⧏̸",NotLeftTriangleEqual:"⋬",NotLess:"≮",NotLessEqual:"≰",NotLessGreater:"≸",NotLessLess:"≪̸",NotLessSlantEqual:"⩽̸",NotLessTilde:"≴",NotNestedGreaterGreater:"⪢̸",NotNestedLessLess:"⪡̸",notni:"∌",notniva:"∌",notnivb:"⋾",notnivc:"⋽",NotPrecedes:"⊀",NotPrecedesEqual:"⪯̸",NotPrecedesSlantEqual:"⋠",NotReverseElement:"∌",NotRightTriangle:"⋫",NotRightTriangleBar:"⧐̸",NotRightTriangleEqual:"⋭",NotSquareSubset:"⊏̸",NotSquareSubsetEqual:"⋢",NotSquareSuperset:"⊐̸",NotSquareSupersetEqual:"⋣",NotSubset:"⊂⃒",NotSubsetEqual:"⊈",NotSucceeds:"⊁",NotSucceedsEqual:"⪰̸",NotSucceedsSlantEqual:"⋡",NotSucceedsTilde:"≿̸",NotSuperset:"⊃⃒",NotSupersetEqual:"⊉",NotTilde:"≁",NotTildeEqual:"≄",NotTildeFullEqual:"≇",NotTildeTilde:"≉",NotVerticalBar:"∤",npar:"∦",nparallel:"∦",nparsl:"⫽⃥",npart:"∂̸",npolint:"⨔",npr:"⊀",nprcue:"⋠",npre:"⪯̸",nprec:"⊀",npreceq:"⪯̸",nrArr:"⇏",nrarr:"↛",nrarrc:"⤳̸",nrarrw:"↝̸",nRightarrow:"⇏",nrightarrow:"↛",nrtri:"⋫",nrtrie:"⋭",nsc:"⊁",nsccue:"⋡",nsce:"⪰̸",Nscr:"𝒩",nscr:"𝓃",nshortmid:"∤",nshortparallel:"∦",nsim:"≁",nsime:"≄",nsimeq:"≄",nsmid:"∤",nspar:"∦",nsqsube:"⋢",nsqsupe:"⋣",nsub:"⊄",nsubE:"⫅̸",nsube:"⊈",nsubset:"⊂⃒",nsubseteq:"⊈",nsubseteqq:"⫅̸",nsucc:"⊁",nsucceq:"⪰̸",nsup:"⊅",nsupE:"⫆̸",nsupe:"⊉",nsupset:"⊃⃒",nsupseteq:"⊉",nsupseteqq:"⫆̸",ntgl:"≹",Ntilde:"Ñ",ntilde:"ñ",ntlg:"≸",ntriangleleft:"⋪",ntrianglelefteq:"⋬",ntriangleright:"⋫",ntrianglerighteq:"⋭",Nu:"Ν",nu:"ν",num:"#",numero:"№",numsp:" ",nvap:"≍⃒",nVDash:"⊯",nVdash:"⊮",nvDash:"⊭",nvdash:"⊬",nvge:"≥⃒",nvgt:">⃒",nvHarr:"⤄",nvinfin:"⧞",nvlArr:"⤂",nvle:"≤⃒",nvlt:"<⃒",nvltrie:"⊴⃒",nvrArr:"⤃",nvrtrie:"⊵⃒",nvsim:"∼⃒",nwarhk:"⤣",nwArr:"⇖",nwarr:"↖",nwarrow:"↖",nwnear:"⤧",Oacute:"Ó",oacute:"ó",oast:"⊛",ocir:"⊚",Ocirc:"Ô",ocirc:"ô",Ocy:"О",ocy:"о",odash:"⊝",Odblac:"Ő",odblac:"ő",odiv:"⨸",odot:"⊙",odsold:"⦼",OElig:"Œ",oelig:"œ",ofcir:"⦿",Ofr:"𝔒",ofr:"𝔬",ogon:"˛",Ograve:"Ò",ograve:"ò",ogt:"⧁",ohbar:"⦵",ohm:"Ω",oint:"∮",olarr:"↺",olcir:"⦾",olcross:"⦻",oline:"‾",olt:"⧀",Omacr:"Ō",omacr:"ō",Omega:"Ω",omega:"ω",Omicron:"Ο",omicron:"ο",omid:"⦶",ominus:"⊖",Oopf:"𝕆",oopf:"𝕠",opar:"⦷",OpenCurlyDoubleQuote:"“",OpenCurlyQuote:"‘",operp:"⦹",oplus:"⊕",Or:"⩔",or:"∨",orarr:"↻",ord:"⩝",order:"ℴ",orderof:"ℴ",ordf:"ª",ordm:"º",origof:"⊶",oror:"⩖",orslope:"⩗",orv:"⩛",oS:"Ⓢ",Oscr:"𝒪",oscr:"ℴ",Oslash:"Ø",oslash:"ø",osol:"⊘",Otilde:"Õ",otilde:"õ",Otimes:"⨷",otimes:"⊗",otimesas:"⨶",Ouml:"Ö",ouml:"ö",ovbar:"⌽",OverBar:"‾",OverBrace:"⏞",OverBracket:"⎴",OverParenthesis:"⏜",par:"∥",para:"¶",parallel:"∥",parsim:"⫳",parsl:"⫽",part:"∂",PartialD:"∂",Pcy:"П",pcy:"п",percnt:"%",period:".",permil:"‰",perp:"⊥",pertenk:"‱",Pfr:"𝔓",pfr:"𝔭",Phi:"Φ",phi:"φ",phiv:"ϕ",phmmat:"ℳ",phone:"☎",Pi:"Π",pi:"π",pitchfork:"⋔",piv:"ϖ",planck:"ℏ",planckh:"ℎ",plankv:"ℏ",plus:"+",plusacir:"⨣",plusb:"⊞",pluscir:"⨢",plusdo:"∔",plusdu:"⨥",pluse:"⩲",PlusMinus:"±",plusmn:"±",plussim:"⨦",plustwo:"⨧",pm:"±",Poincareplane:"ℌ",pointint:"⨕",Popf:"ℙ",popf:"𝕡",pound:"£",Pr:"⪻",pr:"≺",prap:"⪷",prcue:"≼",prE:"⪳",pre:"⪯",prec:"≺",precapprox:"⪷",preccurlyeq:"≼",Precedes:"≺",PrecedesEqual:"⪯",PrecedesSlantEqual:"≼",PrecedesTilde:"≾",preceq:"⪯",precnapprox:"⪹",precneqq:"⪵",precnsim:"⋨",precsim:"≾",Prime:"″",prime:"′",primes:"ℙ",prnap:"⪹",prnE:"⪵",prnsim:"⋨",prod:"∏",Product:"∏",profalar:"⌮",profline:"⌒",profsurf:"⌓",prop:"∝",Proportion:"∷",Proportional:"∝",propto:"∝",prsim:"≾",prurel:"⊰",Pscr:"𝒫",pscr:"𝓅",Psi:"Ψ",psi:"ψ",puncsp:" ",Qfr:"𝔔",qfr:"𝔮",qint:"⨌",Qopf:"ℚ",qopf:"𝕢",qprime:"⁗",Qscr:"𝒬",qscr:"𝓆",quaternions:"ℍ",quatint:"⨖",quest:"?",questeq:"≟",QUOT:'"',quot:'"',rAarr:"⇛",race:"∽̱",Racute:"Ŕ",racute:"ŕ",radic:"√",raemptyv:"⦳",Rang:"⟫",rang:"⟩",rangd:"⦒",range:"⦥",rangle:"⟩",raquo:"»",Rarr:"↠",rArr:"⇒",rarr:"→",rarrap:"⥵",rarrb:"⇥",rarrbfs:"⤠",rarrc:"⤳",rarrfs:"⤞",rarrhk:"↪",rarrlp:"↬",rarrpl:"⥅",rarrsim:"⥴",Rarrtl:"⤖",rarrtl:"↣",rarrw:"↝",rAtail:"⤜",ratail:"⤚",ratio:"∶",rationals:"ℚ",RBarr:"⤐",rBarr:"⤏",rbarr:"⤍",rbbrk:"❳",rbrace:"}",rbrack:"]",rbrke:"⦌",rbrksld:"⦎",rbrkslu:"⦐",Rcaron:"Ř",rcaron:"ř",Rcedil:"Ŗ",rcedil:"ŗ",rceil:"⌉",rcub:"}",Rcy:"Р",rcy:"р",rdca:"⤷",rdldhar:"⥩",rdquo:"”",rdquor:"”",rdsh:"↳",Re:"ℜ",real:"ℜ",realine:"ℛ",realpart:"ℜ",reals:"ℝ",rect:"▭",REG:"®",reg:"®",ReverseElement:"∋",ReverseEquilibrium:"⇋",ReverseUpEquilibrium:"⥯",rfisht:"⥽",rfloor:"⌋",Rfr:"ℜ",rfr:"𝔯",rHar:"⥤",rhard:"⇁",rharu:"⇀",rharul:"⥬",Rho:"Ρ",rho:"ρ",rhov:"ϱ",RightAngleBracket:"⟩",RightArrow:"→",Rightarrow:"⇒",rightarrow:"→",RightArrowBar:"⇥",RightArrowLeftArrow:"⇄",rightarrowtail:"↣",RightCeiling:"⌉",RightDoubleBracket:"⟧",RightDownTeeVector:"⥝",RightDownVector:"⇂",RightDownVectorBar:"⥕",RightFloor:"⌋",rightharpoondown:"⇁",rightharpoonup:"⇀",rightleftarrows:"⇄",rightleftharpoons:"⇌",rightrightarrows:"⇉",rightsquigarrow:"↝",RightTee:"⊢",RightTeeArrow:"↦",RightTeeVector:"⥛",rightthreetimes:"⋌",RightTriangle:"⊳",RightTriangleBar:"⧐",RightTriangleEqual:"⊵",RightUpDownVector:"⥏",RightUpTeeVector:"⥜",RightUpVector:"↾",RightUpVectorBar:"⥔",RightVector:"⇀",RightVectorBar:"⥓",ring:"˚",risingdotseq:"≓",rlarr:"⇄",rlhar:"⇌",rlm:"‏",rmoust:"⎱",rmoustache:"⎱",rnmid:"⫮",roang:"⟭",roarr:"⇾",robrk:"⟧",ropar:"⦆",Ropf:"ℝ",ropf:"𝕣",roplus:"⨮",rotimes:"⨵",RoundImplies:"⥰",rpar:")",rpargt:"⦔",rppolint:"⨒",rrarr:"⇉",Rrightarrow:"⇛",rsaquo:"›",Rscr:"ℛ",rscr:"𝓇",Rsh:"↱",rsh:"↱",rsqb:"]",rsquo:"’",rsquor:"’",rthree:"⋌",rtimes:"⋊",rtri:"▹",rtrie:"⊵",rtrif:"▸",rtriltri:"⧎",RuleDelayed:"⧴",ruluhar:"⥨",rx:"℞",Sacute:"Ś",sacute:"ś",sbquo:"‚",Sc:"⪼",sc:"≻",scap:"⪸",Scaron:"Š",scaron:"š",sccue:"≽",scE:"⪴",sce:"⪰",Scedil:"Ş",scedil:"ş",Scirc:"Ŝ",scirc:"ŝ",scnap:"⪺",scnE:"⪶",scnsim:"⋩",scpolint:"⨓",scsim:"≿",Scy:"С",scy:"с",sdot:"⋅",sdotb:"⊡",sdote:"⩦",searhk:"⤥",seArr:"⇘",searr:"↘",searrow:"↘",sect:"§",semi:";",seswar:"⤩",setminus:"∖",setmn:"∖",sext:"✶",Sfr:"𝔖",sfr:"𝔰",sfrown:"⌢",sharp:"♯",SHCHcy:"Щ",shchcy:"щ",SHcy:"Ш",shcy:"ш",ShortDownArrow:"↓",ShortLeftArrow:"←",shortmid:"∣",shortparallel:"∥",ShortRightArrow:"→",ShortUpArrow:"↑",shy:"­",Sigma:"Σ",sigma:"σ",sigmaf:"ς",sigmav:"ς",sim:"∼",simdot:"⩪",sime:"≃",simeq:"≃",simg:"⪞",simgE:"⪠",siml:"⪝",simlE:"⪟",simne:"≆",simplus:"⨤",simrarr:"⥲",slarr:"←",SmallCircle:"∘",smallsetminus:"∖",smashp:"⨳",smeparsl:"⧤",smid:"∣",smile:"⌣",smt:"⪪",smte:"⪬",smtes:"⪬︀",SOFTcy:"Ь",softcy:"ь",sol:"/",solb:"⧄",solbar:"⌿",Sopf:"𝕊",sopf:"𝕤",spades:"♠",spadesuit:"♠",spar:"∥",sqcap:"⊓",sqcaps:"⊓︀",sqcup:"⊔",sqcups:"⊔︀",Sqrt:"√",sqsub:"⊏",sqsube:"⊑",sqsubset:"⊏",sqsubseteq:"⊑",sqsup:"⊐",sqsupe:"⊒",sqsupset:"⊐",sqsupseteq:"⊒",squ:"□",Square:"□",square:"□",SquareIntersection:"⊓",SquareSubset:"⊏",SquareSubsetEqual:"⊑",SquareSuperset:"⊐",SquareSupersetEqual:"⊒",SquareUnion:"⊔",squarf:"▪",squf:"▪",srarr:"→",Sscr:"𝒮",sscr:"𝓈",ssetmn:"∖",ssmile:"⌣",sstarf:"⋆",Star:"⋆",star:"☆",starf:"★",straightepsilon:"ϵ",straightphi:"ϕ",strns:"¯",Sub:"⋐",sub:"⊂",subdot:"⪽",subE:"⫅",sube:"⊆",subedot:"⫃",submult:"⫁",subnE:"⫋",subne:"⊊",subplus:"⪿",subrarr:"⥹",Subset:"⋐",subset:"⊂",subseteq:"⊆",subseteqq:"⫅",SubsetEqual:"⊆",subsetneq:"⊊",subsetneqq:"⫋",subsim:"⫇",subsub:"⫕",subsup:"⫓",succ:"≻",succapprox:"⪸",succcurlyeq:"≽",Succeeds:"≻",SucceedsEqual:"⪰",SucceedsSlantEqual:"≽",SucceedsTilde:"≿",succeq:"⪰",succnapprox:"⪺",succneqq:"⪶",succnsim:"⋩",succsim:"≿",SuchThat:"∋",Sum:"∑",sum:"∑",sung:"♪",Sup:"⋑",sup:"⊃",sup1:"¹",sup2:"²",sup3:"³",supdot:"⪾",supdsub:"⫘",supE:"⫆",supe:"⊇",supedot:"⫄",Superset:"⊃",SupersetEqual:"⊇",suphsol:"⟉",suphsub:"⫗",suplarr:"⥻",supmult:"⫂",supnE:"⫌",supne:"⊋",supplus:"⫀",Supset:"⋑",supset:"⊃",supseteq:"⊇",supseteqq:"⫆",supsetneq:"⊋",supsetneqq:"⫌",supsim:"⫈",supsub:"⫔",supsup:"⫖",swarhk:"⤦",swArr:"⇙",swarr:"↙",swarrow:"↙",swnwar:"⤪",szlig:"ß",Tab:"\t",target:"⌖",Tau:"Τ",tau:"τ",tbrk:"⎴",Tcaron:"Ť",tcaron:"ť",Tcedil:"Ţ",tcedil:"ţ",Tcy:"Т",tcy:"т",tdot:"⃛",telrec:"⌕",Tfr:"𝔗",tfr:"𝔱",there4:"∴",Therefore:"∴",therefore:"∴",Theta:"Θ",theta:"θ",thetasym:"ϑ",thetav:"ϑ",thickapprox:"≈",thicksim:"∼",ThickSpace:"  ",thinsp:" ",ThinSpace:" ",thkap:"≈",thksim:"∼",THORN:"Þ",thorn:"þ",Tilde:"∼",tilde:"˜",TildeEqual:"≃",TildeFullEqual:"≅",TildeTilde:"≈",times:"×",timesb:"⊠",timesbar:"⨱",timesd:"⨰",tint:"∭",toea:"⤨",top:"⊤",topbot:"⌶",topcir:"⫱",Topf:"𝕋",topf:"𝕥",topfork:"⫚",tosa:"⤩",tprime:"‴",TRADE:"™",trade:"™",triangle:"▵",triangledown:"▿",triangleleft:"◃",trianglelefteq:"⊴",triangleq:"≜",triangleright:"▹",trianglerighteq:"⊵",tridot:"◬",trie:"≜",triminus:"⨺",TripleDot:"⃛",triplus:"⨹",trisb:"⧍",tritime:"⨻",trpezium:"⏢",Tscr:"𝒯",tscr:"𝓉",TScy:"Ц",tscy:"ц",TSHcy:"Ћ",tshcy:"ћ",Tstrok:"Ŧ",tstrok:"ŧ",twixt:"≬",twoheadleftarrow:"↞",twoheadrightarrow:"↠",Uacute:"Ú",uacute:"ú",Uarr:"↟",uArr:"⇑",uarr:"↑",Uarrocir:"⥉",Ubrcy:"Ў",ubrcy:"ў",Ubreve:"Ŭ",ubreve:"ŭ",Ucirc:"Û",ucirc:"û",Ucy:"У",ucy:"у",udarr:"⇅",Udblac:"Ű",udblac:"ű",udhar:"⥮",ufisht:"⥾",Ufr:"𝔘",ufr:"𝔲",Ugrave:"Ù",ugrave:"ù",uHar:"⥣",uharl:"↿",uharr:"↾",uhblk:"▀",ulcorn:"⌜",ulcorner:"⌜",ulcrop:"⌏",ultri:"◸",Umacr:"Ū",umacr:"ū",uml:"¨",UnderBar:"_",UnderBrace:"⏟",UnderBracket:"⎵",UnderParenthesis:"⏝",Union:"⋃",UnionPlus:"⊎",Uogon:"Ų",uogon:"ų",Uopf:"𝕌",uopf:"𝕦",UpArrow:"↑",Uparrow:"⇑",uparrow:"↑",UpArrowBar:"⤒",UpArrowDownArrow:"⇅",UpDownArrow:"↕",Updownarrow:"⇕",updownarrow:"↕",UpEquilibrium:"⥮",upharpoonleft:"↿",upharpoonright:"↾",uplus:"⊎",UpperLeftArrow:"↖",UpperRightArrow:"↗",Upsi:"ϒ",upsi:"υ",upsih:"ϒ",Upsilon:"Υ",upsilon:"υ",UpTee:"⊥",UpTeeArrow:"↥",upuparrows:"⇈",urcorn:"⌝",urcorner:"⌝",urcrop:"⌎",Uring:"Ů",uring:"ů",urtri:"◹",Uscr:"𝒰",uscr:"𝓊",utdot:"⋰",Utilde:"Ũ",utilde:"ũ",utri:"▵",utrif:"▴",uuarr:"⇈",Uuml:"Ü",uuml:"ü",uwangle:"⦧",vangrt:"⦜",varepsilon:"ϵ",varkappa:"ϰ",varnothing:"∅",varphi:"ϕ",varpi:"ϖ",varpropto:"∝",vArr:"⇕",varr:"↕",varrho:"ϱ",varsigma:"ς",varsubsetneq:"⊊︀",varsubsetneqq:"⫋︀",varsupsetneq:"⊋︀",varsupsetneqq:"⫌︀",vartheta:"ϑ",vartriangleleft:"⊲",vartriangleright:"⊳",Vbar:"⫫",vBar:"⫨",vBarv:"⫩",Vcy:"В",vcy:"в",VDash:"⊫",Vdash:"⊩",vDash:"⊨",vdash:"⊢",Vdashl:"⫦",Vee:"⋁",vee:"∨",veebar:"⊻",veeeq:"≚",vellip:"⋮",Verbar:"‖",verbar:"|",Vert:"‖",vert:"|",VerticalBar:"∣",VerticalLine:"|",VerticalSeparator:"❘",VerticalTilde:"≀",VeryThinSpace:" ",Vfr:"𝔙",vfr:"𝔳",vltri:"⊲",vnsub:"⊂⃒",vnsup:"⊃⃒",Vopf:"𝕍",vopf:"𝕧",vprop:"∝",vrtri:"⊳",Vscr:"𝒱",vscr:"𝓋",vsubnE:"⫋︀",vsubne:"⊊︀",vsupnE:"⫌︀",vsupne:"⊋︀",Vvdash:"⊪",vzigzag:"⦚",Wcirc:"Ŵ",wcirc:"ŵ",wedbar:"⩟",Wedge:"⋀",wedge:"∧",wedgeq:"≙",weierp:"℘",Wfr:"𝔚",wfr:"𝔴",Wopf:"𝕎",wopf:"𝕨",wp:"℘",wr:"≀",wreath:"≀",Wscr:"𝒲",wscr:"𝓌",xcap:"⋂",xcirc:"◯",xcup:"⋃",xdtri:"▽",Xfr:"𝔛",xfr:"𝔵",xhArr:"⟺",xharr:"⟷",Xi:"Ξ",xi:"ξ",xlArr:"⟸",xlarr:"⟵",xmap:"⟼",xnis:"⋻",xodot:"⨀",Xopf:"𝕏",xopf:"𝕩",xoplus:"⨁",xotime:"⨂",xrArr:"⟹",xrarr:"⟶",Xscr:"𝒳",xscr:"𝓍",xsqcup:"⨆",xuplus:"⨄",xutri:"△",xvee:"⋁",xwedge:"⋀",Yacute:"Ý",yacute:"ý",YAcy:"Я",yacy:"я",Ycirc:"Ŷ",ycirc:"ŷ",Ycy:"Ы",ycy:"ы",yen:"¥",Yfr:"𝔜",yfr:"𝔶",YIcy:"Ї",yicy:"ї",Yopf:"𝕐",yopf:"𝕪",Yscr:"𝒴",yscr:"𝓎",YUcy:"Ю",yucy:"ю",Yuml:"Ÿ",yuml:"ÿ",Zacute:"Ź",zacute:"ź",Zcaron:"Ž",zcaron:"ž",Zcy:"З",zcy:"з",Zdot:"Ż",zdot:"ż",zeetrf:"ℨ",ZeroWidthSpace:"​",Zeta:"Ζ",zeta:"ζ",Zfr:"ℨ",zfr:"𝔷",ZHcy:"Ж",zhcy:"ж",zigrarr:"⇝",Zopf:"ℤ",zopf:"𝕫",Zscr:"𝒵",zscr:"𝓏",zwj:"‍",zwnj:"‌"}},function(e,t,n){"use strict";var r=n(419),o=n(27).unescapeMd;e.exports=function(e,t){var n,i,a,u=t,s=e.posMax;if(60===e.src.charCodeAt(t)){for(t++;t8&&n<14);)if(92===n&&t+11)break;if(41===n&&--i<0)break;t++}return u!==t&&(a=o(e.src.slice(u,t)),!!e.parser.validateLink(a)&&(e.linkContent=a,e.pos=t,!0))}},function(e,t,n){"use strict";var r=n(27).replaceEntities;e.exports=function(e){var t=r(e);try{t=decodeURI(t)}catch(e){}return encodeURI(t)}},function(e,t,n){"use strict";var r=n(27).unescapeMd;e.exports=function(e,t){var n,o=t,i=e.posMax,a=e.src.charCodeAt(t);if(34!==a&&39!==a&&40!==a)return!1;for(t++,40===a&&(a=41);t1?r-1:0),i=1;i1?t-1:0),r=1;r0){var S=a("JsonSchemaForm"),C=a("ParameterExt"),k=w.get("properties",(0,o.OrderedMap)());return n=o.Map.isMap(n)?n:(0,o.OrderedMap)(),r.default.createElement("div",{className:"table-container"},y&&r.default.createElement(h,{source:y}),r.default.createElement("table",null,r.default.createElement("tbody",null,k.map(function(e,t){var u=g?(0,i.getCommonExtensions)(e):null,s=w.get("required",(0,o.List)()).includes(t),c=e.get("type"),p=e.get("format"),v=e.get("description"),m=n.get(t),y=e.get("default")||e.get("example")||"";""===y&&"object"===c&&(y=(0,i.getSampleSchema)(e,!1,{includeWriteOnly:!0})),"string"!=typeof y&&"object"===c&&(y=(0,i.stringify)(y));var b="string"===c&&("binary"===p||"base64"===p);return r.default.createElement("tr",{key:t,className:"parameters","data-property-name":t},r.default.createElement("td",{className:"col parameters-col_name"},r.default.createElement("div",{className:s?"parameter__name required":"parameter__name"},t,s?r.default.createElement("span",{style:{color:"red"}}," *"):null),r.default.createElement("div",{className:"parameter__type"},c,p&&r.default.createElement("span",{className:"prop-format"},"($",p,")"),g&&u.size?u.map(function(e,t){return r.default.createElement(C,{key:t+"-"+e,xKey:t,xVal:e})}):null),r.default.createElement("div",{className:"parameter__deprecated"},e.get("deprecated")?"deprecated":null)),r.default.createElement("td",{className:"col parameters-col_description"},r.default.createElement(h,{source:v}),f?r.default.createElement("div",null,r.default.createElement(S,{fn:l,dispatchInitialValue:!b,schema:e,description:t,getComponent:a,value:void 0===m?y:m,onChange:function(e){d(e,[t])}})):null))}))))}return r.default.createElement("div",null,y&&r.default.createElement(h,{source:y}),r.default.createElement(v,{getComponent:a,getConfigs:u,specSelectors:s,expandDepth:1,isExecute:f,schema:_.get("schema"),specPath:p.push("content",c),example:r.default.createElement(m,{requestBody:t,onChange:d,mediaType:c,getComponent:a,isExecute:f,specSelectors:s})}))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=f(n(41)),o=f(n(4)),i=f(n(2)),a=f(n(3)),u=f(n(5)),s=f(n(6)),l=n(0),c=f(l);f(n(1)),f(n(12));function f(e){return e&&e.__esModule?e:{default:e}}var p=function(e){function t(){return(0,i.default)(this,t),(0,u.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,s.default)(t,e),(0,a.default)(t,[{key:"render",value:function(){var e=this.props,t=e.link,n=e.name,o=(0,e.getComponent)("Markdown"),i=t.get("operationId")||t.get("operationRef"),a=t.get("parameters")&&t.get("parameters").toJS(),u=t.get("description");return c.default.createElement("div",{style:{marginBottom:"1.5em"}},c.default.createElement("div",{style:{marginBottom:".5em"}},c.default.createElement("b",null,c.default.createElement("code",null,n)),u?c.default.createElement(o,{source:u}):null),c.default.createElement("pre",null,"Operation `",i,"`",c.default.createElement("br",null),c.default.createElement("br",null),"Parameters ",function(e,t){if("string"!=typeof t)return"";return t.split("\n").map(function(t,n){return n>0?Array(e+1).join(" ")+t:t}).join("\n")}(0,(0,r.default)(a,null,2))||"{}",c.default.createElement("br",null)))}}]),t}(l.Component);t.default=p},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=c(n(4)),o=c(n(2)),i=c(n(3)),a=c(n(5)),u=c(n(6)),s=c(n(0)),l=n(7);c(n(1)),c(n(12));function c(e){return e&&e.__esModule?e:{default:e}}var f=function(e){function t(){var e,n,i,u;(0,o.default)(this,t);for(var s=arguments.length,l=Array(s),c=0;c=e.length?(this._t=void 0,o(1)):o(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(e,t){e.exports=function(){}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){"use strict";var r=n(160),o=n(95),i=n(97),a={};n(50)(a,n(19)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(a,{next:o(1,n)}),i(e,t+" Iterator")}},function(e,t,n){var r=n(40),o=n(36),i=n(96);e.exports=n(44)?Object.defineProperties:function(e,t){o(e);for(var n,a=i(t),u=a.length,s=0;u>s;)r.f(e,n=a[s++],t[n]);return e}},function(e,t,n){var r=n(71),o=n(115),i=n(455);e.exports=function(e){return function(t,n,a){var u,s=r(t),l=o(s.length),c=i(a,l);if(e&&n!=n){for(;l>c;)if((u=s[c++])!=u)return!0}else for(;l>c;c++)if((e||c in s)&&s[c]===n)return e||c||0;return!e&&-1}}},function(e,t,n){var r=n(161),o=Math.max,i=Math.min;e.exports=function(e,t){return(e=r(e))<0?o(e+t,0):i(e,t)}},function(e,t,n){var r=n(161),o=n(156);e.exports=function(e){return function(t,n){var i,a,u=String(o(t)),s=r(n),l=u.length;return s<0||s>=l?e?"":void 0:(i=u.charCodeAt(s))<55296||i>56319||s+1===l||(a=u.charCodeAt(s+1))<56320||a>57343?e?u.charAt(s):i:e?u.slice(s,s+2):a-56320+(i-55296<<10)+65536}}},function(e,t,n){var r=n(36),o=n(165);e.exports=n(15).getIterator=function(e){var t=o(e);if("function"!=typeof t)throw TypeError(e+" is not iterable!");return r(t.call(e))}},function(e,t,n){n(459),n(245),n(470),n(474),n(485),n(486),e.exports=n(61).Promise},function(e,t,n){"use strict";var r=n(167),o={};o[n(18)("toStringTag")]="z",o+""!="[object z]"&&n(73)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},function(e,t,n){e.exports=!n(100)&&!n(101)(function(){return 7!=Object.defineProperty(n(169)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var r=n(74);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){"use strict";var r=n(463),o=n(244),i=n(171),a={};n(59)(a,n(18)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(a,{next:o(1,n)}),i(e,t+" Iterator")}},function(e,t,n){var r=n(60),o=n(464),i=n(251),a=n(170)("IE_PROTO"),u=function(){},s=function(){var e,t=n(169)("iframe"),r=i.length;for(t.style.display="none",n(252).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" + + + + diff --git a/ygot-modified-files/ygot.patch b/ygot-modified-files/ygot.patch new file mode 100644 index 0000000000..01aaa1a5fb --- /dev/null +++ b/ygot-modified-files/ygot.patch @@ -0,0 +1,752 @@ +diff -ruN ygot-dir-orig/ygot/util/debug.go ygot-dir/ygot/util/debug.go +--- ygot-dir-orig/ygot/util/debug.go 2019-10-24 12:30:06.378629000 -0700 ++++ ygot-dir/ygot/util/debug.go 2019-10-24 12:31:25.059277000 -0700 +@@ -12,6 +12,9 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package util + + import ( +@@ -53,6 +56,14 @@ + fmt.Println(globalIndent + out) + } + ++func IsDebugLibraryEnabled () bool { ++ return debugLibrary ++} ++ ++func IsDebugSchemaEnabled () bool { ++ return debugSchema ++} ++ + // DbgSchema prints v if the package global variable debugSchema is set. + // v has the same format as Printf. + func DbgSchema(v ...interface{}) { +@@ -177,6 +188,9 @@ + + // YangTypeToDebugString returns a debug string representation of a YangType. + func YangTypeToDebugString(yt *yang.YangType) string { ++ if !debugLibrary { ++ return "" ++ } + out := fmt.Sprintf("(TypeKind: %s", yang.TypeKindToName[yt.Kind]) + if len(yt.Pattern) != 0 { + out += fmt.Sprintf(", Pattern: %s", strings.Join(yt.Pattern, " or ")) +diff -ruN ygot-dir-orig/ygot/util/reflect.go ygot-dir/ygot/util/reflect.go +--- ygot-dir-orig/ygot/util/reflect.go 2019-10-24 12:30:06.403914000 -0700 ++++ ygot-dir/ygot/util/reflect.go 2019-10-24 12:31:25.063424000 -0700 +@@ -12,6 +12,9 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package util + + import ( +@@ -196,8 +199,10 @@ + + // InsertIntoMap inserts value with key into parent which must be a map. + func InsertIntoMap(parentMap interface{}, key interface{}, value interface{}) error { +- DbgPrint("InsertIntoMap into parent type %T with key %v(%T) value \n%s\n (%T)", +- parentMap, ValueStrDebug(key), key, pretty.Sprint(value), value) ++ if debugLibrary { ++ DbgPrint("InsertIntoMap into parent type %T with key %v(%T) value \n%s\n (%T)", ++ parentMap, ValueStrDebug(key), key, pretty.Sprint(value), value) ++ } + + v := reflect.ValueOf(parentMap) + t := reflect.TypeOf(parentMap) +@@ -288,7 +293,7 @@ + n = reflect.Zero(ft.Type) + } + +- if !isFieldTypeCompatible(ft, n) { ++ if !isFieldTypeCompatible(ft, n) && !IsValueTypeCompatible(ft.Type, v) { + return fmt.Errorf("cannot assign value %v (type %T) to struct field %s (type %v) in struct %T", fieldValue, fieldValue, fieldName, ft.Type, parentStruct) + } + +diff -ruN ygot-dir-orig/ygot/util/schema.go ygot-dir/ygot/util/schema.go +--- ygot-dir-orig/ygot/util/schema.go 2019-10-24 12:30:06.417942000 -0700 ++++ ygot-dir/ygot/util/schema.go 2019-10-24 12:31:25.069042000 -0700 +@@ -12,6 +12,9 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package util + + import ( +@@ -22,6 +25,8 @@ + "github.com/openconfig/goyang/pkg/yang" + ) + ++var schemaPathCache map[reflect.StructTag][][]string = make(map[reflect.StructTag][][]string) ++ + // IsLeafRef reports whether schema is a leafref schema node type. + func IsLeafRef(schema *yang.Entry) bool { + if schema == nil || schema.Type == nil { +@@ -68,17 +73,22 @@ + + // SchemaPaths returns all the paths in the path tag. + func SchemaPaths(f reflect.StructField) ([][]string, error) { +- var out [][]string +- pathTag, ok := f.Tag.Lookup("path") +- if !ok || pathTag == "" { +- return nil, fmt.Errorf("field %s did not specify a path", f.Name) +- } +- +- ps := strings.Split(pathTag, "|") +- for _, p := range ps { +- out = append(out, StripModulePrefixes(strings.Split(p, "/"))) ++ if tmpOut, ok := schemaPathCache[f.Tag]; ok { ++ return tmpOut, nil ++ } else { ++ var out [][]string ++ pathTag, ok := f.Tag.Lookup("path") ++ if !ok || pathTag == "" { ++ return nil, fmt.Errorf("field %s did not specify a path", f.Name) ++ } ++ ++ ps := strings.Split(pathTag, "|") ++ for _, p := range ps { ++ out = append(out, StripModulePrefixes(strings.Split(p, "/"))) ++ } ++ schemaPathCache[f.Tag] = out ++ return out, nil + } +- return out, nil + } + + // ChildSchema returns the first child schema that matches path from the given +@@ -233,7 +243,9 @@ + found := true + DbgSchema("traversing schema Dirs...") + for ; len(p) > 0; p = p[1:] { +- DbgSchema("/%s", p[0]) ++ if IsDebugSchemaEnabled() { ++ DbgSchema("/%s", p[0]) ++ } + var ok bool + s, ok = s.Dir[p[0]] + if !ok { +@@ -261,10 +273,13 @@ + return nil, nil + } + entries := FindFirstNonChoiceOrCase(schema) +- +- DbgSchema("checking for %s against non choice/case entries: %v\n", p[0], stringMapKeys(entries)) ++ if IsDebugSchemaEnabled() { ++ DbgSchema("checking for %s against non choice/case entries: %v\n", p[0], stringMapKeys(entries)) ++ } + for pe, entry := range entries { +- DbgSchema("%s ? ", pe) ++ if IsDebugSchemaEnabled() { ++ DbgSchema("%s ? ", pe) ++ } + if pe == p[0] { + DbgSchema(" - match\n") + return entry, nil +diff -ruN ygot-dir-orig/ygot/ytypes/container.go ygot-dir/ygot/ytypes/container.go +--- ygot-dir-orig/ygot/ytypes/container.go 2019-10-24 12:30:07.700737000 -0700 ++++ ygot-dir/ygot/ytypes/container.go 2019-10-24 12:31:26.682226000 -0700 +@@ -12,12 +12,15 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package ytypes + + import ( + "fmt" + "reflect" +- ++ + "github.com/kylelemons/godebug/pretty" + "github.com/openconfig/goyang/pkg/yang" + "github.com/openconfig/ygot/util" +@@ -71,7 +74,7 @@ + if errs := Validate(cschema, fieldValue); errs != nil { + errors = util.AppendErrs(errors, util.PrefixErrors(errs, cschema.Path())) + } +- case !util.IsValueNilOrDefault(structElems.Field(i).Interface()): ++ case !structElems.Field(i).IsNil(): + // Either an element in choice schema subtree, or bad field. + // If the former, it will be found in the choice check below. + extraFields[fieldName] = nil +@@ -217,7 +220,10 @@ + } + } + +- util.DbgPrint("container after unmarshal:\n%s\n", pretty.Sprint(destv.Interface())) ++ if util.IsDebugLibraryEnabled() { ++ util.DbgPrint("container after unmarshal:\n%s\n", pretty.Sprint(destv.Interface())) ++ } ++ + return nil + } + +diff -ruN ygot-dir-orig/ygot/ytypes/leaf.go ygot-dir/ygot/ytypes/leaf.go +--- ygot-dir-orig/ygot/ytypes/leaf.go 2019-10-24 12:30:07.705496000 -0700 ++++ ygot-dir/ygot/ytypes/leaf.go 2019-10-24 12:31:26.691433000 -0700 +@@ -12,6 +12,9 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package ytypes + + import ( +@@ -79,7 +82,7 @@ + + switch ykind { + case yang.Ybinary: +- return util.NewErrs(validateBinary(schema, value)) ++ return util.NewErrs(validateBinary(schema, rv)) + case yang.Ybits: + return nil + // TODO(mostrowski): restore when representation is decided. +@@ -252,7 +255,7 @@ + // during validation against each matching schema otherwise. + func validateMatchingSchemas(schema *yang.Entry, value interface{}) util.Errors { + var errors []error +- ss := findMatchingSchemasInUnion(schema.Type, value) ++ ss := findMatchingSchemasInUnion(schema, schema.Type, value) + var kk []yang.TypeKind + for _, s := range ss { + kk = append(kk, s.Type.Kind) +@@ -283,17 +286,25 @@ + // findMatchingSchemasInUnion returns all schemas in the given union type, + // including those within nested unions, that match the Go type of value. + // value must not be nil. +-func findMatchingSchemasInUnion(ytype *yang.YangType, value interface{}) []*yang.Entry { ++func findMatchingSchemasInUnion(schema *yang.Entry, ytype *yang.YangType, value interface{}) []*yang.Entry { + var matches []*yang.Entry + + util.DbgPrint("findMatchingSchemasInUnion for type %T, kind %s", value, reflect.TypeOf(value).Kind()) + for _, t := range ytype.Type { + if t.Kind == yang.Yunion { + // Recursively check all union types within this union. +- matches = append(matches, findMatchingSchemasInUnion(t, value)...) ++ matches = append(matches, findMatchingSchemasInUnion(schema, t, value)...) + continue + } + ++ if t.Kind == yang.Yleafref { ++ ns, err := findLeafRefSchema(schema, t.Path) ++ if err != nil { ++ log.Warningf("not found base Go type for type %v in union value %s", t.Kind, util.ValueStr(value)) ++ continue ++ } ++ t = ns.Type ++ } + ybt := yangBuiltinTypeToGoType(t.Kind) + if reflect.ValueOf(value).Kind() == reflect.Ptr { + ybt = ygot.ToPtr(yangBuiltinTypeToGoType(t.Kind)) +@@ -418,12 +429,10 @@ + return nil + } + +-// YANGEmpty is a derived type which is used to represent the YANG empty type. ++// YANGEmpty is a derived type which is used to represent the YANG ++// empty type. + type YANGEmpty bool + +-// Binary is a derived type which is used to represent the YANG binary type. +-type Binary []byte +- + // unmarshalLeaf unmarshals a scalar value (determined by json.Unmarshal) into + // the parent containing the leaf. + // schema points to the schema for the leaf type. +@@ -720,7 +729,9 @@ + return nil, fmt.Errorf("%s ΛEnumTypes function returned wrong type %T, want map[string][]reflect.Type", t, ei) + } + +- util.DbgPrint("path is %s for schema %s", absoluteSchemaDataPath(schema), schema.Name) ++ if util.IsDebugLibraryEnabled() { ++ util.DbgPrint("path is %s for schema %s", absoluteSchemaDataPath(schema), schema.Name) ++ } + + return enumTypesMap[absoluteSchemaDataPath(schema)], nil + } +diff -ruN ygot-dir-orig/ygot/ytypes/list.go ygot-dir/ygot/ytypes/list.go +--- ygot-dir-orig/ygot/ytypes/list.go 2019-10-24 12:30:07.712731000 -0700 ++++ ygot-dir/ygot/ytypes/list.go 2019-10-24 12:31:26.696852000 -0700 +@@ -12,6 +12,9 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package ytypes + + import ( +@@ -217,6 +220,9 @@ + if len(schema.Key) == 0 { + return fmt.Errorf("list %s with config set must have a key", schema.Name) + } ++ if schema.IsSchemaValidated == true { ++ return nil ++ } + keys := strings.Split(schema.Key, " ") + keysMissing := make(map[string]bool) + for _, v := range keys { +@@ -232,6 +238,7 @@ + } + } + ++ schema.IsSchemaValidated = true + return nil + } + +@@ -282,10 +289,10 @@ + if util.IsValueNil(jsonList) { + return nil + } +- // Check that the schema itself is valid. ++ + if err := validateListSchema(schema); err != nil { + return err +- } ++ } + + util.DbgPrint("unmarshalList jsonList %v, type %T, into parent type %T, schema name %s", util.ValueStrDebug(jsonList), jsonList, parent, schema.Name) + +@@ -350,7 +357,9 @@ + return err + } + } +- util.DbgPrint("list after unmarshal:\n%s\n", pretty.Sprint(parent)) ++ if util.IsDebugLibraryEnabled() { ++ util.DbgPrint("list after unmarshal:\n%s\n", pretty.Sprint(parent)) ++ } + + return nil + } +@@ -388,17 +397,96 @@ + if err != nil { + return err + } +- + fv := val.Elem().FieldByName(fn) + ft := fv.Type() + if util.IsValuePtr(fv) { + ft = ft.Elem() + } +- +- nv, err := StringToType(ft, fieldVal) ++ sf, ok := val.Elem().Type().FieldByName(fn) ++ if ok == false { ++ return fmt.Errorf("Field %s not present in the struct %s", fn, val.Elem()) ++ } ++ cschema, err := childSchema(schema, sf) + if err != nil { + return err + } ++ keyLeafKind := cschema.Type.Kind ++ if keyLeafKind == yang.Yleafref { ++ lrfschema, err := resolveLeafRef(cschema) ++ if err != nil { ++ return err ++ } ++ keyLeafKind = lrfschema.Type.Kind ++ } ++ ++ var nv reflect.Value ++ if keyLeafKind == yang.Yunion && strings.HasSuffix(keyT.Name(), "_Union") { ++ sks, err := getUnionKindsNotEnums(cschema) ++ if err != nil { ++ return err ++ } ++ for _, sk := range sks { ++ gv, err := StringToType(reflect.TypeOf(yangBuiltinTypeToGoType(sk)), fieldVal) ++ if err == nil { ++ mn := "To_" + ft.Name() ++ mapMethod := val.MethodByName(mn) ++ if !mapMethod.IsValid() { ++ return fmt.Errorf("%s does not have a %s function", val, mn) ++ } ++ ec := mapMethod.Call([]reflect.Value{gv}) ++ if len(ec) != 2 { ++ return fmt.Errorf("%s %s function returns %d params", ft.Name(), mn, len(ec)) ++ } ++ ei := ec[0].Interface() ++ ee := ec[1].Interface() ++ if ee != nil { ++ return fmt.Errorf("unmarshaled %v type %T does not have a union type: %v", fieldVal, fieldVal, ee) ++ } ++ nv = reflect.ValueOf(ei) ++ break ++ } ++ } ++ ++ if nv.IsValid() == false { ++ ets, err := schemaToEnumTypes(cschema, elmT) ++ if err != nil { ++ return err ++ } ++ for _, et := range ets { ++ ev, err := castToEnumValue(et, fieldVal) ++ if err != nil { ++ return err ++ } ++ if ev != nil { ++ mn := "To_" + ft.Name() ++ mapMethod := val.MethodByName(mn) ++ if !mapMethod.IsValid() { ++ return fmt.Errorf("%s does not have a %s function", val, mn) ++ } ++ ec := mapMethod.Call([]reflect.Value{reflect.ValueOf(ev)}) ++ if len(ec) != 2 { ++ return fmt.Errorf("%s %s function returns %d params", ft.Name(), mn, len(ec)) ++ } ++ ei := ec[0].Interface() ++ ee := ec[1].Interface() ++ if ee != nil { ++ return fmt.Errorf("unmarshaled %v type %T does not have a union type: %v", fieldVal, fieldVal, ee) ++ } ++ nv = reflect.ValueOf(ei) ++ break ++ } ++ fmt.Errorf("could not unmarshal %v into enum type: %s\n", fieldVal, err) ++ } ++ if nv.IsValid() == false { ++ return fmt.Errorf("could not create the value type for the field name %s with the value %s", fn, fieldVal) ++ } ++ } ++ } else { ++ nv, err = StringToType(ft, fieldVal) ++ if err != nil { ++ return err ++ } ++ } + return util.InsertIntoStruct(val.Interface(), fn, nv.Interface()) + } + +@@ -494,6 +582,9 @@ + } + + // TODO(yusufsn): When the key is a leafref, its target should be filled out. ++ if (len(keys) == 0) { ++ return nil, nil ++ } + mapVal, err := makeValForInsert(schema, root, keys) + if err != nil { + return nil, fmt.Errorf("failed to create map value for insert, root %T, keys %v: %v", root, keys, err) +diff -ruN ygot-dir-orig/ygot/ytypes/node.go ygot-dir/ygot/ytypes/node.go +--- ygot-dir-orig/ygot/ytypes/node.go 2019-10-24 12:30:07.727365000 -0700 ++++ ygot-dir/ygot/ytypes/node.go 2019-10-24 12:31:26.701328000 -0700 +@@ -12,17 +12,19 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package ytypes + + import ( +- "reflect" +- + "github.com/golang/protobuf/proto" + "github.com/openconfig/goyang/pkg/yang" + "github.com/openconfig/ygot/util" + "github.com/openconfig/ygot/ygot" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ++ "reflect" + + gpb "github.com/openconfig/gnmi/proto/gnmi" + ) +@@ -129,6 +131,16 @@ + if err := util.InitializeStructField(root, ft.Name); err != nil { + return nil, status.Errorf(codes.Unknown, "failed to initialize struct field %s in %T, child schema %v, path %v", ft.Name, root, cschema, path) + } ++ ++ if cschema.IsLeaf() || cschema.IsLeafList() { ++ if len(path.Elem) == 1 && len(path.Elem[0].Key) == 1 { ++ var vals []string ++ vals = append(vals, path.Elem[0].Key[path.Elem[0].Name]) ++ if args.val, err = ygot.EncodeTypedValue(vals, gpb.Encoding_JSON_IETF); err != nil { ++ return nil, status.Errorf(codes.Unknown, "failed to get the typed value '%v' for leaf/leaf-list => %s in %T ; because of %v", vals, ft.Name, root, err) ++ } ++ } ++ } + } + + // If val in args is set to a non-nil value and the path is exhausted, we +@@ -286,6 +298,11 @@ + if err != nil { + return nil, err + } ++ ++ if (key == nil) { ++ return []*TreeNode{{Path: traversedPath,Schema: schema,Data: root,}}, nil ++ } ++ + nodes, err := retrieveNode(schema, rv.MapIndex(reflect.ValueOf(key)).Interface(), util.PopGNMIPath(path), appendElem(traversedPath, path.GetElem()[0]), args) + if err != nil { + return nil, err +diff -ruN ygot-dir-orig/ygot/ytypes/string_type.go ygot-dir/ygot/ytypes/string_type.go +--- ygot-dir-orig/ygot/ytypes/string_type.go 2019-10-24 12:30:07.734288000 -0700 ++++ ygot-dir/ygot/ytypes/string_type.go 2019-10-24 12:31:26.705649000 -0700 +@@ -12,6 +12,9 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package ytypes + + import ( +@@ -23,6 +26,8 @@ + "github.com/openconfig/goyang/pkg/yang" + ) + ++var regexpCache map[string]*regexp.Regexp = make(map[string]*regexp.Regexp) ++ + // Refer to: https://tools.ietf.org/html/rfc6020#section-9.4. + + // validateString validates value, which must be a Go string type, against the +@@ -48,10 +53,18 @@ + + // Check that the value satisfies any regex patterns. + for _, p := range schema.Type.Pattern { +- r, err := regexp.Compile(fixYangRegexp(p)) +- if err != nil { +- return err ++ var r *regexp.Regexp ++ if val, ok := regexpCache[p]; ok { ++ r = val ++ } else { ++ var err error ++ r, err = regexp.Compile(fixYangRegexp(p)) ++ if err != nil { ++ return err ++ } ++ regexpCache[p] = r + } ++ + // fixYangRegexp adds ^(...)$ around the pattern - the result is + // equivalent to a full match of whole string. + if !r.MatchString(stringVal) { +@@ -105,13 +118,29 @@ + return fmt.Errorf("string schema %s has wrong type %v", schema.Name, schema.Type.Kind) + } + ++ if schema.IsSchemaValidated { ++ return nil ++ } ++ ++ var err error ++ + for _, p := range schema.Type.Pattern { +- if _, err := regexp.Compile(fixYangRegexp(p)); err != nil { +- return fmt.Errorf("error generating regexp %s %v for schema %s", p, err, schema.Name) +- } ++ _, ok := regexpCache[p] ++ if (ok == false) { ++ var r *regexp.Regexp ++ if r, err = regexp.Compile(fixYangRegexp(p)); err != nil { ++ return fmt.Errorf("error generating regexp %s %v for schema %s", p, err, schema.Name) ++ } else { ++ regexpCache[p] = r ++ } ++ } + } + +- return validateLengthSchema(schema) ++ if err = validateLengthSchema(schema); err == nil { ++ schema.IsSchemaValidated = true ++ } ++ ++ return err + } + + // fixYangRegexp takes a pattern regular expression from a YANG module and +diff -ruN ygot-dir-orig/ygot/ytypes/unmarshal.go ygot-dir/ygot/ytypes/unmarshal.go +--- ygot-dir-orig/ygot/ytypes/unmarshal.go 2019-10-24 12:30:07.753024000 -0700 ++++ ygot-dir/ygot/ytypes/unmarshal.go 2019-10-24 12:31:26.710027000 -0700 +@@ -12,6 +12,9 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package ytypes + + import ( +@@ -73,7 +76,10 @@ + if schema == nil { + return fmt.Errorf("nil schema for parent type %T, value %v (%T)", parent, value, value) + } +- util.DbgPrint("Unmarshal value %v, type %T, into parent type %T, schema name %s", util.ValueStrDebug(value), value, parent, schema.Name) ++ ++ if (util.IsDebugLibraryEnabled()) { ++ util.DbgPrint("Unmarshal value %v, type %T, into parent type %T, schema name %s", util.ValueStrDebug(value), value, parent, schema.Name) ++ } + + if enc == GNMIEncoding && !(schema.IsLeaf() || schema.IsLeafList()) { + return errors.New("unmarshalling a non leaf node isn't supported in GNMIEncoding mode") +diff -ruN ygot-dir-orig/ygot/ytypes/util_schema.go ygot-dir/ygot/ytypes/util_schema.go +--- ygot-dir-orig/ygot/ytypes/util_schema.go 2019-10-24 12:30:07.763728000 -0700 ++++ ygot-dir/ygot/ytypes/util_schema.go 2019-10-24 12:31:26.715104000 -0700 +@@ -12,6 +12,9 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package ytypes + + import ( +@@ -23,6 +26,8 @@ + "github.com/openconfig/ygot/util" + ) + ++var pathToSchemaCache map[reflect.StructTag][]string = make(map[reflect.StructTag][]string) ++ + // validateLengthSchema validates whether the given schema has a valid length + // specification. + func validateLengthSchema(schema *yang.Entry) error { +@@ -137,8 +142,16 @@ + // if the struct tag is invalid, or nil if tag is valid but the schema is not + // found in the tree at the specified path. + func childSchema(schema *yang.Entry, f reflect.StructField) (*yang.Entry, error) { +- pathTag, _ := f.Tag.Lookup("path") +- util.DbgSchema("childSchema for schema %s, field %s, tag %s\n", schema.Name, f.Name, pathTag) ++ if (schema.ChildSchemaCache == nil) { ++ schema.ChildSchemaCache = make(map[reflect.StructTag]*yang.Entry) ++ } else if cschema, ok := schema.ChildSchemaCache[f.Tag]; ok { ++ return cschema, nil ++ } ++ ++ if util.IsDebugSchemaEnabled() { ++ pathTag, _ := f.Tag.Lookup("path") ++ util.DbgSchema("childSchema for schema %s, field %s, tag %s\n", schema.Name, f.Name, pathTag) ++ } + p, err := pathToSchema(f) + if err != nil { + return nil, err +@@ -168,6 +181,7 @@ + } + if foundSchema { + util.DbgSchema(" - found\n") ++ schema.ChildSchemaCache[f.Tag] = childSchema + return childSchema, nil + } + util.DbgSchema(" - not found\n") +@@ -183,21 +197,25 @@ + // path element i.e. choice1/case1/leaf1 path in the schema will have + // struct tag `path:"leaf1"`. This implies that only paths with length + // 1 are eligible for this matching. ++ schema.ChildSchemaCache[f.Tag] = nil + return nil, nil + } + entries := util.FindFirstNonChoiceOrCase(schema) +- +- util.DbgSchema("checking for %s against non choice/case entries: %v\n", p[0], stringMapKeys(entries)) ++ if util.IsDebugSchemaEnabled() { ++ util.DbgSchema("checking for %s against non choice/case entries: %v\n", p[0], stringMapKeys(entries)) ++ } + for name, entry := range entries { + util.DbgSchema("%s ? ", name) + + if util.StripModulePrefix(name) == p[0] { + util.DbgSchema(" - match\n") ++ schema.ChildSchemaCache[f.Tag] = entry + return entry, nil + } + } + + util.DbgSchema(" - no matches\n") ++ schema.ChildSchemaCache[f.Tag] = nil + return nil, nil + } + +@@ -239,25 +257,32 @@ + // leafref. In the latter case, this function returns {"config", "a"}, and the + // schema *yang.Entry for the field is given by schema.Dir["config"].Dir["a"]. + func pathToSchema(f reflect.StructField) ([]string, error) { +- pathAnnotation, ok := f.Tag.Lookup("path") +- if !ok { +- return nil, fmt.Errorf("field %s did not specify a path", f.Name) +- } +- +- paths := strings.Split(pathAnnotation, "|") +- if len(paths) == 1 { +- pathAnnotation = strings.TrimPrefix(pathAnnotation, "/") +- return strings.Split(pathAnnotation, "/"), nil +- } +- for _, pv := range paths { +- pv = strings.TrimPrefix(pv, "/") +- pe := strings.Split(pv, "/") +- if len(pe) > 1 { ++ if pe, ok := pathToSchemaCache[f.Tag]; ok { ++ return pe, nil ++ } else { ++ pathAnnotation, ok := f.Tag.Lookup("path") ++ if !ok { ++ return nil, fmt.Errorf("field %s did not specify a path", f.Name) ++ } ++ ++ paths := strings.Split(pathAnnotation, "|") ++ if len(paths) == 1 { ++ pathAnnotation = strings.TrimPrefix(pathAnnotation, "/") ++ pe := strings.Split(pathAnnotation, "/") ++ pathToSchemaCache[f.Tag] = pe + return pe, nil + } ++ for _, pv := range paths { ++ pv = strings.TrimPrefix(pv, "/") ++ pe := strings.Split(pv, "/") ++ if len(pe) > 1 { ++ pathToSchemaCache[f.Tag] = pe ++ return pe, nil ++ } ++ } ++ ++ return nil, fmt.Errorf("field %s had path tag %s with |, but no elements of form a/b", f.Name, pathAnnotation) + } +- +- return nil, fmt.Errorf("field %s had path tag %s with |, but no elements of form a/b", f.Name, pathAnnotation) + } + + // directDescendantSchema returns the direct descendant schema for the struct +diff -ruN ygot-dir-orig/ygot/ytypes/validate.go ygot-dir/ygot/ytypes/validate.go +--- ygot-dir-orig/ygot/ytypes/validate.go 2019-10-24 12:30:07.778829000 -0700 ++++ ygot-dir/ygot/ytypes/validate.go 2019-10-24 12:31:26.719650000 -0700 +@@ -12,6 +12,9 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// This file is changed by Broadcom. ++// Modifications - Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. ++ + package ytypes + + import ( +@@ -74,7 +77,7 @@ + errs = ValidateLeafRefData(schema, value, leafrefOpt) + } + +- util.DbgPrint("Validate with value %v, type %T, schema name %s", util.ValueStr(value), value, schema.Name) ++ util.DbgPrint("Validate with value %v, type %T, schema name %s", util.ValueStrDebug(value), value, schema.Name) + + switch { + case schema.IsLeaf():

drR*QBVh3H@tlv(~!0jXKmXW7W+xa;AfR6B_fMa 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�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ʽ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 z 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%0A^C%$Ieg^8GLfq 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�@iG{(Ug049rb*C?&h%#=fgSwl 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%0DP9%)AfB!Y`MY zI9zt^bGL+1;VdFxF%k0`>5IjAl~0cjpE@E7&=JToK!freZvNyWs z`=51FXfd9Zp%Rd!59x1lq}ZURBCP^OHX(dg4}UCnk+urBBns>Me{Jn-EBYFpy~~_0 z{mAp}q2_!^$&2pbXxP`N>BI<)-N!4(JW$h1QMK%WyH|>3*(og*58h;MC8`yUOHN2+@%2;F43W%Z#u403s@bW#ld~0Wq{&NYb_})L<)iA9+rk7;J znROGJ_)L>%)!t|(x8&V?=0xNgXN z^yg~ToAn;5n_m%_?T7+rIxh9>;yW$rYZj#7c%L8}iv~>4^|u{W7D9wKzd-o@06AgI zXWJiqoA&P%q7aD(#uqv2QP(y+YA?xwQH@WgVVSA0--;MSt`#&&HdW@a`N{JtsX;B9 zei~MrG=Iw3Fu3ih5?6&Ip4X%>nRhKk|9o2w%a5>|K%Wr;2tN9}cjT7|eg?YDb~VcI z2zfcX1P!t&FN+6TheWx1Uw+k%BWB(je50RJX`{QDXT7NF0T1~T(`Luo)Vho@_}Sbp z)K%WeD4sicd|go@@ygxML8Pkd>fO}&JM+i)P?5g7%M#%nADE8YtC+ZqvE5F;S5KSn zR;$3ze5v$BH9Pge_CJ&8dyqdwZY%iajrJ~gKE`p(?t3}ypYdc@|KcBT3uds#=P zQ+{k)TkSj^fBei2#|53>DlF^}nzR(IG;KkBJRh7Adt;pL+8=ytO0sy7d9XsC8ae0G z>W*qvy{smfCFyEt@;9La{QG7=pH-U;s@wIQ5H4n~DpnrYikK7FcM_osEPcV{`s;3M zW0)~8LJ*VF4-G7LQZ3DNClTqhcKJ};$<`}6I4hdWO3^f{D%LUk7ny=PzI$PN3c8wM z-=)Gz)Ff`2#p8wH=)V=oK4`Zw%ykaMhKb%(v#1w|{|PNY&(ATr^d)m7#ld*HcX~SI zW@mdCQF#6w7sA2I-c4q@&Xr%K-ILnC=bO1&#vgq&wNRU@fb>noS{2X^N|m?S@+Y*!Lf_guiyT0DrVC$se}S}tH1IYIVW9mcV*hX zEM1WudR>p;QQH)lfwEq2WmsP~nyP;f*JJXRu+34nBDylkfKtPWE;2)QH5ElFB@~ zD*(o}RUJeM=7C{UhO7^fw*2D?f)Xd3YzHcaD;zxB5AGw{+x;#k<4&5bxW4)A%VzME z67>w)?nN69t+JaebqZ#)wzi1A7e?IxcsY(3T5CDieBumDi^1#U+M^?Xdwem4(~yb2 zWyTen(%Rk}=S~@TnuMF99i;U%)67w{!ovUY#CIp5GkUZgvTNsskk3E&TR`Z=^cn4> z3-JZ3_MH3_nRRyeaC788+ugCwpVGF@W14hw8XF#c7`q?4=Y)wu;u?wT#`3ly`+%6Y zhEhk=8uZ~E&rC`fCF=zbR$^>u?EPr(?c3u=OsMO;>hVhpZJ|Fz5EvRu4IwYuFJ*1? z<8f?sGx22hn>dBWBqC_K04FLfOz$UMri2j3LwGOv+2mv72#zg9)-bk+4z3P@_9cnsI*gi`O}it@@bDZ)qwpJJIx}%oT6vnz#UIfdf_Mv!}&lnafN=%Vls)` zxgmW}HO;a+8b(3DVPOq6GA+ec@+~YUUp_6H+pH+V`~tIZSbBvP>?qzNwdaYuQIg`M z?EAslz&GBj91HH)PfRBS4xGCT^xn39nVCL;>=7`Q?#jOO@EEK>Yj&ft1MwiELK9*kP%Zfi?fxi_9sYr!^j>`b`)-I`kACy^T56}(|Wps5dsAJmEX zuO4GP2-$S3E8Wk%V%Nfi<$ATf){eo_Y(dL$qQFT!yfovT4o3HP!w4)VGj@mtX8ZD^ zX2uAmMK&^17d~C172EJ}7#I|Db3cl)Ln0Lv_9yCn_}(}ZDlwsdJy$1KlT+8N-~Uo< z3ZycT4V2XDgo=m-Bxp1ElOv`VZHLRNxn&imP<$&}`9VlIDuB=1hCXn^Jyjv7AWvQ- zr#*MyaoOC$xvVtw4O+;vA_Md`Z(tjiv!K50R`C9sVofZf$ANlo+V?C(nYp3|CpSd54I*6f#ZcocJ_N0 zbP^nn0tJvU&3cyWSHI=BHQM-4&RM3sOlrRW`>jNuEj${SNu~y~toGSQD`H`uga3@6}f3M%+aaQzE^s zwYjk3f~}ghIaJ09_PmwcTYF!QmJ8bv{VvBXrs*#_E_%)Le$`b&I@6!1G5sr(YSv_k ze;E|_?S=iO+`v%0_pKsul{AQ!TlLCW;_gMea*GK-?>^HvSYaBKT4TMCWbmM5L1TX` z5}=o|VlS;7Nw0xPG95WRt+qz|a%b=d-H|p; z{i1L6!s56Fxj=-KA)Xu0WR(O#Wlp})tJ21J-@P_p-#gTc&Rr>vcJqb3g81_uINZ|E zvC@s-(z;Av+Rpi!x(Cr&KjDFm(=Q>J@KSURlN@HEJC2sM0ncxUD+^E!@XqTwxk}#T z$*4-<@iWK=`ug$15$c{#EeiaQhi;QY8i_%Fy75M{nUBizY*^!gK4R2qladSMH5APF z_(Q&rnS1m`F2*b?UqS-fDz_-6rKg0Nx9fXE_`7RczwQ>psp;2 z2&=Nv;zVVl`i;t~qOZCF4FL}!ol?oL%%{txgij|A#)$Fb^L;9?QSmJsnQ71N#wzY{-?}N<_JDMKF(J)El7{|D-Lv3QP*6&b3-k)>U zek5)&gr_%Cw-%JCymB1$ne8KSl4svgh<2{UIb|X-5?hF(*n^u8PLD&$p^{m7l!_ge z8@jM-f)Q~%9@j#zHp+}$vn@!I$T!m(0>YxOA)PQt2OrHC#N%%9^RTR7Rn{1k&j6c3 za}|pV&=&DcOPdW?Y=qJ~62`XR6>2v}bC!c$^`)*IzM^T~{z%r}q!xcDMYS{b1>S=?Hgi)Cp)#xE9sXu-KJgUKmYEL=jxs8gi_h*S&+kE z=FehioZ-X6Cf9LJ0$pC-GXf>zlTKYXrl6dNlhJjYh+K+rMSlNdV>ek^Sfj^ z4eMN#G;gi;1k#U~g?k&5Z_Hgv(fyas!_dn9;QJsw*#3UlRSIS0yc0mWWd;-cM5(l? z1$|kq`g2?F<&g@(ecaQrcHH^ZlBA85@aF9uJCT(^ik0Es1M`T1?u=Z%MVYLDy@+sa zSEItkC8+er@<&XGqi_$qa7Eq*S1E|?{%O`HS<)Q$TK(P*%4hc*&E&?Dhi` z(nr@hT8crF5yMLgg=k=<9rN#dts(s)0_3J7BH?V~-@RH-?YJ)>mM{sR$zF;E*@1nQEh8K{-ktAHNOHk`C&z%G%tOP|IXIzxJ zF8*RkfoebUu<1V|zXixsRk*wF;vp5XPjQ@flsPdrG z9gFUb`kDSUOWtRVP=eCZ6i{JoTX=|?dpM0 z?xp}h1Ph&Di#*f(waqwr@Z<&#vBd`-h5AXffVsol)`3Qy0{k6i2%BfLf@@a!rZwXyc$ixb%a z&=$g?9>Yaqyq5QK1xs;u+W%KHTA;t9LZE7}XNRn(>%@V=nsH){pfMQyZ>8y9=Bucg z5U+@=D9*^kH@jWEzroD5JvCNan)2!wYgPi#)@Tz@NKW#&BJm3V0$7}AJhp%l;=bV3 z{CnpA$O0LI>PM#mG=K^t0_ibSgvo2AKg)kA8!zLjZ8LGKE9|ME5lLZRU4ckpBc@GS z*rMn*dCcJfQBoM-eIV}(>v;VyQ)*wfCF9UIfK;cE=7lJ3;KBl|_z^yBqecRJ!2!hm z47O5eyVm$7dDFj@lbk_0`;l~R8STq~p~GN5z9y)TT$AY$KiYTTMGeu0+{st8iT ziRW6t1}Sk~UE#!I*VElF#Us%kH4+jz|2)uqJF76y^zf=qa5yfy3XqF5p}D*N>Qn)93Gc%zPNyt z7P)C>br+y&aB>2rRI=k*y{{|_3Limg$O&qq5Qflp@zv2~j{WCXB0z*e5(5c+~u-oFCFV~jgsP8^iU!?M{hrgNKdk6LMu z`2WNRz(((g#Ne}r*mj<}7U_JBP%C<%w44!DFdL)(wdIoiXME~B;3D|x-F&sH(8Jg@H$S7*QVKA;UHm9onT_PJ~zBTw3@z9(#uyqB`&&sjn ze*EL-teNWIceegVza8(N8t91tJ#bsfH6a8)u0l4`6R|Qo4_QRs+7)hSw7)y+>96Rw zcRT}z3H@C=a{pms1w1KeDiGukH4X2HqKO4qSSr)aD`|>X0?_*tIpRA?nC)LuI_C)3 zU0X9*F~rop#1Tr^`kgdNCsx&&zwx1qy^wF3-$3XP2en`-x8`7|@Dl%U3_lJNc&MFc+H0U%)RSF}QKDGq1+v6sFT#JWDvOmUXxVdJ`FEf<}^M4(4{FVdJY{P@|Uq`mxve9FdIYqJROWA zltatJbfO|!L&<5NH5wVys!PFB$*)svC}HN*Qrbe_8lL%VZGa1b$V`08d#7U{08HY= z5;=vAQ2N`~s?C4(1qnvV2>-X$3GeP!F8-ZNAiA0a*8}a|Y5o;C)npSnivBj~1^?DC zMr=Aji5`yn3EHbG$|{c6=DU9#;U|KIv;TjdmM&9xiFxk~a0%%STQN(6Me}k8ti_@f z2mgf?CO$r%{wI?q1pA8&pBLkXE%=m*ZoHv1#mun8p>IW8Ckrz2d1Zx%Umv=p{MDt9 zPPCnphp>v{72+3Eo11_=%AZ0%_d%RDb_{~fv$$MTB1~kFXZ5AA1qiULS7kn?jZ%1J znrqYQg=uTEF<6ioM?-dRHpJ4CzBSJBRRx-=26`x1YQ%-thllat(`nPw@t{+)cO~6@ z*;B+@f^^s2gFpsmYBP3Rw317K9mu_Rey^y_-QIssB+$bOZkGimq>CYMw%N=aHxiMW zHp}`T;;m`{J@pjqwnM1)`mT!ky0DslzF$kBWV!jjxZu~&31R8!y}08NkN__3tvYIM z8EuknK%D+=VR!bV6*jPTd6*w39d$ln1q;SspqsF2_Fs5I_ zoO9_Z3EsEkP5 zu3mNiNRxZMq+cP(+EI}^3tCD$Vcl9+p*ZRRw#R$^q|Fd)?k?KR#r=JW%$2pOzEng& z-~P&ia|Hj37C-lg_zjy?PaAXUtpFH5z_vR_sJ#|{JLtB6Ua(a?aJmFgU%|rd0V8bx zmVfWw#@OBS_r8GK5U{x%SbwBN2bg_9i2i{b3I9rPKjb$|F$Vc{x&u1rF#R?K35?6( z`{#VR)bJ`Qc9(9vGOpS3F9)10({JRuK=!cz2-}0e2<_^Xr`zv?B)jz~n#V*!ldz%> z+%?U4K_gZ^+fKf`0gQ@daFswYnZ) z1&<{*h^reDeOaCs-Dy?^MT|zK<2vJV|4aG|qF{W*FyhvbZn6)dUzy~+>qj}UhF73~ z++HuH`4%NF3X^9P7Ut*F02d96OV|z6R5e@v88xp?uLR$rsde&x;qY<-0d5{91m`5t z%6}Je$?|^|Q59@FXx*FxS}E}GBv*nQa4|nB|6j5m(#qgDES=`1#cT8;>-!P^Wc^TO zW0rzT=WBFdr$N&sOuhC^JTHsO}4ui*EO%hAb`r+iO-_DnV0==QSvor=Bkab7Oc!H$^MA zAct>7-SF)tEC=lMPYj$aS!5Zq3mwoy`M>Sh|6_8!47N$^S(En<_ZUDEzax zUK6S$!)eQVdE)1lkW`fHt>Jt~n_gXJZDK5`VSuYqP<{oBieOmC2~3r;zGQrJHf`j) z#&5-*B(3ve$&cos=)!ob1;&NrWfz;*rYL`!&O;rs%wd+Fi(xMAy2}_5Lj(Nea-%tg z4}XpSa=Q3zDMj3G@v3P&UO6$e?WV=2vvV(V>&+{KlNPW13!085Grbq|C;`Su1wURx z7@>a8tBZ)U#>0`Dd3n`~VWT-cBJGllw8 zCb>)uK?PYwuw`on#xwG%n$?|=Sp%eD-6FpG|ro6ib~+Bpmh;q91a z%1C6JbLQU`g*Xv>HY#t$$2ZGZfYxPyUlwK{TiEV>ZM14u747Pv&Naf7jrMMZ+rBKGsmK%$Vg4)ahbUkg`n3CjbKSyLbJovMMcs469C%cH0Z3V>1 z4^5W`@L!}rH(zKw0VuDE0P@Tbib`utCMT$b$s>o|NyBSpIJjq0hqf3xfEwayr()z^ zPH(O!g)#m=jJ;)4Tusw9I=H*LySux)ySuvwch|w)-Q5Dg861L3a0w7JK>|q*fOoL|;@{hw(C#t-SPqLIB{qYxkkT-kiw3L+>po38caH_a*Uz5hPub`+_bl@+m3K|5s^?1|jS&+(ZKE;g~EFi9!Fysm*(cCvb?|Si| zhb%spL$HOGg@a{B-pm7AgO4Ii;F-(=uFpYDEeK7OKAlR&wpA!Tn?v&x6&F(rXO-m8 zBH!reU6qn_nNxAqqm^iqkSg2Lx-oy3(g=b=GsFO820m_UiIDptX zI-N7{B%}9NvyEAVcar{twJn*3h#WyuHL+ARZ}>W{`77;Hd$^liRPyht^@KZ0KEW|?jBeX%-`~AONqkuBl8xRytSBkS_puw5sck6R1xLh zN)eZErVC5#pg|Bp_b+aS79yJs$I*{bZmnotizl*QD92|RU;pIryudTCt1x5xH~S^> zMpJ5XO&N0ab=Onv7-NgDH?Dwy8z#J^1?jA}A+PkC=wO2SA29Rs*NRljP zR!;F}0+5I8I!~}DF+&en_raaf|L$a$(FKpjge|4uwNT02L$HsRL)QD=vC&%^)#A>P z`5xpYn75~o+$`(Jyk})CiJfiuiGlYScDEO#@NC6RvL`az;n%Cl#gY6sWk_?CziGA2 zq@@Z}8K}fvhFW0qMa7tDH=ev_Lt`kx?$({E5~R&O48*B!Q5>in?#WR}%yMdrngf%j zbb#c}JFDPO{!;eG^xhakW_)&he47!7g16cH^_<@Js|OfBSW3C+3NFOpZLEPGxShh| zDU*}LgOue1+^j!H+YMRcfb6Zsh$2l@9zUthqq2@raGKuP<+$AadKAkAp)=OaiT148u`HUCrK{+t6@i1++M( zG_f);*xK1Lpo#4qZJ z*jTnz=faZjvB7ujU^0MsUq{bNsxXYVG0O9%^bbb^#vo^bqyFO?ol;Zd9OD>xC^ed; zZxDVepQkO0U@R#QFLidux;IOFzfwcQ{GY`2{{X9_(wQ)HB3c!OH+1o~Lhs-@k7gNk z8TGVcms+0jYy>FWIg9$!{DF|nD?pVxJ>{$Y=LnsllOO$$<$hk6rYGUs3w3@W zYLL;;@v~T)UlZaYjC@Q^!OXPs9xwRWm6=hk7nj!#)ECrURhZOhL9$w|p2)Y~A2k5> z%yJF1YO;*lvYH`~!Z@lOv;>^w;C@~gv5BzEb2FS!NK!HRmG4)hO@id4t&MxdIyWq;6k7G( zlEw=QM@i`oxc=jx#9*P?RTD=9{yj4zRZCG;(li2oUOv>^Lxy6IpPOfR8;wP^5MIT9 zv7UQ#CNf9X!0J)aIWmyOu2%VE$=zmYX*WQ1KHlo@YWOs)skaXvj{Mf6v_Kk*e|1k+ z7<(Qt`#TlSe@b0RmtJAHi=ADirW0ZSD5ff036HL~pYg={nor>@@zeoh-shDKT$;68e8n~gTJhpY^^$)52<2}P$xzjhh@{ym(5jL+r51K1-?I6g zDm6&K97iRQ7;b+9M#L=?4ZRNEeiN7z5IEhM*xYIasMr=CzaV<*JIG#^27dIo>O1}7 zF&{8^cX_ZgpC|BcuG#6j5I$D=s&2EK8mNk>COn2J5hdDs+?^rgBX{=^ zL9_`Bu@zrLHnT8>%ss zx2e9m5}{I1EOcsVqr*3!_~1EFQG+eL~)ozvOg5_-Q;Cj3}MrSPdUb2 zJ*HLu>Nd!wB+0;dUofHt)Q@9lgb=Ok!h_C(?31;-freQ3=C$`RlWzxPTYcgR4WL7q zoNwe|o?oLNS|IVZ&R=wpzYu=ZX&(A$%$)81hO&LX+C`og5u`Rs$o$HyOljGl z4_~JyvO(B{@};xu0kcanHxG`*ynKQ!&XNad;-r;Exp@2&;zIgb>;f!`#5aE{>xL~z zB4X)Ck}4L2kUqN3uJGObE}eT(jGCBi` z686nEAaP^zlqlFfil-;fxOJsEV1lw%VUrLYbw`g2j38ZFqTkVYPqn0iXg&#}6T*HU2h=!gqw*?crTR zLm7?Co{pY!4D&Ulb?I@#Oh2+Y2bFx98f&bpt1GUUhXOztqDfp5#324{D5d2H{l6(K zKn~fvZv4+LFQd_rk-f@Er`ha!MIFTSU7=iB@H6!P$F2bCyga_cdGFK@TfYI@ys)h! zIB-Uwjyq%M+2-Z^#tbai9{ie&cMO;zP{rLuyk#=6s++Qfl0y%y^ny!;kRz^t?Su|o zND)Y5i=e`dTF4N)LPT1T=Yn9s=1wa*WX-k+rT9u!A>}v8EJPz*geK9f)f#KX9&I>! zWcoZlt8?s!OEahn3$}GyrW-dga32SqU?_XSN`Gw?_VY2s9wBYU(gZsaWM@w&`-Q)O zI{F+0qCTHeolQM2tOnzJuHZ*08$M||7s+1#&sZu?r{g+@zGu`%cjvJTAEc!?J#ket zRs%3+L4r=fV(s2m1cngXhY^MS*)Z~X-}SqDd36SPZn~>|FhD>#+{a_cIHY%(k5nJR zOZ&^CfP;f70kW#qbzuz+|C!^k+}vSH62A=)@m-#;8m8iJs@(y<)-c@rlbxvqLjbe| z*7^~q!yEd*{l#fNB76cG?k%nV=a2-dP_0QVyD&e`wDJPv2BBui(4fZAuN7d6(^#uKhRWKA?J&;_O^8&=o)jsI`58BWF z_f!c6d;L{ZH_bqE1hl(LBTPxVto7y_me6)|zu_s5yWpN_a$Tw;sS4`gOqIO+hLqu) zywWlN+t=D*`N~<0^m&djqgFm8FLVlh*0b7pCE+pZ$!gXO86m*=7}U9%?C)L1>XlE3 zfN!Y|mlt3mW^bd6@5OB&9x`mHqGsIKIYDZ zID!Q0oE5fDxCF>=D;Zuxh6uiGEuv>`^N|nxpg6};;59tSdVrxN{)?py+dimIvfGQR zp@%pAFP{pgBi6s?arYh`829Q2hZ+pzkXpowc%@b>aJGH%kOOtImIYn^<;1aKLIZ+UV6^Wam%NLS{a~tS#L*+o#vy zC)M+RQ@<%FsB=*do??3)z4?su49sdFw6b&avr01xe>0uQ&M7U1!sAe4S7e1k4KWtG zN}H#KWoC*8*?}zaxNBx*A_{mZO>+<5&v1eA93JxQ_naY>ik&H`IrVfSG__@_Z;P?s zK_@duzYva-&~g1l5D(c}IVA#la%#5YE;t8r&oH}GnhIOmjagY)nUPxYO6y^tR)KL! zQE^IcCqSjA2m+w1tTTK77V_r)ZlSikjjy8B>OsPCe*P>%#tR=n=?hH7U#goe)J2?u z5()p-d};y!aV8|&IoLbb%@!&fkLQTO_^b%76dsQQYhJCh_M)O$E@Kr48juQrT{$EU zrGFQ5<9Gaz7>xrf42Qc?qqR0v8bY=Yhnu@|l3C8ou7B;ZE2~Qoj?CO zz=L;!%Q^*Js8AxIA3vx>SQtL86FyezYc5daKG#|M)WX^_(suczDFv(zGhI_j0~1p- z-r_FZvzwQX44Of4V1k9~nQ@SmApa#Y4~RiFJ4xACJ2n}69CXRz;$BAaD2wxD*^vp3g^CUiN)6eQgfF#KC2Be z)2W1W3wlE)f-wX|X}LiCv|6ytuw28slw6Jc+K_sWd;A_PMp%h-hJKUrsH}bUzC^KpdU`9zHUPl7-H?3!32Z#NV*7 zvAZj0o;0DVs&gr+sj4z1fi#x(4~~xVUqejn@8p8SNPk(~L4dh2N4}|yr~H`%^a9XQ z7)-aQeOjD4Mq2~VAhu!(B*3zsdj14FO!d71os^Cv@N{xe29fqq5Rv-t-{B5sz8@^7 zJ)uLPTHGVlSb_ln$4CVI&QUD$}17XlM0zHTbOvXrP)5ko8 zYFj7x3<0UErKkvOB%y4hBPWL|*uXM8B@OrV%~w*JmLCztq{`%0{1n;VhfP!#YKiE% zl1PO)hCOP_q}>u1p-#h%n#U`*BdcZ@A9fGnyaV?PxwC?DgEA`ON;RiQ?`=x_nD0NI zFTf!z+gVs%PTJAdR@`E@M&>R=qJ#Cbkgu|-N9!l>^DzSyU_R1Qig|?$1)vg!?HP`W z;z^9yd%7M$ua-!Es@FNt=Cb9QO2xKmYDEZR1-YSY;GX!UjW6@Gsf3i2KE7bj_H1H7 zUX1(00M3ts>g2#(xaiBtAD)5uNo4Gj1GKR(#+Gpgv%#!!;R|rk$kddiH8N)IA2;ka zl`Uq!)JaT-ef=iAS?;=Z9}df*#E5A|g7IpD)g6ZUONCNq%F@h35~X9V%sp==G&c?F zW>(lam9oI#_DBN7u?%=Y$~|Lt_lQf z%}g#ki=SSps0u_?F64ky%opDApAjclOB63$#`+ab-y*2>sh*bxY=XdKPLg3A!`@cu z#ly>KA6bNx2l*B~6o3j63S$o}%=*3D;eM;xBvbEmuEV{X9*#1A^A0N6hR`?P;Xd!M z$1DjRfJ6pC@5uDG;Ht+g{_>=tHF*O-H3n6E0ug5TwoteMpg(O22lCCBm_R&C#x`lp zE9f>Zf>($(b`kgFdz%L4j4T!lAIgpgoN9+M7|G>riMOz1s_iKrj#y) zwyebejE>=BT;DpH=hOB-N5#N$6gf!QyW7dtivRlss7>8ugBMHG^q%Z1k0S7Kl0XR= zJ;Uns;AnYG{U)!Tl!iVdzbGp+r!mDOML!*ONwdDV0wsN3Q6syahJjm8yD(e}WAZe= zo`nJa2&7VoF#2k~1VqBred0><(BNzcUHUf}hsm@88yFpw-NtMQd|(2wi1vf?s)oH4 zG{BsRi~bZWg#FEp`PMq;Ex|$Y2InoMrE@@AxGavw)0PYn0MiVZnLY3j?ROdW`Tw^J zr;%lA0pXt$%Uf@6KopDLBU+z{*x0~^TZ)%)K~XUl{D4{m`HC23gXUuV3;le?TEhwLl>PqY@nkk{ z?J*eYbfN+<98txlWK}6H9jVx1=n2n$0$pQ6P|Z%(oxP|U7c(D*pDE8A#P|k@^=$ua z4Sw)Yms)$pWa{e(1({|H; zP`EL2Gh_=0s>RBi0sD}0UNhsV+P2wCWDstD^UWD?tj{8oGJP(4&WmM&vig{hIFv`N z4TF~#zyc~%N8mnDJTs(pU5#cYYo6iA+aA#Qz7#IYoZX$qQzf|bHBI@YT?w{FcB>+L zE=AVAidh!*ws-Z^9Snx`DYOS8scncovs$mj-*0_cb7XWn2}^r_2M5GrZy7 zcwR1t1YL#jxc}$O59c%so2qL3^cW}W2SSATucI zb*gAe>B}+iiy^xiD^^$)7$^m?X)?xO=oY-uv!*w?w8)c~l_ibFzhX52%SU-o;?%L_ zEsddDKG&mn=^4eGb0?3G$}#GiV_Bt@IJX|)tDSa{N8D>plA*@qs~&terP9%JQ<$WE zk)64S6Ah&l&+I`wluDp4>+nN0&N3%`#x;l2m$g(w7SqxxjwA2E;!)6~ivx#L&D>F6 z<|E=QYg-|u5C-z9+ttuo=GfRpD0Xm?8^>tMFYueAv_A9CowN54fgzs(-h6a1A|Cgy z6jxJGqF4Yn6+SbV8fwlNgcN#6OyvQ7hcF?5h$t92YrbMD0VyQy9(DCtEkH%rax9LB zqOOkcJCJD|^;|L3H}E&H?ujd;DttArBMPhMDrZ_TW+1(1A)A1)qA+TVA0p&hYj+aR zQqs5s-uV>Wd!a3E+$Q@9DFn{-gpe1gCQ57>VJ&SoGtcd z>QYy_*Gpjv3{&EQP_Mb)uc^oLVaD^DH7s1cb1>na znB)a47dq$S80+-0hp5QBp6|EPFrvkm?IhPir2DdWCjAXXKPIFEs0+@s$s|rKR79ku zM`cG>-rB0L@jaa8iDOQ#gLAK~+Ms ziC${tQ6=noWcUT&0r-Pj`QR(nQVKXv zhopx31`FyEoBg2=EFjW&2AJ=$f|cG`Lfi@!_7V>LEvApUR!}}iwqMYMGSC_E=}b{5 zBgfXguf4EkhEJDhKUEqWx~wJEbOISHxDpp*bSq%ka?+K*Q~l;gYgsRf+vWY}O9&#+ za_UCgd%zq^CI9&6`$bBt8pEIZFb6&f@B%nlJZ+B}76>E?{K}s>qh_3ouX!>65{z-+RLZ4ZKs$bfd&sg>IF8mhPEksl5pRQ4 zzky)sI$GH9#K`1+7}NN~>sV!Tp7K)9#x2^kmV?O)gPJ{VMjcbJq4#q=ZDwnMy6MF~ zzKm8qC|NCbrSi6c0|TxoOSMI3}<2VdwgWVdIVM) z-(0(MR^figgYhVM*MtjHg+`v%+4povi5-(Q<)FKYqWX6qop%w&X3O=;I}f91#@q5I zr{350v3AkVF_zZw)3P0@YdWFWi{qbkK|nzs2S_r0Z5(qj+55#{dj0#t702(#>qGlS z7m~l<>$AGSitDh>0mP$cb){g{_%s2si5+Z0ASnv7Td(`rEZXC6Z6;EpUaWY|zG~+6 z&m7&oUqT~%=SueTiYget{*BkoS*=-(nSS8UsT&g+B<=+dA& z=Rj}%Ty}*vR516$_H*AQmI{WVRCpZZ-AYRUjVrVtNx+;!qYhts?*UQ&VYHGbixWf@ zQ*V&#a_4vR!E@^Pq}}V#1r1b!3DX0kl+!NKVfth-Bu;RPAA7oZ3XojFY=)bPKH+W= z2ugXUJz{r1Lc{Iqv{8%8NG9~=GR0eZoTUNPWcUx9?5$}}<~7t}s}b0p%Yax?TwNS; zpl9Lh3)F$tNoSyOWy|hrJ zSj2Go9#RqcSQa~;)KcWk!pmJ|i25a^L(55+Qk-~?@jAo_ChmU@CK6Y(^X@e0wGbC$j8O zO!SsM2zc24@x1X>qyrmp(!=XW2j;f0yT|}ArzFnukTkVvMie3$Ap&#iP+`(wix#>Q zmo&F+t_WRH1Vheor^vLdfb@;q=p^$coQ)XZ^c=X;T^!fq=ECOL+)X!!{8cc2E?a(! zTaOeM6B}4*WfDjm^AkJOhM+i6zR2tIwSWJ$9)mSPvx}-ak6rvHFvy-EdI2Uxm9u-x z2Cc0xc$j}j)bF{I!mpmGrgsL+6t=4t>dv&D;uTY8GNouV_#U@xp z;Lk*kLBh^+sMlQM*A$GvFFiBTo<1C9P|iUl?)sm(gK1McrBcnOw$k)N^X3hb`Amj;;%+Jr_tva-uThtxZtP*EYl7jvH?zAo%3AY~7%kfiNP$)mmF?(f{k|?(vQ!K5lN-TJ{04;%fG{ z)^L2z)RoHzAbR+7QTw*!Fbo!e@eKyq350}i{uU7zhrL7`HUUi)II5!ZqCTmPYI=@N zT4ichc3y2+ak+kdd09$UQCh774Eo~sWyP;lG{DXlTKFEg@EdZ+D8j79bE>PQV#`^TDVA8-LRDM|GR)@Y|;Gf58CH$+duH z6cWI33WYWf$}EVs&oo~lfg6l`reSEp$6%bk`2y&Rge_*hmnTrI`HH|b(6rNUmg^}9 zfHf|x&n1}Fy8s)T`G^tQ?}N0`{`4jAM029Z{AIz}*}H?z}gC)R$qG~|H#B={eDP&B^zeW(K>j$s5IQqFVIU28LpV;N&Vfk=80 zG%_udaC9~&RHx~c<@D?2+L)A?XIAS@zek2gnbK2r%ZoFrM#kX4;YpkIr1$!tP9D!u za= z{(2=S2Q#xkci96Id21EU1FfS(!%s^SrJmW(E6E%X07+69iUT-8-+X^eZ>j(ZB!!Oy znPCQM_O%+#@#50vdbQ$u_G;?pa@Nc-YWX=uRVhW4Df((Dx}_;^%OJNjMKfPLHLt9= zV!q`0%r+E$4bM*Yp%MGmEkFN6GjW%+)Ewg-F10GUYEV}~lBM;sS#e_P zcA9n`S%VsdFFSo{yF;vSE#>h!nKWjxBNZ8RTL~)823l&B(-lP>Dh_XSa2>HP3sC7t zj`XG$mh7prHDTd7;KuhS1;#w5y6WXY%C}aN6g{r?h{>#e zajPM^rZI{nbsp}KEoYId{idl9n9*WBp-H|F1i+_pNgNI$7R zujXm`%xt^mWqd(9i<{Q$=hPLBi&!9Q=x1QQ?vO=?;NCYT_IosL^K3Et!L=@}5cc~9 zvR!Cg2j&>kZi3UQu*%Fet-A1l2#qxz+9SeLG8IQiMn9x(t@>+qxqXV705*pZK|(dX zMjjuFJMH?4m3zxe`>)=QusOlo_A!&<^pA0F(7^evi@ND!xMP3y@i#O?5LFmH<0n?Y zn!PpD{vzJf;>^&llf&)DS+yLmNDHwT6l_#c*fjDS6g(kNVyE!Bu{RG6 zD?w;cZ-G;>h2Dh5`I4la>^OPYHC6|lBis8%pw5{#LN2d4Et$@?eK`QSpIuv~HPp{$5Drhque&tKo+qqk4wAefGPpk&=3r%3U?gf4{L9 z2gJ}@+K-A?9GD>Iy=^`_qMJ!0j~yGUk)krC2&wJi{n3GmPUFEUE#(oGk@bGnG3z9q zcAY+i2^kLF3yKaRC-+_Z*Qm~p!7aU8hMa7mUVg1=T52sIO?_brMm|)x*PFBpED@k4 zN~45rs$S$cUe3;!2C{X>0d5~1I*OU{H6!r0Y)tA2_+k6gE+e$*t!QF>Vm<-iOj;?} z1GE;_PtpoJ3)ErKY}Wu+)^qDs2(lu@AnqALYLuXd*?lkvWGw zYFFd={S zpdjS{xV2Glf9Xij7sWITl7X;TC2VVU2!zI?8-yRXYO3v8>#vb?X=ng73G|(V_Z+u< zlfTog!X_n=nm~QHE8M}R0h6!*>EAFG11aFX`4u`wE?eA~ft|rn7iLLEQ!V$K%Xs~a zw&DDCs$D8uq}Aw77%5a@R-dIR_M%( zFM)rWTw#k5{S&zOWb@|+fWg0JWON0!uB1DzMebh6c4OG$KDHdyR-3LKFwdtj{f(QB z{k74(QBqH~RIFAqHvOAIYKtWbG`i>nG!sNA+3FD;w>kk?S&&LHc@A&PE*dVg>6RyO z*)csnOhz#-n0L+v82w~yX^-*nC$a-y2787ZR=#VahpWB|BW^90-XVKz;y!4QMw{`b z{>KNHEywXnQ&V(4VW z9wTYO_90sz*aduKg#DzoKHJrT?iv#&QvKAdA!^8`1eJp{k^%-MG=k8BWbH5PA=P?3 z*Ihwl?144CV^2lw>hb*;4$HF3CKj-9+z-2eZ3b6Q!-BsCrlAC1pptxpBA*QW@G%+4 zh;WlOfn&>VKIaNE98>ab5d6dBiv>eRkignGUDwZ+KTqdpY`r*=2 zm<5Dr()F0<;U%AENnX5YJ7V355BkQ!VV$hvKC6s1S#pI}?zE?#etvrOe2`=nT1Pl_ z;-s=oip`I-#=gEU+BT{p`Ck!n;lD3rRJmQELXip(L9@y$^!8WA77v9^pYRJ`otT{P z+}>?ncY4oSBSlZnbk4+-SQ4nCyJ#YzbgA4GKpk)kX7wjdM2*fbsx+W}a<=(cfgjR2 zGgP#iFCAz;LWTglUM>z~&KMEq4Ib&o zYsKU1070*}_(8mgxG!FUX*YC#=%LYYnKaMNlJF-ew{DI&sE1EkbJ@^Zca6b6Oh7{v zFn(-vkgvcvM2HbYAPXLe8bS|(V>&oqd)E0?cJ}iDVy+Bx0*4lsnERaexY%2fXQ#tQ z&?|R^f^r%AW0W=oAEC33Rp$wi;wqrf~lh|wN(93itNfhzAp7YTRd{%@Gp_qg{U7feSid3N^rh8|vE$uOvgPE?FE zmNN7G8d4Dq=EIv65JP7H;2~i`f6mL;;L_uccE7fS0<3;x%)J7)e>2ea-3D$Wkewig zb;T!m^!TOew+DV||6y(I?S(zJ)PFGZy?+@qa#nv^Ko2a&9;NdVHiY#3Z|l|VW>^M+ z|8;lE+Soca3O~K-pP-ocdsqpjv;({yl)`*GP;z7`(Go`Qp;~xp@~kA)nelDilr81$ zz8pL+NXme0J`PLA5cGE*z-~FW5tYVS#rIcIf9MjaYDBz4K4B`jYD9 z_dX+R2`d9aLg6*OLGryzJZV~nqfnF$TgqTp%=#rTWOL)V|1#y2{TuzH@^947yzDI9 z!h6_{nkodF7v}rmd3~E=*O=zecn?|O<9WQPZUF!Y%JDLeVc)QeKmDDIZ8$xJhqW=t zQb{`4TB-3Il*4EZTw|Y737U9P?-t~!pp+QWF6l0(rQuScU}59&YURlTSu&h#h#Tfh z)x5|2!S}>s-I_)Mv3d--VuT8yTsbuT25wz_3sHw&C{) zaR7R&=}#R)-mt|Bg{PctIK|6}qqi6}fLsZZ;u<#OJ>;6=yP<8^tfbUp;%~-;e7qVy zsM~kWi98FuF80<_>P$+Ta%>lDi%jvfJjbyE2w-l1l9bs!ederd2M}YUbno()qnT?b zW#9ObqqjqMPThJS9$yKe(gg^Gca$dH)fxaG4`u7U0()mncF?rf+H6jYY1(w!&YeO5~#m5Cf%sU=yUGEHf7E&kp#Ahk^ehCkjy$a&AnR!YOw@ zd8k=!lt47hArG3dAk7{%Usf?snv@yc-xQA_tt?AnGGvWMye3R*V-2Dlp80d^GWgjK zV-A9!rYOop`fBXk(NvGO$dKu!jGrioIhzZGBpJJ}fQJ)#xJQ+=7;T)hIdXNKZ{p9V z=f@rSdy3gsUOxSNJBb7v(=I;jNRFG*q7QgwdWV?fQ`zg0YAi^Lv?H&>Dbcr{NRd+g z$$yq_Qiu&0Ho_i02Pi{NmeT5@C6jJKm`Gu+%ko*nfoHw+lY%MsCA@xaafJ(IJL^ZB zf^-5HOJ~KJz!*x49q@=bkLLmw^FEp5x=31VAC{n`#)b%0aM}A6cHdYKP>0^%eEtT| zl=eeb>!{FfLO29$hR`+8&j2)EJCqIqIKgY7Y8`81InZa&BdA8m>yaE>x*ARbz0O6$ zILPUR9ZjTK?NmQYgDajH(GkFyP7776b}Z~?zI(77K4_pr$9&P&(Iz1vr+N}UYl}{l z|IW;U8JM6pOna(&k}%`0Oo&eToB&LM%8Up|#zKs%QNg=!T|ra+F{F)v=r?JT5Ur}< zi8^Jz!u?AN{@;$CiIp( z{>LpotRzl|A>}m7#_I}40!+sSlp@3RSn0>dtD^^V-^T^SXIZ}CUS0n!Q4|$!izm77 z@~}cXiK+?@-AML6UCxQL0i%0$o*H!{5pg(|v)U_alsySSbfX~}*e}HH!C)VvZDN?U z0*jFfy|)*AJvnj}$yT$W`Rt<_hIBCZJ7~iS_CI~S_iR@}fl}j0nLUGmpDXSh+}~4x`MnCF!xT{oD%$?d#zr8O+Jev5O1W=v zu{=XxJ2@)8VyqE_a!uh^>)5!zH1eYXCe`(Kg=aI!qpE3pn0;ra6Uk!BPcE1 z+E-qzFwkU=rs$iTUMMV$MR3k0H~-?r2UO1%n=I)A^$B@nT3@XcP@j*ae}z z$^kR;?bidw7KcMn_NIm!hWsm&1^_V{ejk6gRh37{k(kB`moI0(R4E- z4^ndC!S8^zhIJVr#@<$k3H0NZ9(@NgQ9<&Hy>V22`vI%}1Hfj=M*0JsYJS z4jwpJBVQK+ag7uUwqh;$so_eyAfos$1@8`AFw|Cz#x&6W{L*+LAFT@83K~<9qA;s7 z`H_>e6xil2wP zr6A`?zlcwxRI@$<^2_*%J5Z>ynyYQewUM^1G#grp2n&i$P+n|VqXyAA=6PHmonvg| z1fTvB52k9zT;+L-rUok?-gM9w)ytEcZNp+Ct4ev~m>u+O_7=PE*b&%9;I#MjGEPV~ zd%#oM_q~+-SEP&UUtaw@w)25xAE|CnvT_AwOT3)y2HnRgmK5B-tP8Cqby&e@R#DFQ zqH%HhH4cOCp~fdW4f)OnRde6bppLm@|LNU_8?&cy`f{o00W$FJea!r(#jPW717!U2 z^QtS#t#ivsS>gEyW0ZeQjF52_)sX;|F(#F;@e}h`c98bq5Lqk`>sV%e%w)5PX|1Vk z)fs$jg@m{x;WiA%Tpd1##~{kHDgOGKjw-%~w6KOrc%DLjRQ5{IL*az6v zF|j`Q$Zotk$g!0S@v#dIKToDqE)RqC=*11^E`=-(e8~2o`*QT|*~qn2Q6EefDlTDO zZ?Zf2;O}3^cUT)w^s6_|h8<|DWo=TFTJW2m6{Y16jyq^Vk-NUMAN`TGFC4%d#QFRO zJWpV=;}Y!e?P0T^Nk@qIy`#0TG~ka&OKKW~&hYiTACc^QU|CUcLk`rw`2v;?Aj=U- z5J*lP1wi%%%I*|e;JtL!vR@47<<4TTYf0yQ0SfNnrIu-%mUng6K04t&EvG)oz=ov6 z#;U@$v(@)-TU8eR#N68xy^~YKMDIU(j-#OLUuh!OYQr+AEZI{+k)*_Xli_vvzowiNKFGKhAFSL;7L%JmrcWi%q?}Ix>~#L zSlt)q3+psSN1EO~IB^5;FLbbxJr8i0Y95CfDEk;^5Wf2ayfzOLl(gk$X2_@c*8;nI zCdNCyT|d8Cn~C{~4UP?c|4{nPr_o30D>m}+=L0G|7UDez$8k4W6HJDv_@Rq~$7mKG z2*t1la7BK%`JuHtaFKIic+9yzaW2Xm@b0)pPq&I_l1GCv|3 zuW1RKXId3UpsEfI#Jnc$G2KYzV?!{1PkPqdhOQWO39p!LZimz(8GqQ*juKyufXHpm zEji~Uet0Y?OmCI_ZCst5rd-yNf-7Tu|-#lNXjY2 zm?JVK4{7OYIO<0>I&n^TFJn@EAf~t7lD{@LPEz!uk7}N=(v(CFfk9JY<%`CT>aP`^ z>1*0C8SMKZDpCFOZ1;5)STOqyTB`?(fV^uq;|YuZ?3pRMov~{PO^EpSX)v$dnW}(% zC6Q2VNt;1-k?4+R;v&PwZ&%m4E+)rG&H^ z_wjOn`b_(5V*<}8fTR_P;}n7W4SLwQngmMld_Kxk^rv}gb5;I5)^E=tP{$_VA#J{B zjY6z64%#^AJ^2q9i0$il8Xxexw2FQ76257lxxLSC%AQL|`DQQirg|#W!Kwwe6 zZdz?hUT&U=rd?A?mPx56XZ^J+d5tL|Y_rJFu zPELXf0p0+E3K;1Qb>I97&0UvGR@5Nn-*II?TTzJBH80It)bj=M>JYgt4NUaUx?IR@ z^9!}d!A0}dBW8iw+?2$3JI7ZqZmehH3s6REWbA5dTR~<;Ft-BC2xjuoI0j=re62xV zXd%P((D+zcC=o^QMVy)aS2{dOvNtPyC%Z^3h7Og@v3Q_w7ZGFO&etR& z54bWdzm$w5qRM(PrL zI9WiqFgc=6PxGgPdtRlsu{&?RIct-~L*BbE44#nQwUqXhX&b86%TP1x3WiJbr~!MVz35N8I11CtT*pOva$X#ZMi3rlW@~XcG#}W zvol-q+LRY^(6CG>)U_*1ivF_qZH;Iu)xV-0zQ$K|6)qRPAx1Hk1j z&J19TU*o!%;%zsGBnUQEN$a&f-jWxnIGcLPlg`9WqG8cI3Mmd&(&=3h+FmAoFSJk- zLqC7WAYZE&vt!Fuxyt(TnC#*cP{iyq2t`C`ioTs^t-s~amdc8Q=6?YDkVB`%z%mJR z{34a~v@M9>8|d|M5sf)PUD3RgI(W;;#Nn47MeGmmI;#`y-k7olsoq1{Ny?isE&0y5 zMA0T^tH2=78?pzJgWot=SUlbjjdN{wt0R_OnL=>Szc~2U^8^K!M*jTve}z26ic4$7 zd|NI_V#r~lh*E3cF_D~I(X$~;yQd(d$L-j|amQPvh{Mr zySxIKJ|)SJoQB?z@=FSHmuz(#N2FOlW*k%9E-`SGKsHzY_PX;INi02+C|Y=$MBmJz-a+;6#zU15P|MppfNkh>2bOIiN{bqee zHHFCxhc+fS)+xU1a8U~LQp%S7CEb)E8)WRLX5{EF{G5vbc%4EV_}KdfV>{kp>>)S$ zZ^u9Ig($Q~j_58T#7o#WRLZN>7r3!qAI%+}xlj_ZB=%+S4+t2JjdeqgCUVRYO+vrlMP;M$l&p~%h1jg@SBPZk>Q7)cD4@m*Koc$o*p9gri-S&vok;O1!UJ945g;>&Ih5K55>16Pw^)k?F z&#VOVjyOJo2kDx)EHIjp61|@Epf3O-t<5DiOTj7Gu4R&R7L0~Gl5tJ&qVlU`6bdx7 zHLcOlC$*OQc9B_Umf-I=hsV(+ZM=(#{>D&Wdxbn$!x-!>)jJC@;&p%8H9I+FF-QHB zW4abrwl$be?BSi^O}!+1>S^nXFr4JG<8-BJHHGpI7wg7f-5Efy38!B=r5Sm`qxV!E zA9aC^(f0MfB1S;-y9o)7l4$h|zm1L~PpsG!7oyQT!mpA$ca-SUD`LLGXtlVV^L6HUo5>V{Hyat6b0j{_(uC*RIHnAW!N8%mW2ub2l+g zA&h;jW(+wmhHG>A^?Cb@a-QPYB$3bJp^mi0Y;=u=ALUz$4?dvD(M#{zDT}_9z&5aaJhfVL`(~+sI zV}LgJ4LZBmYBTCk1V6%b+38beIFW5I@vfH} zezguA*SBl5giUEYfBUR?(F{-MsUaC*d&7_4Z!8XBwmOe%kb zQA>z=@uJ}iv{?ce&3eE7avz_Z+bve?I$*Zbzxz|#u(~~gtvB~)5}_K5q7a6>X5cA% zb2G-((Ke_ zx|MdnfB1<)p+rVI%R#*)X%XS~5BgULtr=z2f-#Qvt9$*C3!t8GyUvw=)qI4PY>p-x z8ip(uhM^Ihm_-%>NGNy-)PLjnrqkakUDhBe z#be4&q>|B;!BkP%FN={X+&=E;+qqWvRWMMGD@Ks}T)iKaOA%5ar@EhkAuyE$!>XNX`d1}jQ84V!>WY~WDoe1IAQfS z&lpF_(~n%&db?T16_pU_MlU>3A_FbSSUS?b`mJ`>QB`8Y?7c|k_fb1Pi|zy1t5xR? z-5X*UI_?>n<+B0`Wk-u?;KRz){4ZqlVw!9V;xP+0@jLsVxj{zX>*G|>`{gaZT7h{x z9mFOnl%Nmu!DY1N_uxp8VMVi#gx=in-F)3W3?8YiS1sT-N-A5TldedJc#0(aUdY;G z(2~%3xiFq?*>x}inrW8P+*l#nUfsdws>I# z)%c5rrdHe&4ape|Ca+bjbozPBoDd6h+Ozs=nw%kmlI*vX!B|l zwmFyvWyL5ohO~!1>62*;N&n-L3G*)T2vf3u;`*}222R`9(C{9Z0n+<>t2zs8iLd|< zVL3e?sF#msVwgivl%?Oe|2I1}fQ*ByL5*uP3%g33lkXYf{5VM89)oD35T)q8tXvh zA879^CRZU2?MFPTsIegW#3U@#K`G3_#-jzn1>ocgmFENA-^;V#%WH`JmO4XIW{{WC z8T1QFVWa^d4uwjbg8{|g2V`J1AeU8c3C;BjA{R~>{NO>$N1buNu?r-L;daZd9LhC@A$UO*H zV?lXj;Sd+{7?>d&SB;J^j}5aw*MDrhMKX8uy7phmsVgybVK$SA<3Ype_ZbT5yn|nD?QCNz&rrCIh>j#K!&e`{w&Q z^=r9E@SYw;ZgXGW-a=7jK-J_Gxx=_C2{Tf6`t@bQaR5%>5c|%-qE+9e14L~`2*+n% za1qvdUT*pi@&j}g9q+x_FsuOuNbtVLV9`GBVz06`;l!ubB!xQpK$Q4cr!UOb!-xQD zO<09vuo%3*uT^?~?MdXeMh`U!HpW)J(M$v$z}gX3-X%uhT|jWwSNzvF2)Myh<kv9K+ z>2yLae2=l6T!=G6yoisAtwk3_C<4+vfxDU8G%dW!Y*x89d~2hbBTt>`h(uNMMC8U~ zJ^qR2JEiX(HI$0f?a@&DT(XnxFSnakfxhdH*Dw9od7rmLx=dzGrXRP;V%)&WQtklv zArWNArDt#x;Pj@-S};l!=Mq-s1GF_^0bQ$UF75;Zown%IFX>+c{KKFxk&L>oiWR?~ ziNdTf#7{OUqpl9+xRqOo9sgR)gle*W~arWBo&oV62x zRH3@h1d@ME*h@ST{NSl<9NKR z@!2mQsGI&>(e1`1^fXfZiaKKiT%XWn?fD?oH+ZgYzG_$fLC;>wM-~yK z=`#i60bQS?6Ze!L!{=1seAeJ}R-M3|@3B08&j*UEAl+a2gFkk0qz8=hb|P$$#ZTjD z%g8w5H(GdM*x7e}^G@7F-1`vo316$o)lV2LIY2HZQ+ zcSRop4T1V7W17OZjtl?XA3eTa*w>n61U{WyN@T9KK+30O z>501Uv_SYfatFRSuY}5*F0nbQu%(;9t0GA$rcVaT%3_+;)ST^`Mu}lmlg zfiYdFc|LFbv<=@c$t2KUD818yt!yIwyaiZscX5b4IR1PoFhc35+S8Rj^T0r6(}L8d zx|lNc9$}pT>(E*WY2Sm-eX9>(WMSYZ+*n(kkst*sRwQL@)IILwf7_ zlp&$|8c<@N2-C8zAU!C!C&L%HyrJNhU84R-wDN1SaUUXH=}lWWH=6{HaJnhkkj$GV z`}(Y*CcftoAtZ`CNGn}BLXQj^Jvg|-gkmC!Tsl}LS8`wm3{9aPIVQlr|98Qqc__)_ zo^vif06-xM`R5!wf$VR&-Fx{R=bWY7ue5FOUzhna2Z$frXW9dVR@6VjvaT}@9nZr6 z;;w=^1w$ytfn2gs?} z*Zz|mP*7G_n5Dyz0&j9ECVG@SbqpX!v2u35gsRUSlrWo2vk_el zAO4y1qS_>*9Me)ebZ-1*0%vhLbn6K97QFNwX}g`i%j#*-Con*rxu)tdM#y`jthzx% zj}a7UtNH$!w3*SjUTa3Os;s#}k=Ff_Z|849;6_G{j(|IQYCAtv3SmBxF47iSEg3Sr zYDNlT#>~G-MfiJiKqjcv#;WRiDfmU&>HN>+pRK5gB0&h*ZO>+DV;McBbj+EidfB>m z^5$~n%am{P!mJ#~1eFYWe4gcYF$bC2OfhUQ4r$ETeg)SqPRY&A2XkXwFL}@3OsW&E zsFbKO16ma26&iq~t+W%;i&oJ_mDsVS`wcFwxDWam_CXhu1nnmX9B|q16mkk4V)*8q zH1=o)O5n8pn_gW^+3th2ae%&>{rQRT$p|6v@QI3B=jOZ(0>H_J9JcpRd61eDj+ ztk-&%ae`%2d0J8VPSHYZsoZ(O*WpKZjZ8g$1abqf6>XIg4JD{Hf~d8-`vAsfm*TdV z(~>LNX8$*ycPUO?152J=9V?AS1U1D{@yn}%DHjIdj)^|%5IjWlzgmI7_auKG$MN}I zT?6yYO~YiTF}Tmy?@!M{0{mb?BKyXW2zbA(&pGcIE^>HeKHfNcpxBjj{`WnG>YvdS zJmfLs7(C*!(C^hT+3)V#;@@*=@hbd{6Z-UO`*(jm?aA&wrAz|Wd_{sq)^wo^{t|OI z^wSd+NC^J=C29}+n}#U#Vf3^j)4|nk)k8eJx4V}w>Sshq`&kImvf3y6DC(ei!C!(B zF&=3Is&uMWLTZgZ-bl#fCm%Q`Brp#=MP$);e*Lhm&HwdlTW}|~8KD$4+6Yw+-0b)e zrF|l)SW482*AZ+=v2dui=b5-J;gcm^3l>l%{ww>}3zgqwC*Y-yqaC7}x!wFR=UBT= zi2~%Dp{rq%+pnBU?Dy@5p0>(*tw12W5W&OvqHq5DePrUW!rGuGI{L^E1{uf_p|IxmG zIz0*_^Yi>~g5fh-QOXeTTe4KJ##`s0Tp)pN12>7K6He|W3t0=Fig*edphb}JbRRN> z=DjiBcWotD>-hh(>HFjB@+_)VWCL8wo07mKVJ8z%Vi8>veeUz}r|^59NgetYEQ8@< zXZ_H_5&#V!G3AaRQe6H{_n7bhujg##Ptj9>14=bf?5<$L>3#F_YBn%>Gf_JD-9#GlnSo~UKB(9Z7IHuJGuvZ z9r|A?mG`G_*M*JMl(mO_O|6>aV4v-!-9_0-5LDGsqkDsi!<0!7-XonQFha%~{M`t+w*5vF2>5 z2C>j-y|V;*CwH+uSQX+4nxfnucPd~;+A(&$VRNdh_GC_OF+FyoO8EHyP+g$*?1ZJF zYP~rk78_upGonm;U?B*;`2vn?YXK7dM@N!!kF&z+yLe!H&Co^%Fv&Q+`4?*ija((h zqI?`Id{vxOT0@oHt-LfMf#x0imSWBqpn+}nyhJ>W9PV8+W*cq@`OzvWYMT?wOilWA z`lqM9iI*nqS^3v&rY8JO6y*2U8re4QBYUI`WQM&N964+Ax4Eemmy@mqPf;sPDXLV>)k)XSFVe`&EiG2d z(J!r0HO$FNFVd(lu9zSD2V}xv(rGtqP0}gF!F-LIS72I`g>Gd(2xY(h+XAVYye5tp zH-v7iib`=Mz!vK>PZKjoiilqFJd~o&%~#lP&k8Usds4-m{wx-B%0a!T!E7Rc#UHVZ zeX!6s1d!MGL)K~};9-`9Z)Jm92Vuqx3?NAkJ$FDG%JW{!rDh>cXkce-?It%h8ngi_ z>aM4`aGQ3-wt1Z^*Uik)Z#1oYr-QPX{ZDhzrxiovl&!7U@?OKNGVR^a6f zSNpQ7Zh!i4XSMnQMA#TqRNh~}TvU_&H}#wBEGSl`f%a`H=WI{kI=B;5;WNu6f^>ML zdW7CNjL?A!?9=KrgU9U)3CWM&5!{g6J&|t_J+zk8RK?YcQ!;_s$msFhtO*6L$vasB z7;-*<=xPnYw2-tni%i4)jj9LgA6V5*NF8MvmlXD&T!9xS#ErhzTyyzLiG8sN zHkKA@4(%G6z8sc@SRB(>((#_>*uzdu&E7Z`T#~mB-TDWxm;h}+lD`MRXDJGP)&H*G{x0NLsjp)|1U^R1zf@6o=pF||;oIRE@3E#C zgz-xX9-);u3}0z!r6$Hk6(4MX=Fn4$L9-RB~ujzYdBaES)l7Did`- z)5>^QuqRc+qLuLl1@$9eibNFJq-)*d%rqlNaRyW`uO<6WmSnYsrPBjO&?Mt(M|j*B z)tfVSRGw*hays@m#oqrJYU+Pdh$on7KzpI)Ex`-z+m&jv$c;?YdQ9=FhGdbqi}D`(oI7WS*hVX!h=Uopd+-!y;IfN|gm$;r=|^!(+gw3+SY*Cq5fa}D7D_2y*_20*2BgDVQw zsFVGhXa9dWcY;(RMAaiK%M%m$dWd;;$FWo(JklR$)U_74c<($9dYSOc-;S=YF|JR} zFfQ$9xq75!KePd+xurR(mk67WW#vV=dn~bOsKIuS(iP`t6lB~VPbBKS6d9A=mjvDh zBeltirdeEU&Kn}>&`YVy%VD#P(1r)H(X&7O@8$DnCIJ8(q& zVK#m}1DA*7*mn#HAO?hfH~v@TDSlU75t~x>22&l z){M1zIIV&fW(fs^6J$MpY&0l1fXom$_XF@y%fE8sUT<=<40=~BtmDc_hbi0r*=>0_ zEw-(~E;A<+{WiK_H&RHDCx{^!Z{l@9vL51uHf~leLGMuDb`&51c0AL6l)sd&300B5 zMENVdJh21X5%@!Iok<~HBmT{*hLqmY$-SrNhB~gup~Dx2j#*l6*Iroro4FjoFf*et z%`&CL2%4GS>Q7@z1Bx`za%q+QL)%eqdN1;OWhS>5UjL`z7?o57hzcGmc5LjJ?!OuH zNF5Hurf9CQ($ML^^|jKgLRd$0>%7gwApk;1GT;s&j&E%*`KfF*!nUg9$lwbgd4Qbw z1{Mnbw^-qy;y)X{1+TvX43hhS0kf2Fkkw-j~J5i%G+>>G661!R=`d;KCq?>_dlHPtG6<*W*?JFXJ% z^#49hdQ(F?f`Nuu?U?NG3UTTf9;uRd`{a29-6!nefM`GL3da!MHzY{&g=Ju$YQh?2 z&PowL*#PmkN=#mSkDoGiA=!1IW^$zz&h$ z{fD=5X2E?hjH=;L82S(S@K(<`?-TI+ypdDG5AR$k+z77^pYt|9HL*ReLBbIt8{sXg zNgDq~y}Us!LE#!oVG*VV-VR9#jp%qFP{ZubYTUkf1NbYuJaqX)v2raze&gBC?p9Q( z#*gaOujUy4%kLm(=G&p)b6*O^g8F>Ice$wu zxW__kI0ln=n;(h*V_R`p;K1sr_1wS)2wf7x9 z_s0*)bE9ttyA&O%7+R@$V={_t3z((fsHU2po2ge)mXeyQQCtRC3#(`Rd*_2kgh~s- zIR#l3iKYr1m-jCmfZ>Ja`w9N>81^0qIXuMr%`i}%km6PDy{l0Ybj)-3<+6&wo)DvG zIDl1!D~;p(=IWzpPV|xBnYNbTcA^H5HbFw~LA<+GeH5&rJ`gyE)^y{CijHGcbk7x3 zKoeG$LdVI~sks^eG{)|fa?q&ur))mH&|fHklw{PpD=_}IA^ju}>JyF^Z~D&N67bIv zYJjnQPt?7&54H+5ptuGe=MWZX`nIoaSwXHNM$&x$8MXYS?=$^x!^Q-wFr+>7HfT2P z#K7&7q68GYU%dMVwD@=G(_HDF$mRJ>iQX@)zQc6UlC-DMbj-xRZn{9sojDN{ti`>T zH47Smk%{@>8pZytNtV8oZ>UQe?%x+3OubJI6KTai-XBL#vYc}p?Z+bTgQs%B#qr)?y zT9opJeod6#7E?-kqmg_q|N5$LjGO3EZhSmPOE+&vwIsw58I+Vk-6Sf`4P?p1_N^%a0>rv;;;l4K`6_wknywpbQvOaQuN4RHTm>K4Q5k& zjiy^LXE0Ghh5q!^o-Rjs-kQ%ul5dy5?>cVxMPd_e`waZp@R7sYeUd+7p>2j=`D$GU z<=f?y8Zan)Sr?e`k%!qR#;qGY8CzQyM1@rt*ygmzEQ$}wO6R7=$eAi-MHVoXk?WEf%_c>rFs-sC-wc&1 z+cyOmp4T?_lI|Y1bTgCS4%W^kuzJvm-g}ZI*0*P8U?J(P+R_=`Yfy#C@*CM@gMBY$ z3y2Jekw%0t8e&%9pqWNlP9R<&AL=>)f_}y0(D-BI_kIbo2BR%st z$!O(-WmIG_VRJqtDYf31v06<)ikI13m}PK^0IV3kxN(D79~!ObV$5??H#FYqx7k^( zyT|*wtw+&aR#+=Cj+FfV^$KQ%9jk}u&p1a|cV-?_6I4`U#@O*&DA!GmX-%g^Y4`E- zSv+ek)A~Wt#8=9i3m|IP#t^yi${!t#ZhpM&=gF*Jy^j|wE0nD){sc4<4p~nBc2k8Q zv-9Jz>-MbEAxv*zqv}XP^{Z846jUNR#ss&eCjqU!@}}6BNmEztSze{-sS=yQ0cj$9fFeD};3BS~30U9=1DvQI(s$}WYQmC_O zU=7Q894Bmm^KXVod@NCR{xqw9)YkJWDPuJACcbAT2(7m0Smm^6PJ};GCLMC|LQmMu zo4Sxi8y7G1dsX-Gh@qHyBJPO}HiCh4m@*=yv*;E6@P;Xo$WO=P_zjs4t2RUw=ri&( zKgDt!=f+RvZ=@7hO>@gU;LdDdQv#9rf-=nmVWwBr%kfVyA{i5y>~%?7I((&!V|fvE z%Q}6At6~@c>dD)Urlz|xp>=Ua*p51kQ#Apf9f!0EEajbp2VMhiOIqYoaNRPL5-8=W zzt(I4e*s=P0u|L>vcFcsZ_(~JPIiC$7F$4_wL!jzUdH4d@oNZdg*9JYimAu>*85b0 z0A`t59A6*)5^V^Wxe#J{f5J0%Ga-bhrphV{U`-N`w4Kbn3b{d)g*98V^KvT*nmaf+ zjzSU=_O6fJmbaEO`3^mY6UCZ!17?p)hin4HyyzNw4FltxCANCF=HN_(V70M%wVkE# z+5=(piz*+P-giyaTh6vXEZHQ`&)@C-_VD?Kz^65)uRmBBVs)yp<`p0fc%d%{X;TOh z7~ma3-0rtrzz-omesYUplrb>tiNm(av{&ss*jPs!(dWF~yi%f(<{Fw?n<=y#7P&Tr8q(JXV5(13OMcS!!l=xQO2yaM?inZ+Zk(#>ExyAGh1Bguu2@cw{dHJ8 zGEx@_RQ8#mKmIl?XzOBr-KBb<)kLFsRZ@}m;Z(~W8Qq0VBkhY0ZDAwlhYNi9xuJ(! zJ4l!8ywIT2;WZ0hC0Q=m_Q^;6Oplz^@8f6=TEXVp$LckWpRKt+46&^=td0d}E+&9k zzE(`uiO2>g8^W=x*$dZKAg*$ESEIvkg?+CQKHoS&gvnMdDpGabS-xf<5PUL4E;=~1 zKxt&V9uDdcQcm6VQ}&6wm{@RvOGy?hW|Q60*#as>?r>T3MYem@d~TsKE7sO;%wKGp(*r_f+;ZIj!N_XN~aMn)+TO)H}!86yRD$VKFk% zUQ0AJ8!5jhP2kW0yqm7Kg3<&dpcaOlXP-?-kYK*BUcrAdp?0%A z>j@Np@O(USh8||eF>E25Ks&j|Pyyj^UyKI_u6F(&hnVs>7&Z6t;dEndJLkA1eI%+cFfwHeEGPQYAjxmkqoFpzCmzxFi{k$I@xsEM)1*@ zmkK%iNdNte(?$A-xbasfP1lK(snF|Jq73C=i77{g82ji_7amP8n^H|%TOCs99v8gc z02>IPbBgy|H&yv$y9&mi8igymt@C?VoKR)Yuwb@=IyJFf$mkSXlohD8Cmez3SwGaM zX~Ee|no?0bd>dwNtH-tV*aT~FyzUFjE1(mo3-bVq*?HFj+yp?&-V__P|^c8Z&3 z;hX<*x%rKKAKBu3v~MS&CXWM;2>0S&GKjx7*AF=E*%dgKiv@}PvY)=Wl5>`rQnzC@ zRJWiWI$8KoLBjLDchOTc?L(nL;(B;FH0UuM$1vUh56S%WeY|?wy~4dbCpF9zybHJG ziD`a7j2F{CQtYkJWanfV)fePv6||eR-V>F4L`rqrtH=9;9{retT8 zrle=*8|4Fa^Gn{(kwGB1#jqp6V$mS^TIdA`e%j$N(5Z)0iOcaA{^uX0wTlYee6FB z*-5~CK60)MnJvoM#^oU~&#pFv0BqE(T3=ib%*oEy)9 zC#4qPW-k}u?hKzMPKpxU`+nb_oian;6s*{sd2S{h9%^gWaE9d=Y#f#Y?Fjn)So6Z0 z@1nazm2CWm zZ|Ak~X}mWl`o|z5fUp&kV;?+1_PxAkuRk==ivz_W?dV9(z4cO_O<#%6Yl8W#E6Fmt0S8$P( z@6tKff^T~S^u9-^-uB2TyUU5$H#1Ad96}1}9zP5NKuS+ejs?o$QC2BCdtwqdt#1+M`)<|K%ov-I^qT7WDyA{9i_BwBC*CC8{qd*C7d|KES|FQ5e6 z>>xqxgN69KbC3$I_(?#Wp2*KBB;-kSe;fmdp+MW5frVneS8gBomxOt^Q=N{0=nTh! zHm*)z2#3GDt;z3{fw&5%H(=Kxb(Xsx_&5zl?lT5Fq86b=xdS!^^0 z^@GfbSj1okGs!~21@68qHGfq#v-^{Jf=Vgphvg?anlz}EX051sY=(2}zV9}Kg@XQ@ zCA=H8tyNeHHHD>cBJ~tpkc84jY$e@tMPE|^|QGPng_gaRkJri@RR&gG+ zzb;*-TDot&y!GQL#-*#q|6G_sSAFmTXEVXAv9PZTFb}ivgGs)^GOQ2((&! z@o`2a)6V4(613X6(|Y|?MJ#A=>+Vq;yfx>S4YYhc%0O;MmepO2)qqc+e)+-2l%^>0}a|H=+HgogP(tVPMD-@##HaKNGQX~ zFjn?J5kV9aV2vnPQlKZ@IX`Qr8ylZBCq$D|%+m9}>uJz8Iqu?;fYIJyi+bxlA;0f< zm|#AHyCRg0xi|tRg6X#v{kRXTGD6wqg`?`5FYcG;D294$4s(VpilztUdhw>!-L%8Z^0ZE?S78zeO3Dsu5U7ZjF4@%qPL$=e6o%QkKOL=;VVP!W8P?wEGV8mriY zxOBh66_7Ti#DTPAEodXCzQh%Ld(}oaaB1E|9$e-8xeOK>l_#SF<7t2h6PqjO-%z)c zjE2dLsii{#T6H0MJy{#6E|Emv+z@m8$nWR#;Qis@cK+-0#N)*0&x6Xz`!@@t$%QaR ziR~p^n;H#65;9Bcq!=>I*AP)ZI4cliQ#LYPa{8suSBs2%Q+LS`l>6aA)uA}>X^9i$ z11{>JDlW2z5-Ruo(Rw>ec!=$Pt@$P6@^`2YlH|58Or@=USq;sqF7i2f5Zb>3XCMyL zgpg1lFth$@b2nGN9NSMJ_DEUL|5_W7H<>F}jJDhG=|@DoLcX{jN&W}f%I$AI9&ImN zzJ){te&VeAkUfA*sXSyhX=z9aT1xsfOP58ST72vhOX<14HQ~9@ig=dmw&v=flxeA_ zU?y1yeuj!#qK=V5ow-)?6!`>fL?FlV2mctRi)&v)!l68}%AdrjlKSm8-LyZ30AcRb z*N@7$?}gUGq=vf&fk6hk0|N8G}W~XC!R6=q}pS zxfqN>uhlyiw#F43t!eO>oxk-;vh8d;T+G7G$OkVqSLt@Y2|{u;>R>ou7ePRdzWnA} zxIVeS|MO@0m}G4ej=2tgQG6yEXWdKy<onM3nF2`vka@jI8p7} z##nB-DV6reob4x+@A@q`r(kjKR>4y$XQVT=<%) zXV%K9uy%q`zZC(v%EIomfB!^i>pEgOT$@dP<$)YYaF>M1EV$^&pZZ5We1jE#ByXQm@~vg&2T^#_6!y7JzFzoTKR(hf{`4I z^ZNFFP%vM8h;+7maW4-O%YdX9Ljxy^pSwU6=tv^p#V>?eah?UFBRi|mQW%iOzyN

7k3T0dm(UQSnG)%yL&F&%4Za>>#Kb}LmRJK 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