diff --git a/MANIFEST.in b/MANIFEST.in
deleted file mode 100644
index 4abe9e6..0000000
--- a/MANIFEST.in
+++ /dev/null
@@ -1 +0,0 @@
-recursive-include ttp_templates *.txt *.py *.ttp
\ No newline at end of file
diff --git a/docs/index.md b/docs/index.md
index 65bf3de..7dba973 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,7 +1,7 @@
---
-**Templates count: 52**
+**Templates count: 55**
---
diff --git a/docs/ttp_templates/misc.N2G.cli_isis_data.cisco_xr.md b/docs/ttp_templates/misc.N2G.cli_isis_data.cisco_xr.md
index 58aae0a..f056eb8 100644
--- a/docs/ttp_templates/misc.N2G.cli_isis_data.cisco_xr.md
+++ b/docs/ttp_templates/misc.N2G.cli_isis_data.cisco_xr.md
@@ -15,68 +15,30 @@ Template to parse ISIS LSDB of Cisco IOS-XR devices out of
This template produces this structure:
```
-[[{'isis_processes': {'100': {'LSP': [{'hostname': 'R1-X1',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '9',
- 'local_ip': '10.123.0.17',
- 'metric': '16777214',
- 'peer_intf_id': '50',
- 'peer_ip': '10.123.0.18',
- 'peer_name': 'R1-X2'}],
- 'lsp_id': 'R1-X1',
- 'networks': [{'metric': '0',
- 'network': '10.111.1.1/32'}],
- 'rid': '10.111.1.1'},
- {'hostname': 'R1-X2',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '48',
- 'local_ip': '10.123.0.33',
- 'metric': '456',
- 'peer_intf_id': '53',
- 'peer_ip': '10.123.0.34',
- 'peer_name': 'R2-X2'}],
- 'lsp_id': 'R1-X2',
- 'networks': [{'metric': '0',
- 'network': '10.111.1.2/32'}],
- 'rid': '10.111.1.2'}]},
- '200': {'LSP': [{'hostname': 'R1-X1',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'bw_kbit': '10000000',
- 'delay_avg_us': '1',
- 'delay_max_us': '1',
- 'delay_min_us': '1',
- 'delay_variation_us': '0',
- 'local_intf_id': '68',
- 'metric': '10',
- 'peer_intf_id': '57',
- 'peer_name': 'R2-X1'}],
- 'lsp_id': 'R1-X1',
- 'networks': [{'metric': '0',
- 'network': 'fddd:2:c101::1/128'},,
- 'rid': 'fddd:2:c101::1'},
- {'hostname': 'R1-X2',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'bw_kbit': '10000000',
- 'delay_avg_us': '1',
- 'delay_max_us': '1',
- 'delay_min_us': '1',
- 'delay_variation_us': '0',
- 'local_intf_id': '68',
- 'metric': '10',
- 'peer_intf_id': '60',
- 'peer_name': 'R2-X2'}],
- 'lsp_id': 'R1-X2',
- 'networks': [{'metric': '0',
- 'network': 'fdff::/36'}],
- 'rid': 'fddd:2:c101::2'}]}}}]]
+[[{'isis_processes': {'100': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': 'Level-2',
+ 'links': [{'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '9',
+ 'local_ip': '10.123.0.17',
+ 'metric': '16777214',
+ 'peer_intf_id': '50',
+ 'peer_ip': '10.123.0.18',
+ 'peer_name': 'R1-X2'},
+ {'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '7',
+ 'local_ip': '10.123.0.25',
+ 'metric': '123',
+ 'peer_intf_id': '53',
+ 'peer_ip': '10.123.0.26',
+ 'peer_name': 'R2-X1'}],
+ 'networks': [{'isis_pid': '100',
+ 'metric': '0',
+ 'network': '10.111.1.1/32'}],
+ 'rid': '10.111.1.1'}]}}}]]
```
diff --git a/docs/ttp_templates/misc.N2G.cli_isis_data.juniper.md b/docs/ttp_templates/misc.N2G.cli_isis_data.juniper.md
new file mode 100644
index 0000000..0cbfe6e
--- /dev/null
+++ b/docs/ttp_templates/misc.N2G.cli_isis_data.juniper.md
@@ -0,0 +1,119 @@
+Reference path:
+```
+ttp://misc/N2G/cli_isis_data/juniper.txt
+```
+
+---
+
+
+
+Template to parse Juniper JunOS "show isis database extensive | no-more" output.
+
+
+Template to parse ISIS LSDB of Juniper JunOS devices out of
+"show isis database extensive | no-more" command output.
+
+For this sample data:
+```
+IS-IS level 2 link-state database:
+
+R1-X1.00-00 Sequence: 0x22425, Checksum: 0x8904, Lifetime: 463 secs
+ IS neighbor: R1-X2.00 Metric: 20
+ Two-way fragment: R1-X2.00-00, Two-way first fragment: R1-X2.00-00
+ IP prefix: 10.123.123.31/32 Metric: 0 Internal Up
+ IP prefix: 10.123.123.41/32 Metric: 0 Internal Up
+ V6 prefix: ::ffff:10.123.111.236/126 Metric: 20 Internal Up
+
+ Header: LSP ID: R1-X1.00-00, Length: 233 bytes
+ Allocated length: 284 bytes, Router ID: 10.123.123.31
+ Remaining lifetime: 463 secs, Level: 2, Interface: 80
+ Estimated free bytes: 51, Actual free bytes: 51
+ Aging timer expires in: 463 secs
+ Protocols: IP, IPv6
+
+ Packet: LSP ID: R1-X1.00-00, Length: 233 bytes, Lifetime : 1194 secs
+ Checksum: 0x8904, Sequence: 0x22425, Attributes: 0x3 L1 L2
+ NLPID: 0x83, Fixed length: 27 bytes, Version: 1, Sysid length: 0 bytes
+ Packet type: 20, Packet version: 1, Max area: 0
+
+ TLVs:
+ Area address: 49.0001 (3)
+ LSP Buffer Size: 1492
+ Speaks: IP
+ Speaks: IPV6
+ IP router id: 10.123.123.31
+ IP address: 10.123.123.31
+ IPv6 TE Router ID: 2001::10:123:123:31
+ Hostname: R1-X1
+ Extended IS Reachability TLV, Type: 22, Length: 85
+ IS extended neighbor: R1-X2.00, Metric: default 20 SubTLV len: 74
+ IP address: 10.123.111.238
+ Neighbor's IP address: 10.123.111.237
+ Local interface index: 332, Remote interface index: 461
+ Current reservable bandwidth:
+ Priority 0 : 7Gbps
+ Priority 1 : 7Gbps
+ Priority 2 : 7Gbps
+ Priority 3 : 7Gbps
+ Priority 4 : 7Gbps
+ Priority 5 : 7Gbps
+ Priority 6 : 6.7Gbps
+ Priority 7 : 6.7Gbps
+ Maximum reservable bandwidth: 7Gbps
+ Maximum bandwidth: 10Gbps
+ Administrative groups: 0 none
+ IPv6 prefix: ::ffff:10.123.111.236/126 Metric 20 Up
+ IP extended prefix: 10.123.123.31/32 metric 0 up
+ IP extended prefix: 10.123.123.41/32 metric 0 up
+ IP extended prefix: 10.123.111.236/30 metric 20 up
+ IP address: 10.123.123.41
+ Authentication data: 17 bytes
+ No queued transmissions
+```
+
+This template produces this result:
+```
+[[{'isis_processes': {'ISIS': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': '2',
+ 'links': [{'bw_gbit': '10',
+ 'local_intf_id': '332',
+ 'local_ip': '10.123.111.238',
+ 'metric': '20',
+ 'peer_intf_id': '461',
+ 'peer_ip': '10.123.111.237',
+ 'peer_name': 'R1-X2'}],
+ 'networks': [{'metric': '0',
+ 'network': '10.123.123.31/32'},
+ {'metric': '0',
+ 'network': '10.123.123.41/32'},
+ {'metric': '20',
+ 'network': '::ffff:10.123.111.236/126'}],
+ 'rid': '10.123.123.31',
+ 'rid_v6': '2001::10:123:123:31'}]}}}]]
+```
+
+Notes:
+
+- Process ID (PID) always set to `ISIS` value as PID does not present in
+ "show isis database extensive | no-more" command output on Juniper devices.
+
+
+
+---
+
+Template Content
+```
+
+Template to parse Juniper JunOS "show isis database extensive | no-more" output.
+
+
+
+# Starting with Netmiko 3.4.0 can use run_ttp method to populate this template with below commands output
+commands = [
+ "show isis database extensive | no-more",
+]
+
+
+
+```
+
\ No newline at end of file
diff --git a/docs/ttp_templates/misc.N2G.cli_l2_data.cisco_xr.md b/docs/ttp_templates/misc.N2G.cli_l2_data.cisco_xr.md
index cc1748b..637bbdb 100644
--- a/docs/ttp_templates/misc.N2G.cli_l2_data.cisco_xr.md
+++ b/docs/ttp_templates/misc.N2G.cli_l2_data.cisco_xr.md
@@ -9,6 +9,13 @@ ttp://misc/N2G/cli_l2_data/cisco_xr.txt
This template designed to parse Cisco IOSXR configuration and CDP and LLDP neighbors.
+Commands parsed:
+
+- show lldp - to extract local hostname
+- show lldp neighbors detail - to extract LLDP neighbors
+- show running-config interface - to extract interfaces description and LAGs
+- show cdp neighbors detail - show extract CDP neighbors
+- show interfaces - to extract interface state to add all connected nodes
@@ -21,8 +28,16 @@ This template designed to parse Cisco IOSXR configuration and CDP and LLDP neigh
This template designed to parse Cisco IOSXR configuration and CDP and LLDP neighbors.
+Commands parsed:
+
+- show lldp - to extract local hostname
+- show lldp neighbors detail - to extract LLDP neighbors
+- show running-config interface - to extract interfaces description and LAGs
+- show cdp neighbors detail - show extract CDP neighbors
+- show interfaces - to extract interface state to add all connected nodes
+
local_hostname="gethostname"
@@ -31,8 +46,27 @@ def check_is_physical_port(data):
if data.startswith(item) and not "." in item:
return data, {"is_physical_port": True}
return data
+
+def add_lldp_target_id(data):
+ """
+ Some LLDP peers output does not contain System Name, this macro
+ is to make sure we assign chassis_id as target.id in that case.
+ """
+ if (
+ not data.get("target", {}).get("id") and
+ data.get("data", {}).get("chassis_id")
+ ):
+ data.setdefault("target", {})
+ data["target"]["id"] = data["data"]["chassis_id"]
+ return data
+
+
+Global LLDP information: {{ _start_ }}
+ LLDP System Name: {{ local_hostname | record("local_hostname") }}
+
+
interface {{ interface | resuball(IfsNormalize) }}
@@ -63,15 +97,24 @@ interface {{ interface | resuball(IfsNormalize) }}
-
+
Local Interface: {{ src_label | resuball(IfsNormalize) }}
Chassis id: {{ data.chassis_id }}
Port id: {{ trgt_label | ORPHRASE | resuball(IfsNormalize) }}
Port Description: {{ data.peer_port_description | re(".+") }}
-System Name: {{ target.id | split(".") | item(0) | split("(") | item(0) }}
+System Name: {{ target.id | split("(") | item(0) }}
+System Name: {{ data.peer_system_name | PHRASE }}
System Capabilities: {{ data.peer_capabilities | ORPHRASE }}
IPv4 address: {{ target.top_label }}
{{ source | set("local_hostname") }}
+
+
+System Description: {{ _start_ }}
+ {{ peer_system_description | ORPHRASE | contains(",") }}
+{{ peer_system_description | ORPHRASE | contains(",") }}
+{{ _end_ }}
+
+
diff --git a/docs/ttp_templates/misc.N2G.cli_l2_data.juniper.md b/docs/ttp_templates/misc.N2G.cli_l2_data.juniper.md
new file mode 100644
index 0000000..99dad27
--- /dev/null
+++ b/docs/ttp_templates/misc.N2G.cli_l2_data.juniper.md
@@ -0,0 +1,107 @@
+Reference path:
+```
+ttp://misc/N2G/cli_l2_data/juniper.txt
+```
+
+---
+
+
+
+This template designed to parse Juniper JunOS configuration and LLDP neighbors.
+
+Commands parsed:
+
+- show lldp local-information - to extract local hostname
+- show lldp neighbors - to extract LLDP neighbors
+- show configuration interfaces | display set | no-more - to extract interfaces confgiuration and LAG details
+- show interfaces detail | no-more - to extract interfaces state to add all connected devices
+
+
+
+---
+
+Template Content
+```
+
+
+
+This template designed to parse Juniper JunOS configuration and LLDP neighbors.
+
+Commands parsed:
+
+- show lldp local-information - to extract local hostname
+- show lldp neighbors - to extract LLDP neighbors
+- show configuration interfaces | display set | no-more - to extract interfaces confgiuration and LAG details
+- show interfaces detail | no-more - to extract interfaces state to add all connected devices
+
+
+
+commands = [
+ "show lldp local-information",
+ "show lldp neighbors",
+ "show configuration interfaces | display set | no-more",
+ "show interfaces detail | no-more",
+]
+
+
+
+local_hostname="gethostname"
+
+
+def check_is_physical_port(data):
+ for item in _ttp_["vars"]["physical_ports"]:
+ if data.startswith(item) and not "." in item:
+ return data, {"is_physical_port": True}
+ return data
+
+def extract_lldp_peer(data):
+ if " " in data["info"]:
+ *port_info, peer_name = data.pop("info").split(" ")
+ data["data.peer_port_description"] = " ".join(port_info).strip()
+ else:
+ port_info, peer_name = data.pop("info"), data["data.chassis_id"]
+ data["data.peer_port_description"] = port_info
+
+ data["target.id"] = peer_name
+ data["trgt_label"] = ""
+
+ # check if port_info is name of the interface, use it as link trgt_label
+ if len(port_info) == 1 and not port_info[0].isdigit():
+ data["trgt_label"], _ = _ttp_["match"]["resuball"](port_info[0], "IfsNormalize")
+
+
+
+
+LLDP Local Information details {{ _start_ }}
+Chassis ID : {{ chassis_id }}
+System name : {{ local_hostname | record(local_hostname) }}
+System descr : {{ description | PHRASE }}
+
+{{ interface | resuball(IfsNormalize) }} {{ parent }} {{ id | DIGIT }} {{ description | ORPHRASE }} {{ status }}
+
+
+
+
+
+set interfaces {{ interface | resuball(IfsNormalize) }} description "{{ description | re(".+") }}"
+set interfaces {{ interface | resuball(IfsNormalize) }} ether-options 802.3ad {{ lag_id | DIGIT }}
+set interfaces {{ interface | resuball(IfsNormalize) }} mtu {{ mtu }}
+set interfaces {{ interface | resuball(IfsNormalize) }} aggregated-ether-options lacp {{ lag_mode }}
+
+
+
+
+Physical interface: {{ interface | _start_ | resuball(IfsNormalize) | macro("check_is_physical_port") }}, {{ admin | ORPHRASE }}, Physical link is {{ line | ORPHRASE }}
+ Description: {{ description | re(".+") }}
+ Link-level type: Ethernet, MTU: {{ mtu }}, Speed: {{ bw_gbits }}Gbps, {{ ignore(PHRASE) }}
+ Current address: {{ mac }}, Hardware address: {{ ignore }}
+
+
+
+
+{{ src_label | resuball(IfsNormalize) }} {{ data.parent_interface }} {{ data.chassis_id | MAC }} {{ info | re(".+") }}
+{{ source | set("local_hostname") }}
+
+
+```
+
\ No newline at end of file
diff --git a/docs/ttp_templates/platform.cisco_xr_show_isis_database_verbose.md b/docs/ttp_templates/platform.cisco_xr_show_isis_database_verbose.md
index ec9ae15..b089623 100644
--- a/docs/ttp_templates/platform.cisco_xr_show_isis_database_verbose.md
+++ b/docs/ttp_templates/platform.cisco_xr_show_isis_database_verbose.md
@@ -12,68 +12,30 @@ Template to parse ISIS LSDB of Cisco IOS-XR devices out of
This template produces this structure:
```
-[[{'isis_processes': {'100': {'LSP': [{'hostname': 'R1-X1',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '9',
- 'local_ip': '10.123.0.17',
- 'metric': '16777214',
- 'peer_intf_id': '50',
- 'peer_ip': '10.123.0.18',
- 'peer_name': 'R1-X2'}],
- 'lsp_id': 'R1-X1',
- 'networks': [{'metric': '0',
- 'network': '10.111.1.1/32'}],
- 'rid': '10.111.1.1'},
- {'hostname': 'R1-X2',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '48',
- 'local_ip': '10.123.0.33',
- 'metric': '456',
- 'peer_intf_id': '53',
- 'peer_ip': '10.123.0.34',
- 'peer_name': 'R2-X2'}],
- 'lsp_id': 'R1-X2',
- 'networks': [{'metric': '0',
- 'network': '10.111.1.2/32'}],
- 'rid': '10.111.1.2'}]},
- '200': {'LSP': [{'hostname': 'R1-X1',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'bw_kbit': '10000000',
- 'delay_avg_us': '1',
- 'delay_max_us': '1',
- 'delay_min_us': '1',
- 'delay_variation_us': '0',
- 'local_intf_id': '68',
- 'metric': '10',
- 'peer_intf_id': '57',
- 'peer_name': 'R2-X1'}],
- 'lsp_id': 'R1-X1',
- 'networks': [{'metric': '0',
- 'network': 'fddd:2:c101::1/128'},,
- 'rid': 'fddd:2:c101::1'},
- {'hostname': 'R1-X2',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'bw_kbit': '10000000',
- 'delay_avg_us': '1',
- 'delay_max_us': '1',
- 'delay_min_us': '1',
- 'delay_variation_us': '0',
- 'local_intf_id': '68',
- 'metric': '10',
- 'peer_intf_id': '60',
- 'peer_name': 'R2-X2'}],
- 'lsp_id': 'R1-X2',
- 'networks': [{'metric': '0',
- 'network': 'fdff::/36'}],
- 'rid': 'fddd:2:c101::2'}]}}}]]
+[[{'isis_processes': {'100': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': 'Level-2',
+ 'links': [{'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '9',
+ 'local_ip': '10.123.0.17',
+ 'metric': '16777214',
+ 'peer_intf_id': '50',
+ 'peer_ip': '10.123.0.18',
+ 'peer_name': 'R1-X2'},
+ {'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '7',
+ 'local_ip': '10.123.0.25',
+ 'metric': '123',
+ 'peer_intf_id': '53',
+ 'peer_ip': '10.123.0.26',
+ 'peer_name': 'R2-X1'}],
+ 'networks': [{'isis_pid': '100',
+ 'metric': '0',
+ 'network': '10.111.1.1/32'}],
+ 'rid': '10.111.1.1'}]}}}]]
```
@@ -88,92 +50,53 @@ Template to parse ISIS LSDB of Cisco IOS-XR devices out of
This template produces this structure:
'''
-[[{'isis_processes': {'100': {'LSP': [{'hostname': 'R1-X1',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '9',
- 'local_ip': '10.123.0.17',
- 'metric': '16777214',
- 'peer_intf_id': '50',
- 'peer_ip': '10.123.0.18',
- 'peer_name': 'R1-X2'}],
- 'lsp_id': 'R1-X1',
- 'networks': [{'metric': '0',
- 'network': '10.111.1.1/32'}],
- 'rid': '10.111.1.1'},
- {'hostname': 'R1-X2',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '48',
- 'local_ip': '10.123.0.33',
- 'metric': '456',
- 'peer_intf_id': '53',
- 'peer_ip': '10.123.0.34',
- 'peer_name': 'R2-X2'}],
- 'lsp_id': 'R1-X2',
- 'networks': [{'metric': '0',
- 'network': '10.111.1.2/32'}],
- 'rid': '10.111.1.2'}]},
- '200': {'LSP': [{'hostname': 'R1-X1',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'bw_kbit': '10000000',
- 'delay_avg_us': '1',
- 'delay_max_us': '1',
- 'delay_min_us': '1',
- 'delay_variation_us': '0',
- 'local_intf_id': '68',
- 'metric': '10',
- 'peer_intf_id': '57',
- 'peer_name': 'R2-X1'}],
- 'lsp_id': 'R1-X1',
- 'networks': [{'metric': '0',
- 'network': 'fddd:2:c101::1/128'},,
- 'rid': 'fddd:2:c101::1'},
- {'hostname': 'R1-X2',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'bw_kbit': '10000000',
- 'delay_avg_us': '1',
- 'delay_max_us': '1',
- 'delay_min_us': '1',
- 'delay_variation_us': '0',
- 'local_intf_id': '68',
- 'metric': '10',
- 'peer_intf_id': '60',
- 'peer_name': 'R2-X2'}],
- 'lsp_id': 'R1-X2',
- 'networks': [{'metric': '0',
- 'network': 'fdff::/36'}],
- 'rid': 'fddd:2:c101::2'}]}}}]]
+[[{'isis_processes': {'100': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': 'Level-2',
+ 'links': [{'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '9',
+ 'local_ip': '10.123.0.17',
+ 'metric': '16777214',
+ 'peer_intf_id': '50',
+ 'peer_ip': '10.123.0.18',
+ 'peer_name': 'R1-X2'},
+ {'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '7',
+ 'local_ip': '10.123.0.25',
+ 'metric': '123',
+ 'peer_intf_id': '53',
+ 'peer_ip': '10.123.0.26',
+ 'peer_name': 'R2-X1'}],
+ 'networks': [{'isis_pid': '100',
+ 'metric': '0',
+ 'network': '10.111.1.1/32'}],
+ 'rid': '10.111.1.1'}]}}}]]
'''
-
+
IS-IS {{ pid }} ({{ level }}) Link State Database
-
-{{ lsp_id | _start_ }}.00-00 * {{ ignore }} {{ ignore }} 65487/* 0/0/0
-{{ lsp_id | _start_ }}.00-00 {{ ignore }} {{ ignore }} 64768/65535 0/0/0
-{{ lsp_id | _start_ }}.00-00* {{ ignore }} {{ ignore }} 65487/* 0/0/0
+
+{{ hostname | _start_ }}.00-00{{ ignore(r"[\s\*]") }} {{ ignore }} {{ ignore }} {{ ignore(r"[/\d\s\*]+") }} 0/0/0
+{{ hostname | _start_ }}.00-00{{ ignore(r"[\s\*]") }} * {{ ignore }} {{ ignore }} {{ ignore(r"[/\d\s\*]+") }} 0/0/0
+
Auth: {{ auth }}, Length: 17
Area Address: {{ isis_area }}
Router ID: {{ rid }}
- Hostname: {{ hostname }}
- IPv6 Address: {{ rid }}
- IPv6 Router ID: {{ rid }}
-
-
+ IPv6 Router ID: {{ rid_v6 }}
+ IPv6 Router ID: {{ rid_v6 }}
+
+
Metric: {{ metric | _start_ }} IP-Extended {{ network }}
Metric: {{ metric | _start_ }} MT (IPv6 Unicast) IPv6 {{ network | _exact_ }}
Metric: {{ metric | _start_ }} MT (IPv6 Unicast) IPv6-Ext-InAr {{ network | _exact_ }}
-
+
Metric: {{ metric | _start_ }} IS-Extended {{ peer_name }}.00
Metric: {{ metric | _start_ }} MT (IPv6 Unicast) IS-Extended {{ peer_name }}.00
Local Interface ID: {{ local_intf_id }}, Remote Interface ID: {{ peer_intf_id }}
@@ -187,10 +110,10 @@ IS-IS {{ pid }} ({{ level }}) Link State Database
END.X SID: {{ sid | IPV6}} B:0 S:0 P:0 uA (PSP/USD) Alg:{{ algo }}
Block Length: {{ block_length }}, Node-ID Length: {{ node_id_length }}, Func-Length: {{ func_length }}, Args-Length: {{ args_length }}
-
+
-
+
SRv6 Locator: MT (IPv6 Unicast) {{ locator | IPV6 }}/{{ mask }} D:0 Metric: 0 Algorithm: {{ algo }}
diff --git a/docs/ttp_templates/platform.juniper_show_isis_database_verbose_pipe_no_more.md b/docs/ttp_templates/platform.juniper_show_isis_database_verbose_pipe_no_more.md
new file mode 100644
index 0000000..e16d65c
--- /dev/null
+++ b/docs/ttp_templates/platform.juniper_show_isis_database_verbose_pipe_no_more.md
@@ -0,0 +1,218 @@
+Reference path:
+```
+ttp://platform/juniper_show_isis_database_verbose_pipe_no_more.txt
+```
+
+---
+
+
+
+Template to parse ISIS LSDB of Juniper JunOS devices out of
+"show isis database extensive | no-more" command output.
+
+For this sample data:
+```
+IS-IS level 2 link-state database:
+
+R1-X1.00-00 Sequence: 0x22425, Checksum: 0x8904, Lifetime: 463 secs
+ IS neighbor: R1-X2.00 Metric: 20
+ Two-way fragment: R1-X2.00-00, Two-way first fragment: R1-X2.00-00
+ IP prefix: 10.123.123.31/32 Metric: 0 Internal Up
+ IP prefix: 10.123.123.41/32 Metric: 0 Internal Up
+ V6 prefix: ::ffff:10.123.111.236/126 Metric: 20 Internal Up
+
+ Header: LSP ID: R1-X1.00-00, Length: 233 bytes
+ Allocated length: 284 bytes, Router ID: 10.123.123.31
+ Remaining lifetime: 463 secs, Level: 2, Interface: 80
+ Estimated free bytes: 51, Actual free bytes: 51
+ Aging timer expires in: 463 secs
+ Protocols: IP, IPv6
+
+ Packet: LSP ID: R1-X1.00-00, Length: 233 bytes, Lifetime : 1194 secs
+ Checksum: 0x8904, Sequence: 0x22425, Attributes: 0x3 L1 L2
+ NLPID: 0x83, Fixed length: 27 bytes, Version: 1, Sysid length: 0 bytes
+ Packet type: 20, Packet version: 1, Max area: 0
+
+ TLVs:
+ Area address: 49.0001 (3)
+ LSP Buffer Size: 1492
+ Speaks: IP
+ Speaks: IPV6
+ IP router id: 10.123.123.31
+ IP address: 10.123.123.31
+ IPv6 TE Router ID: 2001::10:123:123:31
+ Hostname: R1-X1
+ Extended IS Reachability TLV, Type: 22, Length: 85
+ IS extended neighbor: R1-X2.00, Metric: default 20 SubTLV len: 74
+ IP address: 10.123.111.238
+ Neighbor's IP address: 10.123.111.237
+ Local interface index: 332, Remote interface index: 461
+ Current reservable bandwidth:
+ Priority 0 : 7Gbps
+ Priority 1 : 7Gbps
+ Priority 2 : 7Gbps
+ Priority 3 : 7Gbps
+ Priority 4 : 7Gbps
+ Priority 5 : 7Gbps
+ Priority 6 : 6.7Gbps
+ Priority 7 : 6.7Gbps
+ Maximum reservable bandwidth: 7Gbps
+ Maximum bandwidth: 10Gbps
+ Administrative groups: 0 none
+ IPv6 prefix: ::ffff:10.123.111.236/126 Metric 20 Up
+ IP extended prefix: 10.123.123.31/32 metric 0 up
+ IP extended prefix: 10.123.123.41/32 metric 0 up
+ IP extended prefix: 10.123.111.236/30 metric 20 up
+ IP address: 10.123.123.41
+ Authentication data: 17 bytes
+ No queued transmissions
+```
+
+This template produces this result:
+```
+[[{'isis_processes': {'ISIS': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': '2',
+ 'links': [{'bw_gbit': '10',
+ 'local_intf_id': '332',
+ 'local_ip': '10.123.111.238',
+ 'metric': '20',
+ 'peer_intf_id': '461',
+ 'peer_ip': '10.123.111.237',
+ 'peer_name': 'R1-X2'}],
+ 'networks': [{'metric': '0',
+ 'network': '10.123.123.31/32'},
+ {'metric': '0',
+ 'network': '10.123.123.41/32'},
+ {'metric': '20',
+ 'network': '::ffff:10.123.111.236/126'}],
+ 'rid': '10.123.123.31',
+ 'rid_v6': '2001::10:123:123:31'}]}}}]]
+```
+
+Notes:
+
+- Process ID (PID) always set to `ISIS` value as PID does not present in
+ "show isis database extensive | no-more" command output on Juniper devices.
+
+
+
+---
+
+Template Content
+```
+
+Template to parse ISIS LSDB of Juniper JunOS devices out of
+"show isis database extensive | no-more" command output.
+
+For this sample data:
+'''
+IS-IS level 2 link-state database:
+
+R1-X1.00-00 Sequence: 0x22425, Checksum: 0x8904, Lifetime: 463 secs
+ IS neighbor: R1-X2.00 Metric: 20
+ Two-way fragment: R1-X2.00-00, Two-way first fragment: R1-X2.00-00
+ IP prefix: 10.123.123.31/32 Metric: 0 Internal Up
+ IP prefix: 10.123.123.41/32 Metric: 0 Internal Up
+ V6 prefix: ::ffff:10.123.111.236/126 Metric: 20 Internal Up
+
+ Header: LSP ID: R1-X1.00-00, Length: 233 bytes
+ Allocated length: 284 bytes, Router ID: 10.123.123.31
+ Remaining lifetime: 463 secs, Level: 2, Interface: 80
+ Estimated free bytes: 51, Actual free bytes: 51
+ Aging timer expires in: 463 secs
+ Protocols: IP, IPv6
+
+ Packet: LSP ID: R1-X1.00-00, Length: 233 bytes, Lifetime : 1194 secs
+ Checksum: 0x8904, Sequence: 0x22425, Attributes: 0x3 L1 L2
+ NLPID: 0x83, Fixed length: 27 bytes, Version: 1, Sysid length: 0 bytes
+ Packet type: 20, Packet version: 1, Max area: 0
+
+ TLVs:
+ Area address: 49.0001 (3)
+ LSP Buffer Size: 1492
+ Speaks: IP
+ Speaks: IPV6
+ IP router id: 10.123.123.31
+ IP address: 10.123.123.31
+ IPv6 TE Router ID: 2001::10:123:123:31
+ Hostname: R1-X1
+ Extended IS Reachability TLV, Type: 22, Length: 85
+ IS extended neighbor: R1-X2.00, Metric: default 20 SubTLV len: 74
+ IP address: 10.123.111.238
+ Neighbor's IP address: 10.123.111.237
+ Local interface index: 332, Remote interface index: 461
+ Current reservable bandwidth:
+ Priority 0 : 7Gbps
+ Priority 1 : 7Gbps
+ Priority 2 : 7Gbps
+ Priority 3 : 7Gbps
+ Priority 4 : 7Gbps
+ Priority 5 : 7Gbps
+ Priority 6 : 6.7Gbps
+ Priority 7 : 6.7Gbps
+ Maximum reservable bandwidth: 7Gbps
+ Maximum bandwidth: 10Gbps
+ Administrative groups: 0 none
+ IPv6 prefix: ::ffff:10.123.111.236/126 Metric 20 Up
+ IP extended prefix: 10.123.123.31/32 metric 0 up
+ IP extended prefix: 10.123.123.41/32 metric 0 up
+ IP extended prefix: 10.123.111.236/30 metric 20 up
+ IP address: 10.123.123.41
+ Authentication data: 17 bytes
+ No queued transmissions
+'''
+
+This template produces this result:
+'''
+[[{'isis_processes': {'ISIS': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': '2',
+ 'links': [{'bw_gbit': '10',
+ 'local_intf_id': '332',
+ 'local_ip': '10.123.111.238',
+ 'metric': '20',
+ 'peer_intf_id': '461',
+ 'peer_ip': '10.123.111.237',
+ 'peer_name': 'R1-X2'}],
+ 'networks': [{'metric': '0',
+ 'network': '10.123.123.31/32'},
+ {'metric': '0',
+ 'network': '10.123.123.41/32'},
+ {'metric': '20',
+ 'network': '::ffff:10.123.111.236/126'}],
+ 'rid': '10.123.123.31',
+ 'rid_v6': '2001::10:123:123:31'}]}}}]]
+'''
+
+Notes:
+
+- Process ID (PID) always set to 'ISIS' value as PID does not present in
+ "show isis database extensive | no-more" command output on Juniper devices.
+
+
+
+IS-IS level {{ level }} link-state database:
+
+
+{{ hostname }}.00-00 Sequence: {{ ignore }}, Checksum: {{ ignore }}, Lifetime: {{ ignore }} secs
+
+ Area address: {{ isis_area }} (3)
+ IP router id: {{ rid }}
+ IPv6 TE Router ID: {{ rid_v6 }}
+
+
+ IP prefix: {{ network }} Metric: {{ metric | _start_ }} Internal Up
+ V6 prefix: {{ network }} Metric: {{ metric | _start_ }} Internal Up
+
+
+
+ IS extended neighbor: {{ peer_name }}.00, Metric: default {{ metric | _start_ }} SubTLV len: 74
+ IP address: {{ local_ip }}
+ Neighbor's IP address: {{ peer_ip }}
+ Local interface index: {{ local_intf_id }}, Remote interface index: {{ peer_intf_id }}
+ Maximum bandwidth: {{ bw_gbit }}Gbps
+
+
+
+
+```
+
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index a95b342..723b62f 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -26,11 +26,13 @@ nav:
- cli_ip_data.huawei: ttp_templates/misc.N2G.cli_ip_data.huawei.md
- cli_ip_data.readme: ttp_templates/misc.N2G.cli_ip_data.readme.md
- cli_isis_data.cisco_xr: ttp_templates/misc.N2G.cli_isis_data.cisco_xr.md
+ - cli_isis_data.juniper: ttp_templates/misc.N2G.cli_isis_data.juniper.md
- cli_isis_data.readme: ttp_templates/misc.N2G.cli_isis_data.readme.md
- cli_l2_data.cisco_ios: ttp_templates/misc.N2G.cli_l2_data.cisco_ios.md
- cli_l2_data.cisco_nxos: ttp_templates/misc.N2G.cli_l2_data.cisco_nxos.md
- cli_l2_data.cisco_xr: ttp_templates/misc.N2G.cli_l2_data.cisco_xr.md
- cli_l2_data.huawei: ttp_templates/misc.N2G.cli_l2_data.huawei.md
+ - cli_l2_data.juniper: ttp_templates/misc.N2G.cli_l2_data.juniper.md
- cli_l2_data.readme: ttp_templates/misc.N2G.cli_l2_data.readme.md
- cli_ospf_data.cisco_ios: ttp_templates/misc.N2G.cli_ospf_data.cisco_ios.md
- cli_ospf_data.cisco_xr: ttp_templates/misc.N2G.cli_ospf_data.cisco_xr.md
@@ -69,6 +71,7 @@ nav:
- cisco_xr_show_running_config_interface: ttp_templates/platform.cisco_xr_show_running_config_interface.md
- huawei_display_current_configuration_interface: ttp_templates/platform.huawei_display_current_configuration_interface.md
- huawei_display_ospf_lsdb_router: ttp_templates/platform.huawei_display_ospf_lsdb_router.md
+ - juniper_show_isis_database_verbose_pipe_no_more: ttp_templates/platform.juniper_show_isis_database_verbose_pipe_no_more.md
- test_platform_show_run_pipe_sec_interface: ttp_templates/platform.test_platform_show_run_pipe_sec_interface.md
- YANG:
- ietf-interfaces_cisco_ios: ttp_templates/yang.ietf-interfaces_cisco_ios.md
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 0000000..5255378
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,1694 @@
+[[package]]
+name = "astroid"
+version = "2.9.3"
+description = "An abstract syntax tree for Python with inference support."
+category = "dev"
+optional = false
+python-versions = ">=3.6.2"
+
+[package.dependencies]
+lazy-object-proxy = ">=1.4.0"
+typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""}
+typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""}
+wrapt = ">=1.11,<1.14"
+
+[[package]]
+name = "astunparse"
+version = "1.6.3"
+description = "An AST unparser for Python"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+six = ">=1.6.1,<2.0"
+
+[[package]]
+name = "atomicwrites"
+version = "1.4.0"
+description = "Atomic file writes."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "attrs"
+version = "21.4.0"
+description = "Classes Without Boilerplate"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.extras]
+dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"]
+docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
+tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
+tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"]
+
+[[package]]
+name = "bandit"
+version = "1.7.4"
+description = "Security oriented static analyser for python code."
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""}
+GitPython = ">=1.0.1"
+PyYAML = ">=5.3.1"
+stevedore = ">=1.20.0"
+
+[package.extras]
+test = ["coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "toml", "beautifulsoup4 (>=4.8.0)", "pylint (==1.9.4)"]
+toml = ["toml"]
+yaml = ["pyyaml"]
+
+[[package]]
+name = "bcrypt"
+version = "3.2.2"
+description = "Modern password hashing for your software and your servers"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+cffi = ">=1.1"
+
+[package.extras]
+tests = ["pytest (>=3.2.1,!=3.3.0)"]
+typecheck = ["mypy"]
+
+[[package]]
+name = "black"
+version = "22.3.0"
+description = "The uncompromising code formatter."
+category = "dev"
+optional = false
+python-versions = ">=3.6.2"
+
+[package.dependencies]
+click = ">=8.0.0"
+mypy-extensions = ">=0.4.3"
+pathspec = ">=0.9.0"
+platformdirs = ">=2"
+tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
+typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""}
+typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
+
+[package.extras]
+colorama = ["colorama (>=0.4.3)"]
+d = ["aiohttp (>=3.7.4)"]
+jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
+uvloop = ["uvloop (>=0.15.2)"]
+
+[[package]]
+name = "cached-property"
+version = "1.5.2"
+description = "A decorator for caching properties in classes."
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "cerberus"
+version = "1.3.4"
+description = "Lightweight, extensible schema and data validation tool for Python dictionaries."
+category = "dev"
+optional = false
+python-versions = ">=2.7"
+
+[[package]]
+name = "cffi"
+version = "1.15.0"
+description = "Foreign Function Interface for Python calling C code."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+pycparser = "*"
+
+[[package]]
+name = "cfgv"
+version = "3.3.1"
+description = "Validate configuration and produce human readable error messages."
+category = "dev"
+optional = false
+python-versions = ">=3.6.1"
+
+[[package]]
+name = "click"
+version = "8.1.3"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+
+[[package]]
+name = "colorama"
+version = "0.4.5"
+description = "Cross-platform colored terminal text."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "cryptography"
+version = "37.0.3"
+description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+cffi = ">=1.12"
+
+[package.extras]
+docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"]
+docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
+pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
+sdist = ["setuptools_rust (>=0.11.4)"]
+ssh = ["bcrypt (>=3.1.5)"]
+test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
+
+[[package]]
+name = "deepdiff"
+version = "5.8.1"
+description = "Deep Difference and Search of any Python object/data."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+ordered-set = ">=4.1.0,<4.2.0"
+
+[package.extras]
+cli = ["click (==8.0.3)", "pyyaml (==5.4.1)", "toml (==0.10.2)", "clevercsv (==0.7.1)"]
+
+[[package]]
+name = "distlib"
+version = "0.3.4"
+description = "Distribution utilities"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "et-xmlfile"
+version = "1.1.0"
+description = "An implementation of lxml.xmlfile for the standard library"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "filelock"
+version = "3.7.1"
+description = "A platform independent file lock."
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"]
+testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"]
+
+[[package]]
+name = "flake8"
+version = "4.0.1"
+description = "the modular source code checker: pep8 pyflakes and co"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""}
+mccabe = ">=0.6.0,<0.7.0"
+pycodestyle = ">=2.8.0,<2.9.0"
+pyflakes = ">=2.4.0,<2.5.0"
+
+[[package]]
+name = "future"
+version = "0.18.2"
+description = "Clean single-source support for Python 3 and 2"
+category = "dev"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "ghp-import"
+version = "2.1.0"
+description = "Copy your docs directly to the gh-pages branch."
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+python-dateutil = ">=2.8.1"
+
+[package.extras]
+dev = ["twine", "markdown", "flake8", "wheel"]
+
+[[package]]
+name = "gitdb"
+version = "4.0.9"
+description = "Git Object Database"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+smmap = ">=3.0.1,<6"
+
+[[package]]
+name = "gitpython"
+version = "3.1.27"
+description = "GitPython is a python library used to interact with Git repositories"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+gitdb = ">=4.0.1,<5"
+typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""}
+
+[[package]]
+name = "griffe"
+version = "0.21.0"
+description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+cached-property = {version = "*", markers = "python_version < \"3.8\""}
+
+[package.extras]
+async = ["aiofiles (>=0.7,<1.0)"]
+
+[[package]]
+name = "identify"
+version = "2.5.1"
+description = "File identification library for Python"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+license = ["ukkonen"]
+
+[[package]]
+name = "importlib-metadata"
+version = "4.2.0"
+description = "Read metadata from Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
+
+[[package]]
+name = "iniconfig"
+version = "1.1.1"
+description = "iniconfig: brain-dead simple config-ini parsing"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "isort"
+version = "5.10.1"
+description = "A Python utility / library to sort Python imports."
+category = "dev"
+optional = false
+python-versions = ">=3.6.1,<4.0"
+
+[package.extras]
+pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
+requirements_deprecated_finder = ["pipreqs", "pip-api"]
+colors = ["colorama (>=0.4.3,<0.5.0)"]
+plugins = ["setuptools"]
+
+[[package]]
+name = "jinja2"
+version = "3.0.3"
+description = "A very fast and expressive template engine."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+MarkupSafe = ">=2.0"
+
+[package.extras]
+i18n = ["Babel (>=2.7)"]
+
+[[package]]
+name = "lazy-object-proxy"
+version = "1.7.1"
+description = "A fast and thorough lazy object proxy."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "markdown"
+version = "3.3.5"
+description = "Python implementation of Markdown."
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.extras]
+testing = ["coverage", "pyyaml"]
+
+[[package]]
+name = "markupsafe"
+version = "2.1.1"
+description = "Safely add untrusted strings to HTML/XML markup."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "mccabe"
+version = "0.6.1"
+description = "McCabe checker, plugin for flake8"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "mergedeep"
+version = "1.3.4"
+description = "A deep merge function for 🐍."
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[[package]]
+name = "mkdocs"
+version = "1.2.4"
+description = "Project documentation with Markdown."
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+click = ">=3.3"
+ghp-import = ">=1.0"
+importlib-metadata = ">=3.10"
+Jinja2 = ">=2.10.1"
+Markdown = ">=3.2.1"
+mergedeep = ">=1.3.4"
+packaging = ">=20.5"
+PyYAML = ">=3.10"
+pyyaml-env-tag = ">=0.1"
+watchdog = ">=2.0"
+
+[package.extras]
+i18n = ["babel (>=2.9.0)"]
+
+[[package]]
+name = "mkdocs-autorefs"
+version = "0.4.1"
+description = "Automatically link across pages in MkDocs."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+Markdown = ">=3.3"
+mkdocs = ">=1.1"
+
+[[package]]
+name = "mkdocs-material"
+version = "7.2.2"
+description = "A Material Design theme for MkDocs"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+markdown = ">=3.2"
+mkdocs = ">=1.1"
+mkdocs-material-extensions = ">=1.0"
+Pygments = ">=2.4"
+pymdown-extensions = ">=7.0"
+
+[[package]]
+name = "mkdocs-material-extensions"
+version = "1.0.1"
+description = "Extension pack for Python Markdown."
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[package.dependencies]
+mkdocs-material = ">=5.0.0"
+
+[[package]]
+name = "mkdocstrings"
+version = "0.18.1"
+description = "Automatic documentation from sources, for MkDocs."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+Jinja2 = ">=2.11.1"
+Markdown = ">=3.3"
+MarkupSafe = ">=1.1"
+mkdocs = ">=1.2"
+mkdocs-autorefs = ">=0.3.1"
+mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""}
+mkdocstrings-python-legacy = ">=0.2"
+pymdown-extensions = ">=6.3"
+
+[package.extras]
+crystal = ["mkdocstrings-crystal (>=0.3.4)"]
+python = ["mkdocstrings-python (>=0.5.2)"]
+python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"]
+
+[[package]]
+name = "mkdocstrings-python"
+version = "0.6.6"
+description = "A Python handler for mkdocstrings."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+griffe = ">=0.11.1"
+mkdocstrings = ">=0.18"
+
+[[package]]
+name = "mkdocstrings-python-legacy"
+version = "0.2.2"
+description = "A legacy Python handler for mkdocstrings."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+mkdocstrings = ">=0.18"
+pytkdocs = ">=0.14"
+
+[[package]]
+name = "mypy-extensions"
+version = "0.4.3"
+description = "Experimental type system extensions for programs checked with the mypy typechecker."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "netmiko"
+version = "3.4.0"
+description = "Multi-vendor library to simplify Paramiko SSH connections to network devices"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+ntc-templates = "*"
+paramiko = ">=2.6.0"
+pyserial = "*"
+scp = ">=0.13.2"
+tenacity = "*"
+
+[package.extras]
+test = ["pyyaml (>=5.1.2)", "pytest (>=5.1.2)"]
+
+[[package]]
+name = "nodeenv"
+version = "1.7.0"
+description = "Node.js virtual environment builder"
+category = "dev"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*"
+
+[[package]]
+name = "ntc-templates"
+version = "3.0.0"
+description = "TextFSM Templates for Network Devices, and Python wrapper for TextFSM's CliTable."
+category = "dev"
+optional = false
+python-versions = ">=3.6,<4.0"
+
+[package.dependencies]
+textfsm = ">=1.1.0,<2.0.0"
+
+[[package]]
+name = "openpyxl"
+version = "3.0.10"
+description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+et-xmlfile = "*"
+
+[[package]]
+name = "ordered-set"
+version = "4.1.0"
+description = "An OrderedSet is a custom MutableSet that remembers its order, so that every"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+dev = ["pytest", "black", "mypy"]
+
+[[package]]
+name = "packaging"
+version = "21.3"
+description = "Core utilities for Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
+
+[[package]]
+name = "paramiko"
+version = "2.11.0"
+description = "SSH2 protocol library"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+bcrypt = ">=3.1.3"
+cryptography = ">=2.5"
+pynacl = ">=1.0.1"
+six = "*"
+
+[package.extras]
+all = ["pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "bcrypt (>=3.1.3)", "invoke (>=1.3)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"]
+ed25519 = ["pynacl (>=1.0.1)", "bcrypt (>=3.1.3)"]
+gssapi = ["pyasn1 (>=0.1.7)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"]
+invoke = ["invoke (>=1.3)"]
+
+[[package]]
+name = "pathspec"
+version = "0.9.0"
+description = "Utility library for gitignore style pattern matching of file paths."
+category = "dev"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+
+[[package]]
+name = "pbr"
+version = "5.9.0"
+description = "Python Build Reasonableness"
+category = "dev"
+optional = false
+python-versions = ">=2.6"
+
+[[package]]
+name = "platformdirs"
+version = "2.5.2"
+description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"]
+test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"]
+
+[[package]]
+name = "pluggy"
+version = "1.0.0"
+description = "plugin and hook calling mechanisms for python"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
+
+[[package]]
+name = "pre-commit"
+version = "2.15.0"
+description = "A framework for managing and maintaining multi-language pre-commit hooks."
+category = "dev"
+optional = false
+python-versions = ">=3.6.1"
+
+[package.dependencies]
+cfgv = ">=2.0.0"
+identify = ">=1.0.0"
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+nodeenv = ">=0.11.1"
+pyyaml = ">=5.1"
+toml = "*"
+virtualenv = ">=20.0.8"
+
+[[package]]
+name = "py"
+version = "1.11.0"
+description = "library with cross-python path, ini-parsing, io, code, log facilities"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "pycodestyle"
+version = "2.8.0"
+description = "Python style guide checker"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "pycparser"
+version = "2.21"
+description = "C parser in Python"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "pyenchant"
+version = "3.2.2"
+description = "Python bindings for the Enchant spellchecking system"
+category = "dev"
+optional = false
+python-versions = ">=3.5"
+
+[[package]]
+name = "pyflakes"
+version = "2.4.0"
+description = "passive checker of Python programs"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "pygments"
+version = "2.12.0"
+description = "Pygments is a syntax highlighting package written in Python."
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[[package]]
+name = "pylint"
+version = "2.12.2"
+description = "python code static checker"
+category = "dev"
+optional = false
+python-versions = ">=3.6.2"
+
+[package.dependencies]
+astroid = ">=2.9.0,<2.10"
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+isort = ">=4.2.5,<6"
+mccabe = ">=0.6,<0.7"
+platformdirs = ">=2.2.0"
+toml = ">=0.9.2"
+typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""}
+
+[[package]]
+name = "pymdown-extensions"
+version = "9.5"
+description = "Extension pack for Python Markdown."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+markdown = ">=3.2"
+
+[[package]]
+name = "pynacl"
+version = "1.5.0"
+description = "Python binding to the Networking and Cryptography (NaCl) library"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+cffi = ">=1.4.1"
+
+[package.extras]
+docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"]
+tests = ["pytest (>=3.2.1,!=3.3.0)", "hypothesis (>=3.27.0)"]
+
+[[package]]
+name = "pyparsing"
+version = "3.0.9"
+description = "pyparsing module - Classes and methods to define and execute parsing grammars"
+category = "main"
+optional = false
+python-versions = ">=3.6.8"
+
+[package.extras]
+diagrams = ["railroad-diagrams", "jinja2"]
+
+[[package]]
+name = "pyserial"
+version = "3.5"
+description = "Python Serial Port Extension"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.extras]
+cp2110 = ["hidapi"]
+
+[[package]]
+name = "pytest"
+version = "7.1.2"
+description = "pytest: simple powerful testing with Python"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
+attrs = ">=19.2.0"
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+iniconfig = "*"
+packaging = "*"
+pluggy = ">=0.12,<2.0"
+py = ">=1.8.2"
+tomli = ">=1.0.0"
+
+[package.extras]
+testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"]
+
+[[package]]
+name = "python-dateutil"
+version = "2.8.2"
+description = "Extensions to the standard Python datetime module"
+category = "main"
+optional = true
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+name = "pytkdocs"
+version = "0.16.1"
+description = "Load Python objects documentation."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""}
+cached-property = {version = ">=1.5", markers = "python_version < \"3.8\""}
+typing-extensions = {version = ">=3.7", markers = "python_version < \"3.8\""}
+
+[package.extras]
+numpy-style = ["docstring_parser (>=0.7)"]
+
+[[package]]
+name = "pyxb"
+version = "1.2.6"
+description = "Python XML Schema Bindings"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "pyyaml"
+version = "6.0"
+description = "YAML parser and emitter for Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "pyyaml-env-tag"
+version = "0.1"
+description = "A custom YAML tag for referencing environment variables in YAML files. "
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+pyyaml = "*"
+
+[[package]]
+name = "scp"
+version = "0.14.4"
+description = "scp module for paramiko"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+paramiko = "*"
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "smmap"
+version = "5.0.0"
+description = "A pure Python implementation of a sliding window memory map manager"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "stevedore"
+version = "3.5.0"
+description = "Manage dynamic plugins for Python applications"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""}
+pbr = ">=2.0.0,<2.1.0 || >2.1.0"
+
+[[package]]
+name = "tabulate"
+version = "0.8.10"
+description = "Pretty-print tabular data"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.extras]
+widechars = ["wcwidth"]
+
+[[package]]
+name = "tenacity"
+version = "8.0.1"
+description = "Retry code until it succeeds"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+doc = ["reno", "sphinx", "tornado (>=4.5)"]
+
+[[package]]
+name = "textfsm"
+version = "1.1.2"
+description = "Python module for parsing semi-structured text into python tables."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+future = "*"
+six = "*"
+
+[[package]]
+name = "toml"
+version = "0.10.2"
+description = "Python Library for Tom's Obvious, Minimal Language"
+category = "dev"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "tomli"
+version = "2.0.1"
+description = "A lil' TOML parser"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "ttp"
+version = "0.9.0"
+description = "Template Text Parser"
+category = "main"
+optional = false
+python-versions = ">=2.7,<4.0"
+
+[package.extras]
+full = ["cerberus (>=1.3.0,<1.4.0)", "jinja2 (>=3.0.0,<3.1.0)", "pyyaml (==6.0)", "deepdiff (>=5.8.0,<5.9.0)", "openpyxl (>=3.0.0,<3.1.0)", "tabulate (>=0.8.0,<0.9.0)", "ttp_templates (<1.0.0)", "yangson (>=1.4.0,<1.5.0)", "n2g (>=0.2.0,<0.3.0)"]
+docs = ["readthedocs-sphinx-search (==0.1.1)", "Sphinx (==4.3.0)", "sphinx_rtd_theme (==1.0.0)", "sphinxcontrib-applehelp (==1.0.1)", "sphinxcontrib-devhelp (==1.0.1)", "sphinxcontrib-htmlhelp (==2.0.0)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib-qthelp (==1.0.2)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-spelling (==7.2.1)"]
+
+[[package]]
+name = "typed-ast"
+version = "1.5.4"
+description = "a fork of Python 2 and 3 ast modules with type comment support"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "typing-extensions"
+version = "4.2.0"
+description = "Backported and Experimental Type Hints for Python 3.7+"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "virtualenv"
+version = "20.15.0"
+description = "Virtual Python Environment builder"
+category = "dev"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+
+[package.dependencies]
+distlib = ">=0.3.1,<1"
+filelock = ">=3.2,<4"
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+platformdirs = ">=2,<3"
+six = ">=1.9.0,<2"
+
+[package.extras]
+docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"]
+testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"]
+
+[[package]]
+name = "watchdog"
+version = "2.1.9"
+description = "Filesystem events monitoring"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.extras]
+watchmedo = ["PyYAML (>=3.10)"]
+
+[[package]]
+name = "wrapt"
+version = "1.13.3"
+description = "Module for decorators, wrappers and monkey patching."
+category = "dev"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+
+[[package]]
+name = "yangson"
+version = "1.4.13"
+description = "Library for working with data modelled in YANG"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+PyXB = "*"
+
+[[package]]
+name = "zipp"
+version = "3.8.0"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = "^3.6"
+content-hash = "5c5c8eac07a6116bb3fa4dea5dd762c56c589a7565b6776e3edc09b44e4b8cbe"
+
+[metadata.files]
+astroid = [
+ {file = "astroid-2.9.3-py3-none-any.whl", hash = "sha256:506daabe5edffb7e696ad82483ad0228245a9742ed7d2d8c9cdb31537decf9f6"},
+ {file = "astroid-2.9.3.tar.gz", hash = "sha256:1efdf4e867d4d8ba4a9f6cf9ce07cd182c4c41de77f23814feb27ca93ca9d877"},
+]
+astunparse = [
+ {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"},
+ {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"},
+]
+atomicwrites = [
+ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
+ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
+]
+attrs = [
+ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"},
+ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"},
+]
+bandit = [
+ {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"},
+ {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"},
+]
+bcrypt = [
+ {file = "bcrypt-3.2.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:7180d98a96f00b1050e93f5b0f556e658605dd9f524d0b0e68ae7944673f525e"},
+ {file = "bcrypt-3.2.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:61bae49580dce88095d669226d5076d0b9d927754cedbdf76c6c9f5099ad6f26"},
+ {file = "bcrypt-3.2.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88273d806ab3a50d06bc6a2fc7c87d737dd669b76ad955f449c43095389bc8fb"},
+ {file = "bcrypt-3.2.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6d2cb9d969bfca5bc08e45864137276e4c3d3d7de2b162171def3d188bf9d34a"},
+ {file = "bcrypt-3.2.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b02d6bfc6336d1094276f3f588aa1225a598e27f8e3388f4db9948cb707b521"},
+ {file = "bcrypt-3.2.2-cp36-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2c46100e315c3a5b90fdc53e429c006c5f962529bc27e1dfd656292c20ccc40"},
+ {file = "bcrypt-3.2.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7d9ba2e41e330d2af4af6b1b6ec9e6128e91343d0b4afb9282e54e5508f31baa"},
+ {file = "bcrypt-3.2.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cd43303d6b8a165c29ec6756afd169faba9396a9472cdff753fe9f19b96ce2fa"},
+ {file = "bcrypt-3.2.2-cp36-abi3-win32.whl", hash = "sha256:4e029cef560967fb0cf4a802bcf4d562d3d6b4b1bf81de5ec1abbe0f1adb027e"},
+ {file = "bcrypt-3.2.2-cp36-abi3-win_amd64.whl", hash = "sha256:7ff2069240c6bbe49109fe84ca80508773a904f5a8cb960e02a977f7f519b129"},
+ {file = "bcrypt-3.2.2.tar.gz", hash = "sha256:433c410c2177057705da2a9f2cd01dd157493b2a7ac14c8593a16b3dab6b6bfb"},
+]
+black = [
+ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"},
+ {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"},
+ {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"},
+ {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"},
+ {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"},
+ {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"},
+ {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"},
+ {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"},
+ {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"},
+ {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"},
+ {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"},
+ {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"},
+ {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"},
+ {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"},
+ {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"},
+ {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"},
+ {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"},
+ {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"},
+ {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"},
+ {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"},
+ {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"},
+ {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"},
+ {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"},
+]
+cached-property = [
+ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"},
+ {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"},
+]
+cerberus = [
+ {file = "Cerberus-1.3.4.tar.gz", hash = "sha256:d1b21b3954b2498d9a79edf16b3170a3ac1021df88d197dc2ce5928ba519237c"},
+]
+cffi = [
+ {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"},
+ {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"},
+ {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"},
+ {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"},
+ {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"},
+ {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"},
+ {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"},
+ {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"},
+ {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"},
+ {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"},
+ {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"},
+ {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"},
+ {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"},
+ {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"},
+ {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"},
+ {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"},
+ {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"},
+ {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"},
+ {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"},
+ {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"},
+ {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"},
+ {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"},
+ {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"},
+ {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"},
+ {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"},
+ {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"},
+ {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"},
+ {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"},
+ {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"},
+ {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"},
+ {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"},
+ {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"},
+ {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"},
+ {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"},
+ {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"},
+ {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"},
+ {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"},
+ {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"},
+ {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"},
+ {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"},
+ {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"},
+ {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"},
+ {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"},
+ {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"},
+ {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"},
+ {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"},
+ {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"},
+ {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"},
+ {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"},
+ {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"},
+]
+cfgv = [
+ {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"},
+ {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"},
+]
+click = [
+ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
+ {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
+]
+colorama = [
+ {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
+ {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"},
+]
+cryptography = [
+ {file = "cryptography-37.0.3-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:d10413d493e98075060d3e62e5826de372912ea653ccc948f3c41b21ddca087f"},
+ {file = "cryptography-37.0.3-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:cd64147ff16506632893ceb2569624b48c84daa3ba4d89695f7c7bc24188eee9"},
+ {file = "cryptography-37.0.3-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17c74f7d9e9e9bb7e84521243695c1b4bdc3a0e44ca764e6bcf8f05f3de3d0df"},
+ {file = "cryptography-37.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:0713bee6c8077786c56bdec9c5d3f099d40d2c862ff3200416f6862e9dd63156"},
+ {file = "cryptography-37.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9c2008417741cdfbe945ef2d16b7b7ba0790886a0b49e1de533acf93eb66ed6"},
+ {file = "cryptography-37.0.3-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646905ff7a712e415bf0d0f214e0eb669dd2257c4d7a27db1e8baec5d2a1d55f"},
+ {file = "cryptography-37.0.3-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:dcafadb5a06cb7a6bb49fb4c1de7414ee2f8c8e12b047606d97c3175d690f582"},
+ {file = "cryptography-37.0.3-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0b4bfc5ccfe4e5c7de535670680398fed4a0bbc5dfd52b3a295baad42230abdf"},
+ {file = "cryptography-37.0.3-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a03dbc0d8ce8c1146c177cd0e3a66ea106f36733fb1b997ea4d051f8a68539ff"},
+ {file = "cryptography-37.0.3-cp36-abi3-win32.whl", hash = "sha256:190a24c14e91c1fa3101069aac7e77d11c5a73911c3904128367f52946bbb6fd"},
+ {file = "cryptography-37.0.3-cp36-abi3-win_amd64.whl", hash = "sha256:b05c5478524deb7a019e240f2a970040c4b0f01f58f0425e6262c96b126c6a3e"},
+ {file = "cryptography-37.0.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891ed8312840fd43e0696468a6520a582a033c0109f7b14b96067bfe1123226b"},
+ {file = "cryptography-37.0.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:30d6aabf623a01affc7c0824936c3dde6590076b61f5dd299df3cc2c75fc5915"},
+ {file = "cryptography-37.0.3-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:31a7c1f1c2551f013d4294d06e22848e2ccd77825f0987cba3239df6ebf7b020"},
+ {file = "cryptography-37.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a94fd1ff80001cb97add71d07f596d8b865b716f25ef501183e0e199390e50d3"},
+ {file = "cryptography-37.0.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:8a85dbcc770256918b40c2f40bd3ffd3b2ae45b0cf19068b561db8f8d61bf492"},
+ {file = "cryptography-37.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:773d5b5f2e2bd2c7cbb1bd24902ad41283c88b9dd463a0f82adc9a2870d9d066"},
+ {file = "cryptography-37.0.3-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0f9193428a55a4347af2d4fd8141a2002dedbcc26487e67fd2ae19f977ee8afc"},
+ {file = "cryptography-37.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bf652c73e8f7c32a3f92f7184bf7f9106dacdf5ef59c3c3683d7dae2c4972fb"},
+ {file = "cryptography-37.0.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:c3c8b1ad2c266fdf7adc041cc4156d6a3d14db93de2f81b26a5af97ef3f209e5"},
+ {file = "cryptography-37.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2383d6c3088e863304c37c65cd2ea404b7fbb4886823eab1d74137cc27f3d2ee"},
+ {file = "cryptography-37.0.3.tar.gz", hash = "sha256:ae430d51c67ac638dfbb42edf56c669ca9c74744f4d225ad11c6f3d355858187"},
+]
+deepdiff = [
+ {file = "deepdiff-5.8.1-py3-none-any.whl", hash = "sha256:e9aea49733f34fab9a0897038d8f26f9d94a97db1790f1b814cced89e9e0d2b7"},
+ {file = "deepdiff-5.8.1.tar.gz", hash = "sha256:8d4eb2c4e6cbc80b811266419cb71dd95a157094a3947ccf937a94d44943c7b8"},
+]
+distlib = [
+ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"},
+ {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"},
+]
+et-xmlfile = [
+ {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"},
+ {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
+]
+filelock = [
+ {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"},
+ {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"},
+]
+flake8 = [
+ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
+ {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"},
+]
+future = [
+ {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"},
+]
+ghp-import = [
+ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"},
+ {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"},
+]
+gitdb = [
+ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
+ {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"},
+]
+gitpython = [
+ {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"},
+ {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"},
+]
+griffe = [
+ {file = "griffe-0.21.0-py3-none-any.whl", hash = "sha256:e9fb5eeb7c721e1d84804452bdc742bd57b120b13aba663157668ae2d217088a"},
+ {file = "griffe-0.21.0.tar.gz", hash = "sha256:61ab3bc02b09afeb489f1aef44c646a09f1837d9cdf15943ac6021903a4d3984"},
+]
+identify = [
+ {file = "identify-2.5.1-py2.py3-none-any.whl", hash = "sha256:0dca2ea3e4381c435ef9c33ba100a78a9b40c0bab11189c7cf121f75815efeaa"},
+ {file = "identify-2.5.1.tar.gz", hash = "sha256:3d11b16f3fe19f52039fb7e39c9c884b21cb1b586988114fbe42671f03de3e82"},
+]
+importlib-metadata = [
+ {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"},
+ {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"},
+]
+iniconfig = [
+ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
+ {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
+]
+isort = [
+ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"},
+ {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"},
+]
+jinja2 = [
+ {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"},
+ {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"},
+]
+lazy-object-proxy = [
+ {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"},
+ {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"},
+ {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"},
+ {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"},
+ {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"},
+ {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"},
+ {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"},
+ {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"},
+ {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"},
+ {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"},
+ {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"},
+ {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"},
+ {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"},
+ {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"},
+ {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"},
+ {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"},
+ {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"},
+ {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"},
+ {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"},
+ {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"},
+ {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"},
+ {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"},
+ {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"},
+ {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"},
+ {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"},
+ {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"},
+ {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"},
+ {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"},
+ {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"},
+ {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"},
+ {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"},
+ {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"},
+ {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"},
+ {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"},
+ {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"},
+ {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"},
+ {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"},
+]
+markdown = [
+ {file = "Markdown-3.3.5-py3-none-any.whl", hash = "sha256:0d2d09f75cb8d1ffc6770c65c61770b23a61708101f47bda416a002a0edbc480"},
+ {file = "Markdown-3.3.5.tar.gz", hash = "sha256:26e9546bfbcde5fcd072bd8f612c9c1b6e2677cb8aadbdf65206674f46dde069"},
+]
+markupsafe = [
+ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"},
+ {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"},
+]
+mccabe = [
+ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
+ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
+]
+mergedeep = [
+ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"},
+ {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"},
+]
+mkdocs = [
+ {file = "mkdocs-1.2.4-py3-none-any.whl", hash = "sha256:f108e7ab5a7ed3e30826dbf82f37638f0d90d11161644616cc4f01a1e2ab3940"},
+ {file = "mkdocs-1.2.4.tar.gz", hash = "sha256:8e7970a26183487fe2a1041940c6fd03aa0dbe5549e50c3e7194f565cb3c678a"},
+]
+mkdocs-autorefs = [
+ {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"},
+ {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"},
+]
+mkdocs-material = [
+ {file = "mkdocs-material-7.2.2.tar.gz", hash = "sha256:4f501e139e2f8546653e7d8777c9b97ca639d03d8c86345a60609864cc5bbb03"},
+ {file = "mkdocs_material-7.2.2-py2.py3-none-any.whl", hash = "sha256:76de22213f0e0319b9bddf1bfa86530e93efb4a604e9ddf8f8419f0438572523"},
+]
+mkdocs-material-extensions = [
+ {file = "mkdocs-material-extensions-1.0.1.tar.gz", hash = "sha256:6947fb7f5e4291e3c61405bad3539d81e0b3cd62ae0d66ced018128af509c68f"},
+ {file = "mkdocs_material_extensions-1.0.1-py3-none-any.whl", hash = "sha256:d90c807a88348aa6d1805657ec5c0b2d8d609c110e62b9dce4daf7fa981fa338"},
+]
+mkdocstrings = [
+ {file = "mkdocstrings-0.18.1-py3-none-any.whl", hash = "sha256:4053929356df8cd69ed32eef71d8f676a472ef72980c9ffd4f933ead1debcdad"},
+ {file = "mkdocstrings-0.18.1.tar.gz", hash = "sha256:fb7c91ce7e3ab70488d3fa6c073a4f827cdc319042f682ef8ea95459790d64fc"},
+]
+mkdocstrings-python = [
+ {file = "mkdocstrings-python-0.6.6.tar.gz", hash = "sha256:37281696b9f199624ae420e0625b6659b7fdfbea736618bce7fd978682dea3b1"},
+ {file = "mkdocstrings_python-0.6.6-py3-none-any.whl", hash = "sha256:c118438d3cb4b14c492a51d109f4e5b27ab06ba19b099d624430dfd904926152"},
+]
+mkdocstrings-python-legacy = [
+ {file = "mkdocstrings-python-legacy-0.2.2.tar.gz", hash = "sha256:f0e7ec6a19750581b752acb38f6b32fcd1efe006f14f6703125d2c2c9a5c6f02"},
+ {file = "mkdocstrings_python_legacy-0.2.2-py3-none-any.whl", hash = "sha256:379107a3a5b8db9b462efc4493c122efe21e825e3702425dbd404621302a563a"},
+]
+mypy-extensions = [
+ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
+ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
+]
+netmiko = [
+ {file = "netmiko-3.4.0-py3-none-any.whl", hash = "sha256:b66f25717db3609878f83c85604349dd40a0ab494d8eafd817dcde8388131136"},
+ {file = "netmiko-3.4.0.tar.gz", hash = "sha256:acadb9dd97864ee848e2032f1f0e301c7b31e7a4153757d98f5c8ba1b9614993"},
+]
+nodeenv = [
+ {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"},
+ {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"},
+]
+ntc-templates = [
+ {file = "ntc_templates-3.0.0-py3-none-any.whl", hash = "sha256:a652ff1659803d98fc088fc1b0838a74533316b0ad627c1220c0424dd82d12b3"},
+ {file = "ntc_templates-3.0.0.tar.gz", hash = "sha256:866c1b57af48625e1a38cc7226067e400d8a992c4d5594b914cafd7b13fd4a50"},
+]
+openpyxl = [
+ {file = "openpyxl-3.0.10-py2.py3-none-any.whl", hash = "sha256:0ab6d25d01799f97a9464630abacbb34aafecdcaa0ef3cba6d6b3499867d0355"},
+ {file = "openpyxl-3.0.10.tar.gz", hash = "sha256:e47805627aebcf860edb4edf7987b1309c1b3632f3750538ed962bbcc3bd7449"},
+]
+ordered-set = [
+ {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"},
+ {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"},
+]
+packaging = [
+ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
+ {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
+]
+paramiko = [
+ {file = "paramiko-2.11.0-py2.py3-none-any.whl", hash = "sha256:655f25dc8baf763277b933dfcea101d636581df8d6b9774d1fb653426b72c270"},
+ {file = "paramiko-2.11.0.tar.gz", hash = "sha256:003e6bee7c034c21fbb051bf83dc0a9ee4106204dd3c53054c71452cc4ec3938"},
+]
+pathspec = [
+ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"},
+ {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
+]
+pbr = [
+ {file = "pbr-5.9.0-py2.py3-none-any.whl", hash = "sha256:e547125940bcc052856ded43be8e101f63828c2d94239ffbe2b327ba3d5ccf0a"},
+ {file = "pbr-5.9.0.tar.gz", hash = "sha256:e8dca2f4b43560edef58813969f52a56cef023146cbb8931626db80e6c1c4308"},
+]
+platformdirs = [
+ {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"},
+ {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"},
+]
+pluggy = [
+ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
+ {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
+]
+pre-commit = [
+ {file = "pre_commit-2.15.0-py2.py3-none-any.whl", hash = "sha256:a4ed01000afcb484d9eb8d504272e642c4c4099bbad3a6b27e519bd6a3e928a6"},
+ {file = "pre_commit-2.15.0.tar.gz", hash = "sha256:3c25add78dbdfb6a28a651780d5c311ac40dd17f160eb3954a0c59da40a505a7"},
+]
+py = [
+ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
+ {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
+]
+pycodestyle = [
+ {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"},
+ {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
+]
+pycparser = [
+ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
+ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
+]
+pyenchant = [
+ {file = "pyenchant-3.2.2-py3-none-any.whl", hash = "sha256:5facc821ece957208a81423af7d6ec7810dad29697cb0d77aae81e4e11c8e5a6"},
+ {file = "pyenchant-3.2.2-py3-none-win32.whl", hash = "sha256:5a636832987eaf26efe971968f4d1b78e81f62bca2bde0a9da210c7de43c3bce"},
+ {file = "pyenchant-3.2.2-py3-none-win_amd64.whl", hash = "sha256:6153f521852e23a5add923dbacfbf4bebbb8d70c4e4bad609a8e0f9faeb915d1"},
+ {file = "pyenchant-3.2.2.tar.gz", hash = "sha256:1cf830c6614362a78aab78d50eaf7c6c93831369c52e1bb64ffae1df0341e637"},
+]
+pyflakes = [
+ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"},
+ {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"},
+]
+pygments = [
+ {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"},
+ {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"},
+]
+pylint = [
+ {file = "pylint-2.12.2-py3-none-any.whl", hash = "sha256:daabda3f7ed9d1c60f52d563b1b854632fd90035bcf01443e234d3dc794e3b74"},
+ {file = "pylint-2.12.2.tar.gz", hash = "sha256:9d945a73640e1fec07ee34b42f5669b770c759acd536ec7b16d7e4b87a9c9ff9"},
+]
+pymdown-extensions = [
+ {file = "pymdown_extensions-9.5-py3-none-any.whl", hash = "sha256:ec141c0f4983755349f0c8710416348d1a13753976c028186ed14f190c8061c4"},
+ {file = "pymdown_extensions-9.5.tar.gz", hash = "sha256:3ef2d998c0d5fa7eb09291926d90d69391283561cf6306f85cd588a5eb5befa0"},
+]
+pynacl = [
+ {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"},
+ {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"},
+ {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"},
+ {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"},
+ {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"},
+ {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"},
+ {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"},
+ {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"},
+ {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"},
+ {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"},
+]
+pyparsing = [
+ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
+ {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
+]
+pyserial = [
+ {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"},
+ {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"},
+]
+pytest = [
+ {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"},
+ {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"},
+]
+python-dateutil = [
+ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
+ {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
+]
+pytkdocs = [
+ {file = "pytkdocs-0.16.1-py3-none-any.whl", hash = "sha256:a8c3f46ecef0b92864cc598e9101e9c4cf832ebbf228f50c84aa5dd850aac379"},
+ {file = "pytkdocs-0.16.1.tar.gz", hash = "sha256:e2ccf6dfe9dbbceb09818673f040f1a7c32ed0bffb2d709b06be6453c4026045"},
+]
+pyxb = [
+ {file = "PyXB-1.2.6.tar.gz", hash = "sha256:2a00f38dd1d87b88f92d79bc5a09718d730419b88e814545f472bbd5a3bf27b4"},
+]
+pyyaml = [
+ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
+ {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
+ {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
+ {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+ {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
+ {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
+ {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
+ {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
+ {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
+ {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
+ {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
+ {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
+ {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
+ {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
+ {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
+ {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
+ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
+ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
+]
+pyyaml-env-tag = [
+ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
+ {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
+]
+scp = [
+ {file = "scp-0.14.4-py2.py3-none-any.whl", hash = "sha256:29ddaafbfba60793a8a779694c97d8c150d365668a4ef67616c515b80a69ef2f"},
+ {file = "scp-0.14.4.tar.gz", hash = "sha256:54699b92cb68ae34b5928c48a888eab9722a212502cba89aa795bd56597505bd"},
+]
+six = [
+ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+smmap = [
+ {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"},
+ {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"},
+]
+stevedore = [
+ {file = "stevedore-3.5.0-py3-none-any.whl", hash = "sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c"},
+ {file = "stevedore-3.5.0.tar.gz", hash = "sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335"},
+]
+tabulate = [
+ {file = "tabulate-0.8.10-py3-none-any.whl", hash = "sha256:0ba055423dbaa164b9e456abe7920c5e8ed33fcc16f6d1b2f2d152c8e1e8b4fc"},
+ {file = "tabulate-0.8.10-py3.8.egg", hash = "sha256:436f1c768b424654fce8597290d2764def1eea6a77cfa5c33be00b1bc0f4f63d"},
+ {file = "tabulate-0.8.10.tar.gz", hash = "sha256:6c57f3f3dd7ac2782770155f3adb2db0b1a269637e42f27599925e64b114f519"},
+]
+tenacity = [
+ {file = "tenacity-8.0.1-py3-none-any.whl", hash = "sha256:f78f4ea81b0fabc06728c11dc2a8c01277bfc5181b321a4770471902e3eb844a"},
+ {file = "tenacity-8.0.1.tar.gz", hash = "sha256:43242a20e3e73291a28bcbcacfd6e000b02d3857a9a9fff56b297a27afdc932f"},
+]
+textfsm = [
+ {file = "textfsm-1.1.2-py2.py3-none-any.whl", hash = "sha256:f3d4e9bd4344935a08e6844e53d6220e2e4fb7e465bee51fa909152ed6bab406"},
+ {file = "textfsm-1.1.2.tar.gz", hash = "sha256:85a450b441aff04b1cac726bdb36f35534a5b196cca08c8bc14fddd879c4255c"},
+]
+toml = [
+ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
+ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
+]
+tomli = [
+ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
+ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
+]
+ttp = [
+ {file = "ttp-0.9.0-py2.py3-none-any.whl", hash = "sha256:db16bdf0446fdb4ec662064d5bc174d573a2240d66cde73ba07d266fb58b599a"},
+ {file = "ttp-0.9.0.tar.gz", hash = "sha256:e53050061450c3ee48476983f23153a9bb55589ba6d79a25d0ebc28d329eec4f"},
+]
+typed-ast = [
+ {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"},
+ {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"},
+ {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"},
+ {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"},
+ {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"},
+ {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"},
+ {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"},
+ {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"},
+ {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"},
+ {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"},
+ {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"},
+ {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"},
+ {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"},
+ {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"},
+ {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"},
+ {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"},
+ {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"},
+ {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"},
+ {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"},
+ {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"},
+ {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"},
+ {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"},
+ {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"},
+ {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"},
+]
+typing-extensions = [
+ {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"},
+ {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"},
+]
+virtualenv = [
+ {file = "virtualenv-20.15.0-py2.py3-none-any.whl", hash = "sha256:804cce4de5b8a322f099897e308eecc8f6e2951f1a8e7e2b3598dff865f01336"},
+ {file = "virtualenv-20.15.0.tar.gz", hash = "sha256:4c44b1d77ca81f8368e2d7414f9b20c428ad16b343ac6d226206c5b84e2b4fcc"},
+]
+watchdog = [
+ {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"},
+ {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"},
+ {file = "watchdog-2.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee3e38a6cc050a8830089f79cbec8a3878ec2fe5160cdb2dc8ccb6def8552658"},
+ {file = "watchdog-2.1.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64a27aed691408a6abd83394b38503e8176f69031ca25d64131d8d640a307591"},
+ {file = "watchdog-2.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:195fc70c6e41237362ba720e9aaf394f8178bfc7fa68207f112d108edef1af33"},
+ {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bfc4d351e6348d6ec51df007432e6fe80adb53fd41183716017026af03427846"},
+ {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8250546a98388cbc00c3ee3cc5cf96799b5a595270dfcfa855491a64b86ef8c3"},
+ {file = "watchdog-2.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:117ffc6ec261639a0209a3252546b12800670d4bf5f84fbd355957a0595fe654"},
+ {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97f9752208f5154e9e7b76acc8c4f5a58801b338de2af14e7e181ee3b28a5d39"},
+ {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:247dcf1df956daa24828bfea5a138d0e7a7c98b1a47cf1fa5b0c3c16241fcbb7"},
+ {file = "watchdog-2.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:226b3c6c468ce72051a4c15a4cc2ef317c32590d82ba0b330403cafd98a62cfd"},
+ {file = "watchdog-2.1.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d9820fe47c20c13e3c9dd544d3706a2a26c02b2b43c993b62fcd8011bcc0adb3"},
+ {file = "watchdog-2.1.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70af927aa1613ded6a68089a9262a009fbdf819f46d09c1a908d4b36e1ba2b2d"},
+ {file = "watchdog-2.1.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed80a1628cee19f5cfc6bb74e173f1b4189eb532e705e2a13e3250312a62e0c9"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9f05a5f7c12452f6a27203f76779ae3f46fa30f1dd833037ea8cbc2887c60213"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_armv7l.whl", hash = "sha256:255bb5758f7e89b1a13c05a5bceccec2219f8995a3a4c4d6968fe1de6a3b2892"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_i686.whl", hash = "sha256:d3dda00aca282b26194bdd0adec21e4c21e916956d972369359ba63ade616153"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64.whl", hash = "sha256:186f6c55abc5e03872ae14c2f294a153ec7292f807af99f57611acc8caa75306"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:083171652584e1b8829581f965b9b7723ca5f9a2cd7e20271edf264cfd7c1412"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_s390x.whl", hash = "sha256:b530ae007a5f5d50b7fbba96634c7ee21abec70dc3e7f0233339c81943848dc1"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4f4e1c4aa54fb86316a62a87b3378c025e228178d55481d30d857c6c438897d6"},
+ {file = "watchdog-2.1.9-py3-none-win32.whl", hash = "sha256:5952135968519e2447a01875a6f5fc8c03190b24d14ee52b0f4b1682259520b1"},
+ {file = "watchdog-2.1.9-py3-none-win_amd64.whl", hash = "sha256:7a833211f49143c3d336729b0020ffd1274078e94b0ae42e22f596999f50279c"},
+ {file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"},
+ {file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"},
+]
+wrapt = [
+ {file = "wrapt-1.13.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a"},
+ {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489"},
+ {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909"},
+ {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229"},
+ {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af"},
+ {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de"},
+ {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb"},
+ {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80"},
+ {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca"},
+ {file = "wrapt-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44"},
+ {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056"},
+ {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785"},
+ {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096"},
+ {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33"},
+ {file = "wrapt-1.13.3-cp310-cp310-win32.whl", hash = "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f"},
+ {file = "wrapt-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e"},
+ {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d"},
+ {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179"},
+ {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3"},
+ {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755"},
+ {file = "wrapt-1.13.3-cp35-cp35m-win32.whl", hash = "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851"},
+ {file = "wrapt-1.13.3-cp35-cp35m-win_amd64.whl", hash = "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13"},
+ {file = "wrapt-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918"},
+ {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade"},
+ {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc"},
+ {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf"},
+ {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125"},
+ {file = "wrapt-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36"},
+ {file = "wrapt-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10"},
+ {file = "wrapt-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068"},
+ {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709"},
+ {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df"},
+ {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2"},
+ {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b"},
+ {file = "wrapt-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829"},
+ {file = "wrapt-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"},
+ {file = "wrapt-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9"},
+ {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554"},
+ {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c"},
+ {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b"},
+ {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce"},
+ {file = "wrapt-1.13.3-cp38-cp38-win32.whl", hash = "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79"},
+ {file = "wrapt-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb"},
+ {file = "wrapt-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb"},
+ {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32"},
+ {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7"},
+ {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e"},
+ {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640"},
+ {file = "wrapt-1.13.3-cp39-cp39-win32.whl", hash = "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374"},
+ {file = "wrapt-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb"},
+ {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"},
+]
+yangson = [
+ {file = "yangson-1.4.13-py3-none-any.whl", hash = "sha256:cc09c47999630bc4df468b3ca5c63b9a6214fd25029b60525742df8e20ff537f"},
+ {file = "yangson-1.4.13.tar.gz", hash = "sha256:4ae2a94b0223662a32aa6c6570a27e5173fe0037c9c14c020adb66300884919e"},
+]
+zipp = [
+ {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"},
+ {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"},
+]
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..e353858
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,59 @@
+[tool.poetry]
+name = "ttp_templates"
+version = "0.2.0"
+description = "Template Text Parser Templates collections"
+license = "MIT"
+include = [
+ "platform/*.txt",
+ "yang/*.txt",
+ "misc/*/*.txt",
+]
+authors = ["Denis Mulyalin "]
+maintainers = ["Denis Mulyalin "]
+readme = "README.md"
+homepage = "https://github.com/dmulyalin/ttp_templates"
+repository = "https://github.com/dmulyalin/ttp_templates"
+documentation = "https://dmulyalin.github.io/ttp_templates/"
+keywords = ["Parsing", "TTP", "regex"]
+classifiers = [
+ "Topic :: Utilities",
+ "Programming Language :: Python :: 2.7",
+ "Programming Language :: Python :: 3.6",
+ "Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
+ "License :: OSI Approved :: MIT License",
+ "Operating System :: POSIX :: Linux",
+]
+
+[tool.poetry.dependencies]
+python = "^3.6"
+ttp = { version = ">=0.6.0" }
+
+# docs dependencies for extras definition
+mkdocs = { version = ">=1.1", optional = true, markers = "python_version >= '3.7'" }
+mkdocs-material = { version = "7.2.2", optional = true, markers = "python_version >= '3.7'" }
+mkdocs-material-extensions = { version = "1.0.1", optional = true, markers = "python_version >= '3.7'" }
+mkdocstrings = { version = "0.18.*", optional = true, markers = "python_version >= '3.7'", extras = ["python"] }
+
+[tool.poetry.dev-dependencies]
+bandit = { version = "1.7.*", markers = "python_version >= '3.7'" }
+black = { version = "22.3.*", markers = "python_version >= '3.7'" }
+flake8 = { version = "4.0.*", markers = "python_version >= '3.7'" }
+pre-commit = { version = "2.15.*", markers = "python_version >= '3.7'" }
+pyenchant = { version = "3.2.*", markers = "python_version >= '3.7'" }
+pylint = { version = "2.12.*", markers = "python_version >= '3.7'" }
+pytest = { version = "^7.1.*", markers = "python_version >= '3.7'" }
+cerberus = { version = "1.3.*", markers = "python_version >= '3.7'" }
+jinja2 = { version = "3.0.*", markers = "python_version >= '3.7'" }
+pyyaml = { version = "6.0", markers = "python_version >= '3.7'" }
+deepdiff = { version = "5.8.*", markers = "python_version >= '3.7'" }
+openpyxl = { version = "3.0.*", markers = "python_version >= '3.7'" }
+tabulate = { version = "0.8.*", markers = "python_version >= '3.7'" }
+yangson = { version = "1.4.*", markers = "python_version >= '3.7'" }
+netmiko = { version = "3.4.0", markers = "python_version >= '3.7'" }
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
diff --git a/requirements-dev.txt b/requirements-dev.txt
deleted file mode 100644
index 9137a72..0000000
--- a/requirements-dev.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-black
-Cerberus==1.*
-deepdiff==4.*
-Jinja2==2.*
-openpyxl==3.*
-pre-commit==2.*
-pytest==7.*
-PyYAML==5.*
-tabulate==0.*
-ttp_templates==0.*
-yangson==1.*
-ttp==0.*
-netmiko==3.*
\ No newline at end of file
diff --git a/requirements-docs.txt b/requirements-docs.txt
deleted file mode 100644
index 2d57cc6..0000000
--- a/requirements-docs.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-mkdocs==1.3.0
-mkdocs-material==7.2.2
-mkdocs-material-extensions==1.0.1
-mkdocstrings==0.18.1
-mkdocstrings[python]>=0.18
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index ae558be..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-ttp>=0.6.0
\ No newline at end of file
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index ca6eb92..0000000
--- a/setup.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-[metadata]
-description-file=README.md
-license_files=LICENSE
-
-[bdist_wheel]
-universal = 1
\ No newline at end of file
diff --git a/setup.py b/setup.py
deleted file mode 100644
index c5b0758..0000000
--- a/setup.py
+++ /dev/null
@@ -1,41 +0,0 @@
-from setuptools import setup, find_packages
-
-with open("README.md", "r") as f:
- long_description = f.read()
-
-__author__ = "Denis Mulyalin "
-
-setup(
- name="ttp_templates",
- version="0.1.4",
- author="Denis Mulyalin",
- author_email="d.mulyalin@gmail.com",
- description="Template Text Parser Templates collections",
- long_description=long_description,
- long_description_content_type="text/markdown",
- url="https://github.com/dmulyalin/ttp_templates",
- packages=find_packages(),
- extras_require={},
- include_package_data=True,
- package_data={
- "ttp_templates": [
- "platform/*.txt",
- "yang/*.txt",
- "misc/*/*.txt"
- ]
- },
- data_files=[('', ['LICENSE'])],
- install_requires=[
- "ttp>=0.6.0"
- ],
- classifiers=[
- "Topic :: Utilities",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- ]
-)
diff --git a/test/mock_data/arista_eos_show_hostname.txt b/test/mock_data/arista_eos_show_hostname.txt
new file mode 100644
index 0000000..7db725e
--- /dev/null
+++ b/test/mock_data/arista_eos_show_hostname.txt
@@ -0,0 +1,2 @@
+Hostname: ceos1
+FQDN: ceos1
\ No newline at end of file
diff --git a/test/mock_data/juniper_show_isis_database_verbose_pipe_no_more.txt b/test/mock_data/juniper_show_isis_database_verbose_pipe_no_more.txt
new file mode 100644
index 0000000..6b45b5b
--- /dev/null
+++ b/test/mock_data/juniper_show_isis_database_verbose_pipe_no_more.txt
@@ -0,0 +1,56 @@
+IS-IS level 2 link-state database:
+
+R1-X1.00-00 Sequence: 0x22425, Checksum: 0x8904, Lifetime: 463 secs
+ IS neighbor: R1-X2.00 Metric: 20
+ Two-way fragment: R1-X2.00-00, Two-way first fragment: R1-X2.00-00
+ IP prefix: 10.123.123.31/32 Metric: 0 Internal Up
+ IP prefix: 10.123.123.41/32 Metric: 0 Internal Up
+ V6 prefix: ::ffff:10.123.111.236/126 Metric: 20 Internal Up
+
+ Header: LSP ID: R1-X1.00-00, Length: 233 bytes
+ Allocated length: 284 bytes, Router ID: 10.123.123.31
+ Remaining lifetime: 463 secs, Level: 2, Interface: 80
+ Estimated free bytes: 51, Actual free bytes: 51
+ Aging timer expires in: 463 secs
+ Protocols: IP, IPv6
+
+ Packet: LSP ID: R1-X1.00-00, Length: 233 bytes, Lifetime : 1194 secs
+ Checksum: 0x8904, Sequence: 0x22425, Attributes: 0x3
+ NLPID: 0x83, Fixed length: 27 bytes, Version: 1, Sysid length: 0 bytes
+ Packet type: 20, Packet version: 1, Max area: 0
+
+ TLVs:
+ Area address: 49.0001 (3)
+ LSP Buffer Size: 1492
+ Speaks: IP
+ Speaks: IPV6
+ IP router id: 10.123.123.31
+ IP address: 10.123.123.31
+ IPv6 TE Router ID: 2001::10:123:123:31
+ Hostname: R1-X1
+ Extended IS Reachability TLV, Type: 22, Length: 85
+ IS extended neighbor: R1-X2.00, Metric: default 20 SubTLV len: 74
+ IP address: 10.123.111.238
+ Neighbor's IP address: 10.123.111.237
+ Local interface index: 332, Remote interface index: 461
+ Current reservable bandwidth:
+ Priority 0 : 7Gbps
+ Priority 1 : 7Gbps
+ Priority 2 : 7Gbps
+ Priority 3 : 7Gbps
+ Priority 4 : 7Gbps
+ Priority 5 : 7Gbps
+ Priority 6 : 6.7Gbps
+ Priority 7 : 6.7Gbps
+ Maximum reservable bandwidth: 7Gbps
+ Maximum bandwidth: 10Gbps
+ Administrative groups: 0
+ IPv6 prefix: ::ffff:10.123.111.236/126 Metric 20 Up
+ IP extended prefix: 10.123.123.31/32 metric 0 up
+ IP extended prefix: 10.123.123.41/32 metric 0 up
+ IP extended prefix: 10.123.111.236/30 metric 20 up
+ IP address: 10.123.123.41
+ Authentication data: 17 bytes
+ No queued transmissions
+
+
\ No newline at end of file
diff --git a/test/mock_data/test_N2G_cli_l2_data_juniper.txt b/test/mock_data/test_N2G_cli_l2_data_juniper.txt
new file mode 100644
index 0000000..0864380
--- /dev/null
+++ b/test/mock_data/test_N2G_cli_l2_data_juniper.txt
@@ -0,0 +1,113 @@
+user1@switch-1> show lldp local-information
+
+LLDP Local Information details
+
+Chassis ID : 84:03:28:15:12:34
+System name : switch-1.net.acme1.lab
+System descr : Juniper Networks, Inc. ssm5123-64c Ethernet Switch, kernel JUNOS 12.2R3-S1.3, Build date: 2011-05-12 12:34:56 UTC Copyright (c) 1996-2021 Juniper Networks, Inc.
+
+System Capabilities
+ Supported : Bridge Router
+ Enabled : Bridge Router
+
+Management Information
+ Interface Name : em0
+ Address Subtype : IPv4(1)
+ Address : 10.123.204.39
+ Interface Number : 17
+ Interface Numbering Subtype : ifIndex(2)
+
+Interface name Parent Interface Interface ID Interface description Status
+em0 - 17 em0 Up
+et-0/0/31 - 521 - Down
+et-0/0/32 - 612 CID-BN-P-env4207-env4208-0004 | BACKHAUL Up
+et-0/0/33 - 522 - Down
+et-0/0/34 - 615 BACKHAUL Up
+et-0/0/35 - 602 - Down
+
+{master:0}
+user1@switch-1> show lldp neighbors
+Local Interface Parent Interface Chassis Id Port info System Name
+et-0/0/12 - 04:3f:72:cf:43:21 04:3f:72:cf:12:34
+et-0/0/13 - 11:22:33:1b:7a:80 Eth0 CSW31
+et-0/0/14 - 9c:e1:76:9d:11:23 HundredGigE0/0/1/0.12 nsw02-env1.env4208.net.acme1.lab
+et-0/0/15 - 9c:e1:76:9d:11:23 HundredGigE0/0/1/0.34 nsw02-env1.env4208.net.acme1.lab
+
+{master:0}
+user1@switch-1> show configuration interfaces | display set | no-more
+set interfaces ge-0/0/0 description "useful staff"
+set interfaces ge-0/0/0 ether-options 802.3ad 31
+set interfaces ge-0/0/0 mtu 9234
+set interfaces ge-0/0/0 aggregated-ether-options lacp active
+{master:0}
+
+user1@switch-1> show interfaces detail | no-more
+Physical interface: ge-0/0/0, Enabled, Physical link is Up
+ Interface index: 123, SNMP ifIndex: 4321, Generation: 141
+ Description: useful staff
+ Link-level type: Ethernet, MTU: 9234, LAN-PHY mode, Speed: 100Gbps, BPDU Error: None, Loop Detect PDU Error: None, Ethernet-Switching Error: None, MAC-REWRITE Error: None, Loopback: Disabled,
+ Source filtering: Disabled, Flow control: Disabled, Media type: Fiber
+ Device flags : Present Running
+ Interface flags: SNMP-Traps Internal: 0x4000
+ Link flags : None
+ CoS queues : 10 supported, 10 maximum usable queues
+ Hold-times : Up 0 ms, Down 0 ms
+ Current address: 84:03:28:15:11:13, Hardware address: 84:03:28:15:11:34
+ Last flapped : 2022-23-12 11:31:41 UTC (4d 11:48 ago)
+ Statistics last cleared: 2022-43-51 11:31:41 UTC (50w0d 07:51 ago)
+ Traffic statistics:
+ Input bytes : 16307027457109123 7839570216 bps
+ Output bytes : 4957883264478488 2023686896 bps
+ Input packets: 2693554359960 161652 pps
+ Output packets: 818438758751 41759 pps
+ IPv6 transit statistics:
+ Input bytes : 0
+ Output bytes : 0
+ Input packets: 0
+ Output packets: 0
+ Egress queues: 10 supported, 5 in use
+ Queue counters: Queued packets Transmitted packets Dropped packets
+ 0 818438658689 818438658689 0
+ 3 0 0 0
+ 4 0 0 0
+ 7 195101 195101 0
+ 8 0 0 0
+ Queue number: Mapped forwarding classes
+ 0 best-effort
+ 3 fcoe
+ 4 no-loss
+ 7 network-control
+ 8 mcast
+ Active alarms : None
+ Active defects : None
+ Pre-emphasis(reg 236/237)
+ Register-value 0
+ Ctle(reg 234/235)
+ Register-value 0
+ Differential-amplitude(reg 238/239)
+ Register-value 0
+ PCS statistics Seconds
+ Bit errors 0
+ Errored blocks 0
+ Ethernet FEC Mode : FEC91
+ Ethernet FEC statistics Errors
+ FEC Corrected Errors 0
+ FEC Uncorrected Errors 0
+ FEC Corrected Errors Rate 0
+ FEC Uncorrected Errors Rate 0
+ PRBS Statistics : Disabled
+ Interface transmit statistics: Disabled
+ MACSec statistics:
+ Output
+ Secure Channel Transmitted
+ Protected Packets : 0
+ Encrypted Packets : 0
+ Protected Bytes : 0
+ Encrypted Bytes : 0
+ Input
+ Secure Channel Received
+ Accepted Packets : 0
+ Validated Bytes : 0
+ Decrypted Bytes : 0
+{master:0}
+user1@switch-1>
\ No newline at end of file
diff --git a/test/test_n2g_templates.py b/test/test_n2g_templates.py
index 1560ec3..960b19f 100644
--- a/test/test_n2g_templates.py
+++ b/test/test_n2g_templates.py
@@ -5,7 +5,7 @@
from ttp_templates import get_template
from ttp import ttp
-
+from ttp_templates.ttp_vars import all_vars
def test_N2G_ospf_lsdb_Cisco_IOSXR():
with open("./mock_data/cisco_xr_show_ip_ospf_database_router_external_summary_router-1.txt", "r") as f:
@@ -378,4 +378,136 @@ def test_N2G_ospf_lsdb_huawei():
'link_id': '123.123.24.5',
'metric': '9000'}]}]}}}]]
-# test_N2G_ospf_lsdb_huawei()
\ No newline at end of file
+# test_N2G_ospf_lsdb_huawei()
+
+def test_N2G_isis_lsdb_juniper():
+ with open("./mock_data/juniper_show_isis_database_verbose_pipe_no_more.txt", "r") as f:
+ data = f.read()
+ template = get_template(path="misc/N2G/cli_isis_data/juniper.txt")
+ print(template)
+ parser = ttp(data=data, template=template)
+ parser.parse()
+ res = parser.result()
+ pprint.pprint(res)
+ assert res == [[{'isis_processes': {'ISIS': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': '2',
+ 'links': [{'bw_gbit': '10',
+ 'local_intf_id': '332',
+ 'local_ip': '10.123.111.238',
+ 'metric': '20',
+ 'peer_intf_id': '461',
+ 'peer_ip': '10.123.111.237',
+ 'peer_name': 'R1-X2'}],
+ 'networks': [{'metric': '0',
+ 'network': '10.123.123.31/32'},
+ {'metric': '0',
+ 'network': '10.123.123.41/32'},
+ {'metric': '20',
+ 'network': '::ffff:10.123.111.236/126'}],
+ 'rid': '10.123.123.31',
+ 'rid_v6': '2001::10:123:123:31'}]}}}]]
+
+# test_N2G_isis_lsdb_juniper()
+
+def test_N2G_cli_l2_data_juniper():
+ with open("./mock_data/test_N2G_cli_l2_data_juniper.txt", "r") as f:
+ data = f.read()
+ template = get_template(path="misc/N2G/cli_l2_data/juniper.txt")
+ print(template)
+ parser = ttp(data=data, template=template, vars={"IfsNormalize": all_vars["short_interface_names"], "physical_ports": all_vars["physical_ports"]})
+ parser.parse()
+ res = parser.result()
+ pprint.pprint(res)
+ assert res == [{'switch-1.net.acme1.lab': {'interfaces': {'GE0/0/0': {'description': 'useful '
+ 'staff',
+ 'lag_id': '31',
+ 'lag_mode': 'active',
+ 'mtu': '9234',
+ 'state': {'admin': 'Enabled',
+ 'description': 'useful '
+ 'staff',
+ 'is_physical_port': True,
+ 'line': 'Up',
+ 'mac': '84:03:28:15:11:13'}}},
+ 'interfaces_id': [{'description': 'em0',
+ 'id': '17',
+ 'interface': 'em0',
+ 'parent': '-',
+ 'status': 'Up'},
+ {'description': '-',
+ 'id': '521',
+ 'interface': '100GE0/0/31',
+ 'parent': '-',
+ 'status': 'Down'},
+ {'description': 'CID-BN-P-env4207-env4208-0004 '
+ '| BACKHAUL',
+ 'id': '612',
+ 'interface': '100GE0/0/32',
+ 'parent': '-',
+ 'status': 'Up'},
+ {'description': '-',
+ 'id': '522',
+ 'interface': '100GE0/0/33',
+ 'parent': '-',
+ 'status': 'Down'},
+ {'description': 'BACKHAUL',
+ 'id': '615',
+ 'interface': '100GE0/0/34',
+ 'parent': '-',
+ 'status': 'Up'},
+ {'description': '-',
+ 'id': '602',
+ 'interface': '100GE0/0/35',
+ 'parent': '-',
+ 'status': 'Down'}],
+ 'lldp_peers': [{'data': {'chassis_id': '04:3f:72:cf:43:21',
+ 'parent_interface': '-',
+ 'peer_port_description': '04:3f:72:cf:12:34'},
+ 'source': 'switch-1.net.acme1.lab',
+ 'src_label': '100GE0/0/12',
+ 'target': {'id': '04:3f:72:cf:43:21'},
+ 'trgt_label': ''},
+ {'data': {'chassis_id': '11:22:33:1b:7a:80',
+ 'parent_interface': '-',
+ 'peer_port_description': 'Eth0'},
+ 'source': 'switch-1.net.acme1.lab',
+ 'src_label': '100GE0/0/13',
+ 'target': {'id': 'CSW31'},
+ 'trgt_label': ''},
+ {'data': {'chassis_id': '9c:e1:76:9d:11:23',
+ 'parent_interface': '-',
+ 'peer_port_description': 'HundredGigE0/0/1/0.12'},
+ 'source': 'switch-1.net.acme1.lab',
+ 'src_label': '100GE0/0/14',
+ 'target': {'id': 'nsw02-env1.env4208.net.acme1.lab'},
+ 'trgt_label': '100GE0/0/1/0.12'},
+ {'data': {'chassis_id': '9c:e1:76:9d:11:23',
+ 'parent_interface': '-',
+ 'peer_port_description': 'HundredGigE0/0/1/0.34'},
+ 'source': 'switch-1.net.acme1.lab',
+ 'src_label': '100GE0/0/15',
+ 'target': {'id': 'nsw02-env1.env4208.net.acme1.lab'},
+ 'trgt_label': '100GE0/0/1/0.34'}],
+ 'node_facts': {'system': {'chassis_id': '84:03:28:15:12:34',
+ 'description': 'Juniper '
+ 'Networks, '
+ 'Inc. '
+ 'ssm5123-64c '
+ 'Ethernet '
+ 'Switch, '
+ 'kernel '
+ 'JUNOS '
+ '12.2R3-S1.3, '
+ 'Build '
+ 'date: '
+ '2011-05-12 '
+ '12:34:56 '
+ 'UTC '
+ 'Copyright '
+ '(c) '
+ '1996-2021 '
+ 'Juniper '
+ 'Networks, '
+ 'Inc.'}}}}]
+
+# test_N2G_cli_l2_data_juniper()
\ No newline at end of file
diff --git a/test/test_platform_arista_eos.py b/test/test_platform_arista_eos.py
new file mode 100644
index 0000000..37cccf9
--- /dev/null
+++ b/test/test_platform_arista_eos.py
@@ -0,0 +1,25 @@
+import sys
+import pprint
+import logging
+
+sys.path.insert(0, "..")
+
+from ttp_templates import get_template
+from ttp import ttp
+
+logging.basicConfig(level=logging.INFO)
+
+def test_show_hostname():
+ with open(
+ "./mock_data/arista_eos_show_hostname.txt", "r"
+ ) as f:
+ data = f.read()
+ template = get_template(
+ platform="arista_eos", command="show hostname"
+ )
+ pprint.pprint(template)
+ parser = ttp(data=data, template=template)
+ parser.parse()
+ res = parser.result()
+ pprint.pprint(res)
+ assert res == [[[{'fqdn': 'ceos1', 'hostname': 'ceos1'}]]]
\ No newline at end of file
diff --git a/test/test_platform_cisco_xr.py b/test/test_platform_cisco_xr.py
index 2fc6313..b44069c 100644
--- a/test/test_platform_cisco_xr.py
+++ b/test/test_platform_cisco_xr.py
@@ -19,134 +19,147 @@ def test_cisco_ios_show_ip_ospf_database_router():
parser = ttp(data=data, template=template)
parser.parse()
res = parser.result()
- # pprint.pprint(res)
- assert res == [[{'isis_processes': {'100': {'LSP': [{'hostname': 'R1-X1',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '9',
- 'local_ip': '10.123.0.17',
- 'metric': '16777214',
- 'peer_intf_id': '50',
- 'peer_ip': '10.123.0.18',
- 'peer_name': 'R1-X2'},
- {'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '7',
- 'local_ip': '10.123.0.25',
- 'metric': '123',
- 'peer_intf_id': '53',
- 'peer_ip': '10.123.0.26',
- 'peer_name': 'R2-X1'}],
- 'lsp_id': 'R1-X1',
- 'networks': [{'metric': '0',
- 'network': '10.111.1.1/32'}],
- 'rid': '10.111.1.1'},
- {'hostname': 'R1-X2',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '48',
- 'local_ip': '10.123.0.33',
- 'metric': '456',
- 'peer_intf_id': '53',
- 'peer_ip': '10.123.0.34',
- 'peer_name': 'R2-X2'},
- {'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '50',
- 'local_ip': '10.123.0.18',
- 'metric': '123',
- 'peer_intf_id': '9',
- 'peer_ip': '10.123.0.17',
- 'peer_name': 'R1-X1'}],
- 'lsp_id': 'R1-X2',
- 'networks': [{'metric': '0',
- 'network': '10.111.1.2/32'}],
- 'rid': '10.111.1.2'}]},
- '200': {'LSP': [{'hostname': 'R1-X1',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'bw_kbit': '10000000',
- 'delay_avg_us': '1',
- 'delay_max_us': '1',
- 'delay_min_us': '1',
- 'delay_variation_us': '0',
- 'local_intf_id': '68',
- 'metric': '10',
- 'peer_intf_id': '57',
- 'peer_name': 'R2-X1',
- 'srv6_endx_sid': [{'algo': '0',
- 'args_length': '0',
- 'block_length': '32',
- 'func_length': '16',
- 'node_id_length': '16',
- 'sid': 'fdff:0:1:e000::'},
- {'algo': '128',
- 'args_length': '0',
- 'block_length': '32',
- 'func_length': '16',
- 'node_id_length': '16',
- 'sid': 'fdff:0:1001:e001::'}]}],
- 'lsp_id': 'R1-X1',
- 'networks': [{'metric': '0',
- 'network': 'fddd:2:c101::1/128'},
- {'metric': '1',
- 'network': 'fdff:0:1::/48'},
- {'metric': '0',
- 'network': 'fdff:3::/36'},
- {'metric': '0',
- 'network': 'fdff::/36'}],
- 'rid': 'fddd:2:c101::1',
- 'srv6_locators': [{'algo': '0',
- 'locator': 'fdff:0:1::',
- 'mask': '48'},
- {'algo': '128',
- 'locator': 'fdff:0:1001::',
- 'mask': '48'}]},
- {'hostname': 'R1-X2',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'bw_kbit': '10000000',
- 'delay_avg_us': '1',
- 'delay_max_us': '1',
- 'delay_min_us': '1',
- 'delay_variation_us': '0',
- 'local_intf_id': '68',
- 'metric': '10',
- 'peer_intf_id': '60',
- 'peer_name': 'R2-X2',
- 'srv6_endx_sid': [{'algo': '0',
- 'args_length': '0',
- 'block_length': '32',
- 'func_length': '16',
- 'node_id_length': '16',
- 'sid': 'fdff:0:2:e000::'},
- {'algo': '128',
- 'args_length': '0',
- 'block_length': '32',
- 'func_length': '16',
- 'node_id_length': '16',
- 'sid': 'fdff:0:4444:e001::'}]}],
- 'lsp_id': 'R1-X2',
- 'networks': [{'metric': '0',
- 'network': 'fdff::/36'},
- {'metric': '1',
- 'network': 'fdff:0:2::/48'},
- {'metric': '0',
- 'network': 'fdff:2::/36'},
- {'metric': '0',
- 'network': 'fdff:3::/36'},
- {'metric': '0',
- 'network': 'fddd:2:c101::2/128'}],
- 'rid': 'fddd:2:c101::2',
- 'srv6_locators': [{'algo': '0',
- 'locator': 'fdff:0:2::',
- 'mask': '48'},
- {'algo': '128',
- 'locator': 'fdff:0:4444::',
- 'mask': '48'}]}]}}}]]
+ pprint.pprint(res)
+ assert res == [[{'isis_processes': {'100': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': 'Level-2',
+ 'links': [{'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '9',
+ 'local_ip': '10.123.0.17',
+ 'metric': '16777214',
+ 'peer_intf_id': '50',
+ 'peer_ip': '10.123.0.18',
+ 'peer_name': 'R1-X2'},
+ {'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '7',
+ 'local_ip': '10.123.0.25',
+ 'metric': '123',
+ 'peer_intf_id': '53',
+ 'peer_ip': '10.123.0.26',
+ 'peer_name': 'R2-X1'}],
+ 'networks': [{'isis_pid': '100',
+ 'metric': '0',
+ 'network': '10.111.1.1/32'}],
+ 'rid': '10.111.1.1'}],
+ 'R1-X2': [{'isis_area': '49.0001',
+ 'level': 'Level-2',
+ 'links': [{'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '48',
+ 'local_ip': '10.123.0.33',
+ 'metric': '456',
+ 'peer_intf_id': '53',
+ 'peer_ip': '10.123.0.34',
+ 'peer_name': 'R2-X2'},
+ {'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '50',
+ 'local_ip': '10.123.0.18',
+ 'metric': '123',
+ 'peer_intf_id': '9',
+ 'peer_ip': '10.123.0.17',
+ 'peer_name': 'R1-X1'}],
+ 'networks': [{'isis_pid': '100',
+ 'metric': '0',
+ 'network': '10.111.1.2/32'}],
+ 'rid': '10.111.1.2'}]},
+ '200': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': 'Level-2',
+ 'links': [{'bw_kbit': '10000000',
+ 'delay_avg_us': '1',
+ 'delay_max_us': '1',
+ 'delay_min_us': '1',
+ 'delay_variation_us': '0',
+ 'isis_pid': '200',
+ 'local_intf_id': '68',
+ 'metric': '10',
+ 'peer_intf_id': '57',
+ 'peer_name': 'R2-X1',
+ 'srv6_endx_sid': [{'algo': '0',
+ 'args_length': '0',
+ 'block_length': '32',
+ 'func_length': '16',
+ 'node_id_length': '16',
+ 'sid': 'fdff:0:1:e000::'},
+ {'algo': '128',
+ 'args_length': '0',
+ 'block_length': '32',
+ 'func_length': '16',
+ 'node_id_length': '16',
+ 'sid': 'fdff:0:1001:e001::'}]}],
+ 'networks': [{'isis_pid': '200',
+ 'metric': '0',
+ 'network': 'fddd:2:c101::1/128'},
+ {'isis_pid': '200',
+ 'metric': '1',
+ 'network': 'fdff:0:1::/48'},
+ {'isis_pid': '200',
+ 'metric': '0',
+ 'network': 'fdff:3::/36'},
+ {'isis_pid': '200',
+ 'metric': '0',
+ 'network': 'fdff::/36'}],
+ 'rid_v6': 'fddd:2:c101::1',
+ 'srv6_locators': [{'algo': '0',
+ 'isis_pid': '200',
+ 'locator': 'fdff:0:1::',
+ 'mask': '48'},
+ {'algo': '128',
+ 'isis_pid': '200',
+ 'locator': 'fdff:0:1001::',
+ 'mask': '48'}]}],
+ 'R1-X2': [{'isis_area': '49.0001',
+ 'level': 'Level-2',
+ 'links': [{'bw_kbit': '10000000',
+ 'delay_avg_us': '1',
+ 'delay_max_us': '1',
+ 'delay_min_us': '1',
+ 'delay_variation_us': '0',
+ 'isis_pid': '200',
+ 'local_intf_id': '68',
+ 'metric': '10',
+ 'peer_intf_id': '60',
+ 'peer_name': 'R2-X2',
+ 'srv6_endx_sid': [{'algo': '0',
+ 'args_length': '0',
+ 'block_length': '32',
+ 'func_length': '16',
+ 'node_id_length': '16',
+ 'sid': 'fdff:0:2:e000::'},
+ {'algo': '128',
+ 'args_length': '0',
+ 'block_length': '32',
+ 'func_length': '16',
+ 'node_id_length': '16',
+ 'sid': 'fdff:0:4444:e001::'}]}],
+ 'networks': [{'isis_pid': '200',
+ 'metric': '0',
+ 'network': 'fdff::/36'},
+ {'isis_pid': '200',
+ 'metric': '1',
+ 'network': 'fdff:0:2::/48'},
+ {'isis_pid': '200',
+ 'metric': '0',
+ 'network': 'fdff:2::/36'},
+ {'isis_pid': '200',
+ 'metric': '0',
+ 'network': 'fdff:3::/36'},
+ {'isis_pid': '200',
+ 'metric': '0',
+ 'network': 'fddd:2:c101::2/128'}],
+ 'rid_v6': 'fddd:2:c101::2',
+ 'srv6_locators': [{'algo': '0',
+ 'isis_pid': '200',
+ 'locator': 'fdff:0:2::',
+ 'mask': '48'},
+ {'algo': '128',
+ 'isis_pid': '200',
+ 'locator': 'fdff:0:4444::',
+ 'mask': '48'}]}]}}}]]
# test_cisco_ios_show_ip_ospf_database_router()
\ No newline at end of file
diff --git a/test/test_platform_juniper.py b/test/test_platform_juniper.py
new file mode 100644
index 0000000..5598123
--- /dev/null
+++ b/test/test_platform_juniper.py
@@ -0,0 +1,41 @@
+import sys
+import pprint
+
+sys.path.insert(0, "..")
+
+from ttp_templates import get_template
+from ttp import ttp
+
+
+def test_juniper_juniper_show_isis_database_verbose_pipe_no_more():
+ with open(
+ "./mock_data/juniper_show_isis_database_verbose_pipe_no_more.txt", "r"
+ ) as f:
+ data = f.read()
+ template = get_template(
+ platform="juniper", command="show isis database verbose | no-more"
+ )
+ # print(template)
+ parser = ttp(data=data, template=template)
+ parser.parse()
+ res = parser.result()
+ pprint.pprint(res)
+ assert res == [[{'isis_processes': {'ISIS': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': '2',
+ 'links': [{'bw_gbit': '10',
+ 'local_intf_id': '332',
+ 'local_ip': '10.123.111.238',
+ 'metric': '20',
+ 'peer_intf_id': '461',
+ 'peer_ip': '10.123.111.237',
+ 'peer_name': 'R1-X2'}],
+ 'networks': [{'metric': '0',
+ 'network': '10.123.123.31/32'},
+ {'metric': '0',
+ 'network': '10.123.123.41/32'},
+ {'metric': '20',
+ 'network': '::ffff:10.123.111.236/126'}],
+ 'rid': '10.123.123.31',
+ 'rid_v6': '2001::10:123:123:31'}]}}}]]
+
+# test_juniper_juniper_show_isis_database_verbose_pipe_no_more()
\ No newline at end of file
diff --git a/ttp_templates/misc/N2G/cli_isis_data/juniper.txt b/ttp_templates/misc/N2G/cli_isis_data/juniper.txt
new file mode 100644
index 0000000..f36f98b
--- /dev/null
+++ b/ttp_templates/misc/N2G/cli_isis_data/juniper.txt
@@ -0,0 +1,12 @@
+
+Template to parse Juniper JunOS "show isis database extensive | no-more" output.
+
+
+
+# Starting with Netmiko 3.4.0 can use run_ttp method to populate this template with below commands output
+commands = [
+ "show isis database extensive | no-more",
+]
+
+
+
\ No newline at end of file
diff --git a/ttp_templates/misc/N2G/cli_l2_data/cisco_xr.txt b/ttp_templates/misc/N2G/cli_l2_data/cisco_xr.txt
index 72b2556..a8125c6 100644
--- a/ttp_templates/misc/N2G/cli_l2_data/cisco_xr.txt
+++ b/ttp_templates/misc/N2G/cli_l2_data/cisco_xr.txt
@@ -3,8 +3,16 @@
This template designed to parse Cisco IOSXR configuration and CDP and LLDP neighbors.
+Commands parsed:
+
+- show lldp - to extract local hostname
+- show lldp neighbors detail - to extract LLDP neighbors
+- show running-config interface - to extract interfaces description and LAGs
+- show cdp neighbors detail - show extract CDP neighbors
+- show interfaces - to extract interface state to add all connected nodes
+
local_hostname="gethostname"
@@ -13,8 +21,27 @@ def check_is_physical_port(data):
if data.startswith(item) and not "." in item:
return data, {"is_physical_port": True}
return data
+
+def add_lldp_target_id(data):
+ """
+ Some LLDP peers output does not contain System Name, this macro
+ is to make sure we assign chassis_id as target.id in that case.
+ """
+ if (
+ not data.get("target", {}).get("id") and
+ data.get("data", {}).get("chassis_id")
+ ):
+ data.setdefault("target", {})
+ data["target"]["id"] = data["data"]["chassis_id"]
+ return data
+
+
+Global LLDP information: {{ _start_ }}
+ LLDP System Name: {{ local_hostname | record("local_hostname") }}
+
+
interface {{ interface | resuball(IfsNormalize) }}
@@ -45,15 +72,24 @@ interface {{ interface | resuball(IfsNormalize) }}
-
+
Local Interface: {{ src_label | resuball(IfsNormalize) }}
Chassis id: {{ data.chassis_id }}
Port id: {{ trgt_label | ORPHRASE | resuball(IfsNormalize) }}
Port Description: {{ data.peer_port_description | re(".+") }}
-System Name: {{ target.id | split(".") | item(0) | split("(") | item(0) }}
+System Name: {{ target.id | split("(") | item(0) }}
+System Name: {{ data.peer_system_name | PHRASE }}
System Capabilities: {{ data.peer_capabilities | ORPHRASE }}
IPv4 address: {{ target.top_label }}
{{ source | set("local_hostname") }}
+
+
+System Description: {{ _start_ }}
+ {{ peer_system_description | ORPHRASE | contains(",") }}
+{{ peer_system_description | ORPHRASE | contains(",") }}
+{{ _end_ }}
+
+
diff --git a/ttp_templates/misc/N2G/cli_l2_data/juniper.txt b/ttp_templates/misc/N2G/cli_l2_data/juniper.txt
new file mode 100644
index 0000000..8648c5c
--- /dev/null
+++ b/ttp_templates/misc/N2G/cli_l2_data/juniper.txt
@@ -0,0 +1,81 @@
+
+
+
+This template designed to parse Juniper JunOS configuration and LLDP neighbors.
+
+Commands parsed:
+
+- show lldp local-information - to extract local hostname
+- show lldp neighbors - to extract LLDP neighbors
+- show configuration interfaces | display set | no-more - to extract interfaces confgiuration and LAG details
+- show interfaces detail | no-more - to extract interfaces state to add all connected devices
+
+
+
+commands = [
+ "show lldp local-information",
+ "show lldp neighbors",
+ "show configuration interfaces | display set | no-more",
+ "show interfaces detail | no-more",
+]
+
+
+
+local_hostname="gethostname"
+
+
+def check_is_physical_port(data):
+ for item in _ttp_["vars"]["physical_ports"]:
+ if data.startswith(item) and not "." in item:
+ return data, {"is_physical_port": True}
+ return data
+
+def extract_lldp_peer(data):
+ if " " in data["info"]:
+ *port_info, peer_name = data.pop("info").split(" ")
+ data["data.peer_port_description"] = " ".join(port_info).strip()
+ else:
+ port_info, peer_name = data.pop("info"), data["data.chassis_id"]
+ data["data.peer_port_description"] = port_info
+
+ data["target.id"] = peer_name
+ data["trgt_label"] = ""
+
+ # check if port_info is name of the interface, use it as link trgt_label
+ if len(port_info) == 1 and not port_info[0].isdigit():
+ data["trgt_label"], _ = _ttp_["match"]["resuball"](port_info[0], "IfsNormalize")
+
+
+
+
+LLDP Local Information details {{ _start_ }}
+Chassis ID : {{ chassis_id }}
+System name : {{ local_hostname | record(local_hostname) }}
+System descr : {{ description | PHRASE }}
+
+{{ interface | resuball(IfsNormalize) }} {{ parent }} {{ id | DIGIT }} {{ description | ORPHRASE }} {{ status }}
+
+
+
+
+
+set interfaces {{ interface | resuball(IfsNormalize) }} description "{{ description | re(".+") }}"
+set interfaces {{ interface | resuball(IfsNormalize) }} ether-options 802.3ad {{ lag_id | DIGIT }}
+set interfaces {{ interface | resuball(IfsNormalize) }} mtu {{ mtu }}
+set interfaces {{ interface | resuball(IfsNormalize) }} aggregated-ether-options lacp {{ lag_mode }}
+
+
+
+
+Physical interface: {{ interface | _start_ | resuball(IfsNormalize) | macro("check_is_physical_port") }}, {{ admin | ORPHRASE }}, Physical link is {{ line | ORPHRASE }}
+ Description: {{ description | re(".+") }}
+ Link-level type: Ethernet, MTU: {{ mtu }}, Speed: {{ bw_gbits }}Gbps, {{ ignore(PHRASE) }}
+ Current address: {{ mac }}, Hardware address: {{ ignore }}
+
+
+
+
+{{ src_label | resuball(IfsNormalize) }} {{ data.parent_interface }} {{ data.chassis_id | MAC }} {{ info | re(".+") }}
+{{ source | set("local_hostname") }}
+
+
\ No newline at end of file
diff --git a/ttp_templates/misc/Netmiko/cisco.ios.cfg.ip.txt b/ttp_templates/misc/Netmiko/cisco.ios.cfg.ip.txt
index 283c1b6..688de3a 100644
--- a/ttp_templates/misc/Netmiko/cisco.ios.cfg.ip.txt
+++ b/ttp_templates/misc/Netmiko/cisco.ios.cfg.ip.txt
@@ -6,6 +6,7 @@ on device's interfaces including secondary and VRRP/HSRP IP addresses.
Output is a list of dictionaries.
Sample data:
+
```
r1#show run | sec interface
interface GigabitEthernet1
@@ -22,6 +23,7 @@ interface GigabitEthernet1
```
Sample results, structure="flat_list":
+
```
[
{
@@ -44,6 +46,7 @@ Sample results, structure="flat_list":
```
Template can be invoked using Netmiko run_ttp method like this:
+
```
import pprint
from netmiko import ConnectHandler
diff --git a/ttp_templates/platform/cisco_xr_show_isis_database_verbose.txt b/ttp_templates/platform/cisco_xr_show_isis_database_verbose.txt
index d73b9de..2d5d282 100644
--- a/ttp_templates/platform/cisco_xr_show_isis_database_verbose.txt
+++ b/ttp_templates/platform/cisco_xr_show_isis_database_verbose.txt
@@ -4,92 +4,53 @@ Template to parse ISIS LSDB of Cisco IOS-XR devices out of
This template produces this structure:
```
-[[{'isis_processes': {'100': {'LSP': [{'hostname': 'R1-X1',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '9',
- 'local_ip': '10.123.0.17',
- 'metric': '16777214',
- 'peer_intf_id': '50',
- 'peer_ip': '10.123.0.18',
- 'peer_name': 'R1-X2'}],
- 'lsp_id': 'R1-X1',
- 'networks': [{'metric': '0',
- 'network': '10.111.1.1/32'}],
- 'rid': '10.111.1.1'},
- {'hostname': 'R1-X2',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'affinity': '0x00000000',
- 'bw_kbit': '10000000',
- 'local_intf_id': '48',
- 'local_ip': '10.123.0.33',
- 'metric': '456',
- 'peer_intf_id': '53',
- 'peer_ip': '10.123.0.34',
- 'peer_name': 'R2-X2'}],
- 'lsp_id': 'R1-X2',
- 'networks': [{'metric': '0',
- 'network': '10.111.1.2/32'}],
- 'rid': '10.111.1.2'}]},
- '200': {'LSP': [{'hostname': 'R1-X1',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'bw_kbit': '10000000',
- 'delay_avg_us': '1',
- 'delay_max_us': '1',
- 'delay_min_us': '1',
- 'delay_variation_us': '0',
- 'local_intf_id': '68',
- 'metric': '10',
- 'peer_intf_id': '57',
- 'peer_name': 'R2-X1'}],
- 'lsp_id': 'R1-X1',
- 'networks': [{'metric': '0',
- 'network': 'fddd:2:c101::1/128'},,
- 'rid': 'fddd:2:c101::1'},
- {'hostname': 'R1-X2',
- 'isis_area': '49.0001',
- 'level': 'Level-2',
- 'links': [{'bw_kbit': '10000000',
- 'delay_avg_us': '1',
- 'delay_max_us': '1',
- 'delay_min_us': '1',
- 'delay_variation_us': '0',
- 'local_intf_id': '68',
- 'metric': '10',
- 'peer_intf_id': '60',
- 'peer_name': 'R2-X2'}],
- 'lsp_id': 'R1-X2',
- 'networks': [{'metric': '0',
- 'network': 'fdff::/36'}],
- 'rid': 'fddd:2:c101::2'}]}}}]]
+[[{'isis_processes': {'100': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': 'Level-2',
+ 'links': [{'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '9',
+ 'local_ip': '10.123.0.17',
+ 'metric': '16777214',
+ 'peer_intf_id': '50',
+ 'peer_ip': '10.123.0.18',
+ 'peer_name': 'R1-X2'},
+ {'affinity': '0x00000000',
+ 'bw_kbit': '10000000',
+ 'isis_pid': '100',
+ 'local_intf_id': '7',
+ 'local_ip': '10.123.0.25',
+ 'metric': '123',
+ 'peer_intf_id': '53',
+ 'peer_ip': '10.123.0.26',
+ 'peer_name': 'R2-X1'}],
+ 'networks': [{'isis_pid': '100',
+ 'metric': '0',
+ 'network': '10.111.1.1/32'}],
+ 'rid': '10.111.1.1'}]}}}]]
```
-
+
IS-IS {{ pid }} ({{ level }}) Link State Database
-
-{{ lsp_id | _start_ }}.00-00 * {{ ignore }} {{ ignore }} 65487/* 0/0/0
-{{ lsp_id | _start_ }}.00-00 {{ ignore }} {{ ignore }} 64768/65535 0/0/0
-{{ lsp_id | _start_ }}.00-00* {{ ignore }} {{ ignore }} 65487/* 0/0/0
+
+{{ hostname | _start_ }}.00-00{{ ignore(r"[\s\*]") }} {{ ignore }} {{ ignore }} {{ ignore(r"[/\d\s\*]+") }} 0/0/0
+{{ hostname | _start_ }}.00-00{{ ignore(r"[\s\*]") }} * {{ ignore }} {{ ignore }} {{ ignore(r"[/\d\s\*]+") }} 0/0/0
+
Auth: {{ auth }}, Length: 17
Area Address: {{ isis_area }}
Router ID: {{ rid }}
- Hostname: {{ hostname }}
- IPv6 Address: {{ rid }}
- IPv6 Router ID: {{ rid }}
-
-
+ IPv6 Router ID: {{ rid_v6 }}
+ IPv6 Router ID: {{ rid_v6 }}
+
+
Metric: {{ metric | _start_ }} IP-Extended {{ network }}
Metric: {{ metric | _start_ }} MT (IPv6 Unicast) IPv6 {{ network | _exact_ }}
Metric: {{ metric | _start_ }} MT (IPv6 Unicast) IPv6-Ext-InAr {{ network | _exact_ }}
-
+
Metric: {{ metric | _start_ }} IS-Extended {{ peer_name }}.00
Metric: {{ metric | _start_ }} MT (IPv6 Unicast) IS-Extended {{ peer_name }}.00
Local Interface ID: {{ local_intf_id }}, Remote Interface ID: {{ peer_intf_id }}
@@ -103,10 +64,10 @@ IS-IS {{ pid }} ({{ level }}) Link State Database
END.X SID: {{ sid | IPV6}} B:0 S:0 P:0 uA (PSP/USD) Alg:{{ algo }}
Block Length: {{ block_length }}, Node-ID Length: {{ node_id_length }}, Func-Length: {{ func_length }}, Args-Length: {{ args_length }}
-
+
-
+
SRv6 Locator: MT (IPv6 Unicast) {{ locator | IPV6 }}/{{ mask }} D:0 Metric: 0 Algorithm: {{ algo }}
diff --git a/ttp_templates/platform/juniper_show_isis_database_verbose_pipe_no_more.txt b/ttp_templates/platform/juniper_show_isis_database_verbose_pipe_no_more.txt
new file mode 100644
index 0000000..1a2c662
--- /dev/null
+++ b/ttp_templates/platform/juniper_show_isis_database_verbose_pipe_no_more.txt
@@ -0,0 +1,114 @@
+
+Template to parse ISIS LSDB of Juniper JunOS devices out of
+"show isis database extensive | no-more" command output.
+
+For this sample data:
+```
+IS-IS level 2 link-state database:
+
+R1-X1.00-00 Sequence: 0x22425, Checksum: 0x8904, Lifetime: 463 secs
+ IS neighbor: R1-X2.00 Metric: 20
+ Two-way fragment: R1-X2.00-00, Two-way first fragment: R1-X2.00-00
+ IP prefix: 10.123.123.31/32 Metric: 0 Internal Up
+ IP prefix: 10.123.123.41/32 Metric: 0 Internal Up
+ V6 prefix: ::ffff:10.123.111.236/126 Metric: 20 Internal Up
+
+ Header: LSP ID: R1-X1.00-00, Length: 233 bytes
+ Allocated length: 284 bytes, Router ID: 10.123.123.31
+ Remaining lifetime: 463 secs, Level: 2, Interface: 80
+ Estimated free bytes: 51, Actual free bytes: 51
+ Aging timer expires in: 463 secs
+ Protocols: IP, IPv6
+
+ Packet: LSP ID: R1-X1.00-00, Length: 233 bytes, Lifetime : 1194 secs
+ Checksum: 0x8904, Sequence: 0x22425, Attributes: 0x3 L1 L2
+ NLPID: 0x83, Fixed length: 27 bytes, Version: 1, Sysid length: 0 bytes
+ Packet type: 20, Packet version: 1, Max area: 0
+
+ TLVs:
+ Area address: 49.0001 (3)
+ LSP Buffer Size: 1492
+ Speaks: IP
+ Speaks: IPV6
+ IP router id: 10.123.123.31
+ IP address: 10.123.123.31
+ IPv6 TE Router ID: 2001::10:123:123:31
+ Hostname: R1-X1
+ Extended IS Reachability TLV, Type: 22, Length: 85
+ IS extended neighbor: R1-X2.00, Metric: default 20 SubTLV len: 74
+ IP address: 10.123.111.238
+ Neighbor's IP address: 10.123.111.237
+ Local interface index: 332, Remote interface index: 461
+ Current reservable bandwidth:
+ Priority 0 : 7Gbps
+ Priority 1 : 7Gbps
+ Priority 2 : 7Gbps
+ Priority 3 : 7Gbps
+ Priority 4 : 7Gbps
+ Priority 5 : 7Gbps
+ Priority 6 : 6.7Gbps
+ Priority 7 : 6.7Gbps
+ Maximum reservable bandwidth: 7Gbps
+ Maximum bandwidth: 10Gbps
+ Administrative groups: 0 none
+ IPv6 prefix: ::ffff:10.123.111.236/126 Metric 20 Up
+ IP extended prefix: 10.123.123.31/32 metric 0 up
+ IP extended prefix: 10.123.123.41/32 metric 0 up
+ IP extended prefix: 10.123.111.236/30 metric 20 up
+ IP address: 10.123.123.41
+ Authentication data: 17 bytes
+ No queued transmissions
+```
+
+This template produces this result:
+```
+[[{'isis_processes': {'ISIS': {'R1-X1': [{'isis_area': '49.0001',
+ 'level': '2',
+ 'links': [{'bw_gbit': '10',
+ 'local_intf_id': '332',
+ 'local_ip': '10.123.111.238',
+ 'metric': '20',
+ 'peer_intf_id': '461',
+ 'peer_ip': '10.123.111.237',
+ 'peer_name': 'R1-X2'}],
+ 'networks': [{'metric': '0',
+ 'network': '10.123.123.31/32'},
+ {'metric': '0',
+ 'network': '10.123.123.41/32'},
+ {'metric': '20',
+ 'network': '::ffff:10.123.111.236/126'}],
+ 'rid': '10.123.123.31',
+ 'rid_v6': '2001::10:123:123:31'}]}}}]]
+```
+
+Notes:
+
+- Process ID (PID) always set to `ISIS` value as PID does not present in
+ "show isis database extensive | no-more" command output on Juniper devices.
+
+
+
+IS-IS level {{ level }} link-state database:
+
+
+{{ hostname }}.00-00 Sequence: {{ ignore }}, Checksum: {{ ignore }}, Lifetime: {{ ignore }} secs
+
+ Area address: {{ isis_area }} (3)
+ IP router id: {{ rid }}
+ IPv6 TE Router ID: {{ rid_v6 }}
+
+
+ IP prefix: {{ network }} Metric: {{ metric | _start_ }} Internal Up
+ V6 prefix: {{ network }} Metric: {{ metric | _start_ }} Internal Up
+
+
+
+ IS extended neighbor: {{ peer_name }}.00, Metric: default {{ metric | _start_ }} SubTLV len: 74
+ IP address: {{ local_ip }}
+ Neighbor's IP address: {{ peer_ip }}
+ Local interface index: {{ local_intf_id }}, Remote interface index: {{ peer_intf_id }}
+ Maximum bandwidth: {{ bw_gbit }}Gbps
+
+
+
+
\ No newline at end of file
diff --git a/ttp_templates/ttp_vars.py b/ttp_templates/ttp_vars.py
index 1edfe42..2330895 100644
--- a/ttp_templates/ttp_vars.py
+++ b/ttp_templates/ttp_vars.py
@@ -15,17 +15,17 @@
'Fddi': ['^Fddi', '^FD'],
'50GE': ['^FiftyGigabitEthernet', '^FiftyGigEthernet', '^FiftyGigEth', '^FiftyGigE', '^FI', '^Fi', '^fi'],
'40GE': ['^FortyGigabitEthernet', '^FortyGigEthernet', '^FortyGigEth', '^FortyGigE', '^FortyGig', '^FGE', '^FO', '^Fo', '^40GE'],
- '400GE': ['^FourHundredGigabitEthernet', '^FourHundredGigEthernet', '^FourHundredGigEth', '^FourHundredGigE', '^FourHundredGig', '^F', '^f'],
- 'GE': ['^GigabitEthernet', '^GigEthernet', '^GigEth', '^GigE', '^Gig', '^GE', '^Ge', '^ge', '^Gi', '^gi'],
- '100GE': ['^HundredGigabitEthernet', '^HundredGigEthernet', '^HundredGigEth', '^HundredGigE', '^HundredGig', '^Hu'],
+ '400GE': ['^FourHundredGigabitEthernet', '^FourHundredGigEthernet', '^FourHundredGigEth', '^FourHundredGigE', '^FourHundredGig'],
+ 'GE': ['^GigabitEthernet', '^GigEthernet', '^GigEth', '^GigE', '^Gig', '^GE', '^Ge', '^ge-', '^ge', '^Gi', '^gi'],
+ '100GE': ['^HundredGigabitEthernet', '^HundredGigEthernet', '^HundredGigEth', '^HundredGigE', '^HundredGig', '^Hu', '^et-'],
'Lo': ['^Loopback', '^loopback', '^LoopBack', '^lo'],
- 'MGMT': ['^MgmtEth', '^Management', '^Mgmt', '^mgmt', '^Ma', '^MEth'],
+ 'MGMT': ['^MgmtEth', '^Management', '^Mgmt', '^mgmt', '^Ma', '^MEth', '^fxp'],
'Multilink': ['^Multilink', '^Mu'],
'POS': ['^POS', '^PO'],
- 'LAG': ['^PortChannel', '^Port-channel', '^Port-Channel', '^port-channel', '^po', '^Po', "^Bundle-Ether", "^BE", "^Eth-Trunk"],
+ 'LAG': ['^PortChannel', '^Port-channel', '^Port-Channel', '^port-channel', '^po', '^Po', "^Bundle-Ether", "^BE", "^Eth-Trunk", "^ae"],
'Serial': ['^Serial', '^Se', '^S'],
- 'Te': ['^TenGigabitEthernet', '^TenGigEthernet', '^TenGigEth', '^TenGigE', '^TenGig', '^TeGig', '^Ten', '^te', '^XGigabitEthernet', '^TenGe', '^10GE'],
- 'Tunnel': ['^Tunnel', '^Tun', '^Tu'],
+ 'Te': ['^TenGigabitEthernet', '^TenGigEthernet', '^TenGigEth', '^TenGigE', '^TenGig', '^TeGig', '^Ten', '^te', '^XGigabitEthernet', '^TenGe', '^10GE', '^xe-'],
+ 'Tunnel': ['^Tunnel', '^Tun', '^Tu', '^gr-'],
'25GE': ['^TwentyFiveGigabitEthernet', '^TwentyFiveGigEthernet', '^TwentyFiveGigEth', '^TwentyFiveGigE', '^TwentyFiveGig', '^Twe', '^TF', '^Tf', '^tf'],
'2GE': ['^Tw', '^Two'],
'200GE': ['^TwoHundredGigabitEthernet', '^TwoHundredGigEthernet', '^TwoHundredGigEth', '^TwoHundredGigE', '^TwoHundredGig', '^TH', '^Th', '^th'],